Golang Go语言中 Mac 上如何实现在使用 utun 时再绑定网络出口?

发布于 1周前 作者 sinazl 来自 Go语言

以 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

3 回复

我感觉是路由的问题,你把 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(通用隧道接口)的同时绑定网络出口,这通常涉及到创建并配置一个自定义的网络接口,然后通过该接口进行网络数据传输。以下是一个简要的步骤指南:

  1. 创建utun接口

    • 使用utun接口通常需要管理员权限。你可以通过ifconfigip命令创建一个utun接口,例如:sudo ifconfig utun0 create
  2. 配置接口

    • utun接口分配IP地址和其他必要的网络配置,例如:sudo ifconfig utun0 inet 192.168.1.100 up
  3. 绑定网络出口

    • 在Go中,你可以使用标准库中的net包来创建和管理网络连接。为了通过特定的网络接口(如utun0)发送数据,你需要设置路由或使用绑定套接字选项。
    • Go没有直接提供绑定到特定接口的API,但你可以通过syscall包调用底层系统调用(如setsockoptIP_BIND_ADDRESS_NO_CHANGE或类似选项,具体取决于MacOS版本和支持)。
  4. 编程实现

    • 编写Go代码,使用net.Dialnet.Listen创建网络连接,并通过适当的方式确保这些连接通过utun接口。
  5. 测试和调试

    • 使用网络工具(如tcpdumptraceroute)来验证数据是否通过预期的utun接口传输。

请注意,这些步骤可能需要根据具体的MacOS版本和Go版本进行调整。

回到顶部