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)