【问题标题】:How to use VPN(pptp) with golang net package?如何使用带有 golang net 包的 VPN(pptp)?
【发布时间】:2015-03-20 19:20:21
【问题描述】:

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

【问题讨论】:

    标签: go vpn pptp


    【解决方案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,并将流量转移到通道上,但这实际上取决于您想要做什么。 (你只是记录数据,发送数据,修改数据等)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 2020-09-30
        • 2013-03-28
        • 2015-11-03
        • 2013-10-27
        • 2012-08-20
        • 2018-01-18
        • 1970-01-01
        • 2013-10-06
        相关资源
        最近更新 更多