0

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

4

2 回答 2

1

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

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

然后,您可以调用Interface.Addrs()返回的net.Interface并获取接口的 IP 地址。

addrs, err := ppp0.Addrs()

然后,您可以在其余代码中使用所需的地址(可能使用net.ListenIPor net.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,并将流量转移到通道上,但这实际上取决于您想要做什么。(您是否只是记录数据、发送数据、修改数据等)

于 2015-01-22T05:06:40.587 回答
0

拨号器的 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
于 2019-06-26T08:40:18.790 回答