如何使用带有 golang net 包的 VPN(pptp)?

我在 ppp0 ~ ppp4 的服务器上绑定了几个 vpn。现在问题来了。我想开始 5 个进程,每个进程使用不同的网络接口。
proc0 -> ppp0
proc1 -> ppp1
proc2 -> ppp2
proc3 -> ppp3
proc4 -> ppp4
我现在如何用c语言来做到这一点。只需使用带有参数SO_BINDTODEVICE的setsockopt。但是如何在 golang 中使用 net 包来做到这一点?

桃花长相依
浏览 166回答 2
2回答

拉丁的传说

您可能希望net.Interfaces()获得net.Interface()代表系统上网络接口的片段,或者,如您所知的接口名称,您可以使用它net.InterfaceByName()来获取特定的net.Interface.ppp0, err := net.InterfaceByName("ppp0")然后您可以调用Interface.Addrs()返回的net.Interface并获取接口的 IP 地址。addrs, err := ppp0.Addrs()然后,您可以在其余代码中使用所需的地址(可能使用net.ListenIP或net.DialIP.addr, err := net.ResolveIPAddr("ip4", addrs[0])// check errconn, err := net.ListenIP("ip4:pptp", addr)// check err, then do stuff with conn关于同时为多个接口执行此操作,您可以为每个侦听器/接口启动一个 goroutine,并通过通道移动流量,但这实际上取决于您想要做什么。(您只是记录数据、发送数据、修改数据等吗?)

临摹微笑

拨号器的 LocalAddr 不适用于 ppp 接口,我们应该SOL_SOCKET使用将标志设置为套接字setsockopt,对于 go 1.11+,您可以创建这样的拨号器    dialer := net.Dialer{        Control: func(network, address string, c syscall.RawConn) error {            return c.Control(func(fd uintptr) {                err := syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, 25, "ppp0")                if err != nil {                    log.Printf("control: %s", err)                    return                }            })        },    }    // use the dialer
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go