fix ipv6 for udp tproxy
This commit is contained in:
parent
4a4c64cc66
commit
2a75be91b0
@ -21,28 +21,27 @@ import (
|
|||||||
|
|
||||||
// https://github.com/KatelynHaworth/go-tproxy
|
// https://github.com/KatelynHaworth/go-tproxy
|
||||||
func (l *redirectListener) listenUDP(addr string) (*net.UDPConn, error) {
|
func (l *redirectListener) listenUDP(addr string) (*net.UDPConn, error) {
|
||||||
laddr, err := net.ResolveUDPAddr("udp", addr)
|
/*
|
||||||
if err != nil {
|
laddr, err := net.ResolveUDPAddr("udp", addr)
|
||||||
return nil, err
|
if err != nil {
|
||||||
}
|
return nil, err
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
lc := net.ListenConfig{
|
lc := net.ListenConfig{
|
||||||
Control: func(network, address string, c syscall.RawConn) error {
|
Control: func(network, address string, c syscall.RawConn) error {
|
||||||
return c.Control(func(fd uintptr) {
|
return c.Control(func(fd uintptr) {
|
||||||
if laddr.IP.To4() != nil {
|
if err := unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_TRANSPARENT, 1); err != nil {
|
||||||
if err := unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_TRANSPARENT, 1); err != nil {
|
l.logger.Errorf("SetsockoptInt(SOL_IP, IP_TRANSPARENT, 1): %v", err)
|
||||||
l.logger.Errorf("SetsockoptInt(SOL_IP, IP_TRANSPARENT, 1): %v", err)
|
}
|
||||||
}
|
if err := unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_RECVORIGDSTADDR, 1); err != nil {
|
||||||
if err := unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_RECVORIGDSTADDR, 1); err != nil {
|
l.logger.Errorf("SetsockoptInt(SOL_IP, IP_RECVORIGDSTADDR, 1): %v", err)
|
||||||
l.logger.Errorf("SetsockoptInt(SOL_IP, IP_RECVORIGDSTADDR, 1): %v", err)
|
}
|
||||||
}
|
if err := unix.SetsockoptInt(int(fd), unix.SOL_IPV6, unix.IPV6_TRANSPARENT, 1); err != nil {
|
||||||
} else {
|
l.logger.Errorf("SetsockoptInt(SOL_IPV6, IPV6_TRANSPARENT, 1): %v", err)
|
||||||
if err := unix.SetsockoptInt(int(fd), unix.SOL_IPV6, unix.IPV6_TRANSPARENT, 1); err != nil {
|
}
|
||||||
l.logger.Errorf("SetsockoptInt(SOL_IPV6, IPV6_TRANSPARENT, 1): %v", err)
|
if err := unix.SetsockoptInt(int(fd), unix.SOL_IPV6, unix.IPV6_RECVORIGDSTADDR, 1); err != nil {
|
||||||
}
|
l.logger.Errorf("SetsockoptInt(SOL_IPV6, IPV6_RECVORIGDSTADDR, 1): %v", err)
|
||||||
if err := unix.SetsockoptInt(int(fd), unix.SOL_IPV6, unix.IPV6_RECVORIGDSTADDR, 1); err != nil {
|
|
||||||
l.logger.Errorf("SetsockoptInt(SOL_IPV6, IPV6_RECVORIGDSTADDR, 1): %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -244,11 +243,14 @@ func udpAddrToSocketAddr(addr *net.UDPAddr) (unix.Sockaddr, error) {
|
|||||||
ip := [16]byte{}
|
ip := [16]byte{}
|
||||||
copy(ip[:], addr.IP.To16())
|
copy(ip[:], addr.IP.To16())
|
||||||
|
|
||||||
|
var err error
|
||||||
var zoneID uint64
|
var zoneID uint64
|
||||||
if addr.Zone != "" {
|
if addr.Zone != "" {
|
||||||
zoneID, _ = strconv.ParseUint(addr.Zone, 10, 32)
|
zoneID, err = strconv.ParseUint(addr.Zone, 10, 32)
|
||||||
if zoneID == 0 {
|
if err != nil {
|
||||||
zoneID = 2
|
if itf, _ := net.InterfaceByName(addr.Zone); itf != nil {
|
||||||
|
zoneID = uint64(itf.Index)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user