mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2024-11-14 21:31:16 +08:00
chore: linux ipv6 REDIRECT (#311)
This commit is contained in:
parent
22414ce399
commit
63922f86a2
@ -29,6 +29,9 @@ func parserPacket(conn net.Conn) (socks5.Addr, error) {
|
||||
|
||||
rc.Control(func(fd uintptr) {
|
||||
addr, err = getorigdst(fd)
|
||||
if err != nil {
|
||||
addr, err = getorigdst6(fd)
|
||||
}
|
||||
})
|
||||
|
||||
return addr, err
|
||||
@ -49,3 +52,17 @@ func getorigdst(fd uintptr) (socks5.Addr, error) {
|
||||
addr[1+net.IPv4len], addr[1+net.IPv4len+1] = port[0], port[1]
|
||||
return addr, nil
|
||||
}
|
||||
|
||||
func getorigdst6(fd uintptr) (socks5.Addr, error) {
|
||||
raw := syscall.RawSockaddrInet6{}
|
||||
siz := uint32(unsafe.Sizeof(raw))
|
||||
if err := socketcall(GETSOCKOPT, fd, syscall.IPPROTO_IPV6, IP6T_SO_ORIGINAL_DST, uintptr(unsafe.Pointer(&raw)), uintptr(unsafe.Pointer(&siz)), 0); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
addr := make([]byte, 1+net.IPv6len+2)
|
||||
addr[0] = socks5.AtypIPv6
|
||||
copy(addr[1:1+net.IPv6len], raw.Addr[:])
|
||||
port := (*[2]byte)(unsafe.Pointer(&raw.Port)) // big-endian
|
||||
addr[1+net.IPv6len], addr[1+net.IPv6len+1] = port[0], port[1]
|
||||
return addr, nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user