Golang Go语言中 Mac 上如何实现在使用 utun 时再绑定网络出口?
以 wireguard 假设现在使用 wireguard 绑定到 utun5
再设定路由 0.0.0.0/1 128.0.0.0/1 再将服务端的 IP 路由指向 en0 此时可以正常使用,全局 IP 都变成了服务器的 IP
我想在此时能够再指定网卡 en0 进行拨号
先测试了(指定出口 IP ) dial, err := net.DialTCP("tcp", local, remote)
失败,提示错误 no route to host
然后测试了 (指定出口网卡)
dialer := &net.Dialer{
Control: func(network, address string, conn syscall.RawConn) error {
return conn.Control(func(fd uintptr) {
switch network {
case "tcp4", "udp4":
unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, bindIface.Index)
case "tcp6", "udp6":
unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, bindIface.Index)
}
})
},
}
依旧无效 此时提示错误:dial tcp xxxx:xxx: connect: network is unreachable
是不是没办法实现了。。。。。。
PS:以上两种测试 在不开启 utun 时 测试 en0 是正常的 在开启 utun 时 测试 utun 也是正常的
也就是同时只有一个出口可以正常得到响应
Golang Go语言中 Mac 上如何实现在使用 utun 时再绑定网络出口?
更多关于Golang Go语言中 Mac 上如何实现在使用 utun 时再绑定网络出口?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我感觉是路由的问题,你把 wireguard 的路由写成局域网,然后分别尝试局域网的地址和公网地址是否可以通过不同的网卡发出去。印象里,你在 wireguard 客户端里设置允许的 ip 段,写某一段和写 0.0.0.0/0➕某一段,会在影响虚拟网卡和物理网卡路由表顺序
更多关于Golang Go语言中 Mac 上如何实现在使用 utun 时再绑定网络出口?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
现在的情况是只要添加了路由走 utun5 的 IP 段 就没办法再使用 en0 发出去了 取消了自然可以的!或者说没有添加的部分就可以
好像 mac 的路由这里不支持多出口
对单个 IP 只能走物理网卡或者是虚拟网卡(根据路由确定)
不支持自定义
物理网卡的情况下没测试,或许有可能支持吧(同时连接 wifi + 网线)
在Mac上使用Golang(Go语言)进行网络编程时,如果你希望在利用utun
(通用隧道接口)的同时绑定网络出口,这通常涉及到创建并配置一个自定义的网络接口,然后通过该接口进行网络数据传输。以下是一个简要的步骤指南:
-
创建utun接口:
- 使用
utun
接口通常需要管理员权限。你可以通过ifconfig
或ip
命令创建一个utun
接口,例如:sudo ifconfig utun0 create
。
- 使用
-
配置接口:
- 为
utun
接口分配IP地址和其他必要的网络配置,例如:sudo ifconfig utun0 inet 192.168.1.100 up
。
- 为
-
绑定网络出口:
- 在Go中,你可以使用标准库中的
net
包来创建和管理网络连接。为了通过特定的网络接口(如utun0
)发送数据,你需要设置路由或使用绑定套接字选项。 - Go没有直接提供绑定到特定接口的API,但你可以通过
syscall
包调用底层系统调用(如setsockopt
的IP_BIND_ADDRESS_NO_CHANGE
或类似选项,具体取决于MacOS版本和支持)。
- 在Go中,你可以使用标准库中的
-
编程实现:
- 编写Go代码,使用
net.Dial
或net.Listen
创建网络连接,并通过适当的方式确保这些连接通过utun
接口。
- 编写Go代码,使用
-
测试和调试:
- 使用网络工具(如
tcpdump
、traceroute
)来验证数据是否通过预期的utun
接口传输。
- 使用网络工具(如
请注意,这些步骤可能需要根据具体的MacOS版本和Go版本进行调整。