Skip to content

Commit da21a8f

Browse files
authored
TUN & WireGuard inbounds: Ignore b.UDP's domain when receiving it from outbound (#6285)
Fixes #6279
1 parent e10347b commit da21a8f

2 files changed

Lines changed: 38 additions & 22 deletions

File tree

proxy/tun/udp_fullcone.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,22 @@ type udpConn struct {
9898
}
9999

100100
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
101-
e, ok := <-c.egress
102-
if !ok {
103-
return nil, io.EOF
104-
}
101+
for {
102+
e, ok := <-c.egress
103+
if !ok {
104+
return nil, io.EOF
105+
}
105106

106-
b := buf.New()
107-
if _, err := b.Write(e.data); err != nil {
108-
return nil, err
109-
}
110-
b.UDP = e.dest
107+
b := buf.New()
108+
if _, err := b.Write(e.data); err != nil {
109+
errors.LogErrorInner(context.Background(), err, "drop packet to ", e.dest, " with size ", len(e.data))
110+
b.Release()
111+
continue
112+
}
113+
b.UDP = e.dest
111114

112-
return buf.MultiBuffer{b}, nil
115+
return buf.MultiBuffer{b}, nil
116+
}
113117
}
114118

115119
// Read packets from the connection
@@ -129,7 +133,11 @@ func (c *udpConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
129133
for i, b := range mb {
130134
dst := c.dst
131135
if b.UDP != nil {
132-
dst = *b.UDP
136+
if b.UDP.Address.Family().IsDomain() {
137+
errors.LogError(context.Background(), "impossible domain packet ", b.UDP, " reply via original target ", dst)
138+
} else {
139+
dst = *b.UDP
140+
}
133141
}
134142
err := c.handler.writePacket(b.Bytes(), dst, c.src)
135143
if err != nil {

proxy/wireguard/tun.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -345,19 +345,23 @@ type udpConn struct {
345345
}
346346

347347
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
348-
q, ok := <-c.queue
349-
if !ok {
350-
return nil, io.EOF
351-
}
348+
for {
349+
q, ok := <-c.queue
350+
if !ok {
351+
return nil, io.EOF
352+
}
352353

353-
b := buf.New()
354-
if _, err := b.Write(q.p); err != nil {
355-
return nil, err
356-
}
354+
b := buf.New()
355+
if _, err := b.Write(q.p); err != nil {
356+
errors.LogErrorInner(context.Background(), err, "drop packet to ", q.dest, " with size ", len(q.p))
357+
b.Release()
358+
continue
359+
}
357360

358-
b.UDP = q.dest
361+
b.UDP = q.dest
359362

360-
return buf.MultiBuffer{b}, nil
363+
return buf.MultiBuffer{b}, nil
364+
}
361365
}
362366

363367
func (c *udpConn) Read(p []byte) (int, error) {
@@ -376,7 +380,11 @@ func (c *udpConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
376380
for i, b := range mb {
377381
dst := c.dst
378382
if b.UDP != nil {
379-
dst = *b.UDP
383+
if b.UDP.Address.Family().IsDomain() {
384+
errors.LogError(context.Background(), "impossible domain packet ", b.UDP, " reply via original target ", dst)
385+
} else {
386+
dst = *b.UDP
387+
}
380388
}
381389
err := c.writeFunc(b.Bytes(), dst, c.src)
382390
if err != nil {

0 commit comments

Comments
 (0)