tun2socks开发记录

tun2socks开发记录

mohuangNPC
2026-07-22 / 0 评论 / 1 阅读 / 正在检测是否收录...

1.Dial绑定网卡后卡住的问题

func setSocketOptions(network, address string, c syscall.RawConn, opts *Options) (err error) {
    if opts == nil || !isTCPSocket(network) && !isUDPSocket(network) {
        return
    }
    var innerErr error
    err = c.Control(func(fd uintptr) {
        host, _, _ := net.SplitHostPort(address)
        if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() {
            return
        }

        if opts.InterfaceName == "" && opts.InterfaceIndex != 0 {
            if iface, err := net.InterfaceByIndex(opts.InterfaceIndex); err == nil {
                opts.InterfaceName = iface.Name
                log.Info().Msgf("成功设置: %v", opts.InterfaceIndex)
            }
        }

        if opts.InterfaceName != "" {
            if innerErr = unix.BindToDevice(int(fd), opts.InterfaceName); innerErr != nil {
                return
            }
            log.Info().Msgf("成功设置: %v", opts.InterfaceName)
        }
        if opts.RoutingMark != 0 {
            if innerErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_MARK, opts.RoutingMark); innerErr != nil {
                return
            }
        }
    })

    if innerErr != nil {
        err = innerErr
    }
    return
}

如上代码,linux中,t2s开发时,会遇到本地回环问题,而上面的代码是主要是为了解决本地回环,将连接直接绑死在某个网卡,强制某个网卡发送,而不会被全局路由到,但是可能出现

conn, err := dialer.Dial("tcp", address+":"+port)

一直卡在这段代码的情况,原因之一是因为rp_filter 丢包,服务器执行命令:

sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.ens33.rp_filter=0 //ens33应该是每台服务器可能不一样

即可解决

原因

需要关闭 Linux 的 反向路径过滤(Reverse Path Filtering,RPF / rp_filter)。

2.DNS下FakeIP问题

当我们设置路由,让所有流量走自定义网卡时,此时dns也会走,并且为了放置dns污染,有时候我们会使用fakeip功能,此时切记fakeip的网段也需要加入到路由表,
比如我的fakeip网段为172.25.0.0,则需要代码或者命令将网段加入到tun1,

ip route add 172.25.0.0/16 dev tun1

否则当你返回fakeip给t2s的时候,他会直接请求172网段,如果没有路由到tun1你是捕获不到的,他会默认发往default网卡

0

评论 (0)

取消