如何在golang net包中使用VPN(pptp)?

时间:2015-01-22 04:32:19

标签: go vpn pptp

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

2 个答案:

答案 0 :(得分:1)

您可能希望net.Interfaces()获得表示系统中网络接口的net.Interface()切片,或者,如您所知,接口名称可以使用net.InterfaceByName()来获取特定内容net.Interface

ppp0, err := net.InterfaceByName("ppp0")

然后,您可以在返回的net.Interface上拨打Interface.Addrs()并获取该接口的IP地址。

addrs, err := ppp0.Addrs()

然后,您可以在代码的其余部分使用所需的地址(可能使用net.ListenIPnet.DialIP

addr, err := net.ResolveIPAddr("ip4", addrs[0])
// check err
conn, err := net.ListenIP("ip4:pptp", addr)
// check err, then do stuff with conn

关于同时为多个接口执行此操作,您可以为每个侦听器/接口启动goroutine,并通过通道移动流量,但这实际上取决于您要执行的操作。 (您只是记录数据,发送数据,修改数据等。)

答案 1 :(得分:0)

拨号器的LocalAddr不适用于ppp接口,我们应该使用SOL_SOCKETsetsockopt标志设置为套接字,对于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