mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-03 10:18:42 +00:00
TUN & WireGuard inbounds: Ignore b.UDP's domain when receiving it from outbound (#6285)
Fixes https://github.com/XTLS/Xray-core/issues/6279
This commit is contained in:
+19
-11
@@ -98,18 +98,22 @@ type udpConn struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
||||||
e, ok := <-c.egress
|
for {
|
||||||
if !ok {
|
e, ok := <-c.egress
|
||||||
return nil, io.EOF
|
if !ok {
|
||||||
}
|
return nil, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
b := buf.New()
|
b := buf.New()
|
||||||
if _, err := b.Write(e.data); err != nil {
|
if _, err := b.Write(e.data); err != nil {
|
||||||
return nil, err
|
errors.LogErrorInner(context.Background(), err, "drop packet to ", e.dest, " with size ", len(e.data))
|
||||||
}
|
b.Release()
|
||||||
b.UDP = e.dest
|
continue
|
||||||
|
}
|
||||||
|
b.UDP = e.dest
|
||||||
|
|
||||||
return buf.MultiBuffer{b}, nil
|
return buf.MultiBuffer{b}, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read packets from the connection
|
// Read packets from the connection
|
||||||
@@ -129,7 +133,11 @@ func (c *udpConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||||||
for i, b := range mb {
|
for i, b := range mb {
|
||||||
dst := c.dst
|
dst := c.dst
|
||||||
if b.UDP != nil {
|
if b.UDP != nil {
|
||||||
dst = *b.UDP
|
if b.UDP.Address.Family().IsDomain() {
|
||||||
|
errors.LogError(context.Background(), "impossible domain packet ", b.UDP, " reply via original target ", dst)
|
||||||
|
} else {
|
||||||
|
dst = *b.UDP
|
||||||
|
}
|
||||||
}
|
}
|
||||||
err := c.handler.writePacket(b.Bytes(), dst, c.src)
|
err := c.handler.writePacket(b.Bytes(), dst, c.src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+21
-13
@@ -345,19 +345,23 @@ type udpConn struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
||||||
q, ok := <-c.queue
|
for {
|
||||||
if !ok {
|
q, ok := <-c.queue
|
||||||
return nil, io.EOF
|
if !ok {
|
||||||
|
return nil, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
b := buf.New()
|
||||||
|
if _, err := b.Write(q.p); err != nil {
|
||||||
|
errors.LogErrorInner(context.Background(), err, "drop packet to ", q.dest, " with size ", len(q.p))
|
||||||
|
b.Release()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
b.UDP = q.dest
|
||||||
|
|
||||||
|
return buf.MultiBuffer{b}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
b := buf.New()
|
|
||||||
if _, err := b.Write(q.p); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
b.UDP = q.dest
|
|
||||||
|
|
||||||
return buf.MultiBuffer{b}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) Read(p []byte) (int, error) {
|
func (c *udpConn) Read(p []byte) (int, error) {
|
||||||
@@ -376,7 +380,11 @@ func (c *udpConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||||||
for i, b := range mb {
|
for i, b := range mb {
|
||||||
dst := c.dst
|
dst := c.dst
|
||||||
if b.UDP != nil {
|
if b.UDP != nil {
|
||||||
dst = *b.UDP
|
if b.UDP.Address.Family().IsDomain() {
|
||||||
|
errors.LogError(context.Background(), "impossible domain packet ", b.UDP, " reply via original target ", dst)
|
||||||
|
} else {
|
||||||
|
dst = *b.UDP
|
||||||
|
}
|
||||||
}
|
}
|
||||||
err := c.writeFunc(b.Bytes(), dst, c.src)
|
err := c.writeFunc(b.Bytes(), dst, c.src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user