侧边栏壁纸
博主头像
莫伤心の世界 博主等级

一个不专业写代码却沉浸在代码世界的人

  • 累计撰写 23 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

tun2socks开发记录

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

评论区