fix ipv6 for udp tproxy

This commit is contained in:
ginuerzh 2024-07-11 22:27:02 +08:00
parent 4a4c64cc66
commit 2a75be91b0

View File

@ -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)
}
} }
} }