为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
桃花长相依 2021-09-13 10:16:02
我在 ppp0 ~ ppp4 的服务器上绑定了几个 vpn。现在问题来了。我想开始 5 个进程,每个进程使用不同的网络接口。proc0 -> ppp0proc1 -> ppp1proc2 -> ppp2proc3 -> ppp3proc4 -> ppp4我现在如何用c语言来做到这一点。只需使用带有参数SO_BINDTODEVICE的setsockopt。但是如何在 golang 中使用 net 包来做到这一点?
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您可能希望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 err

conn, err := net.ListenIP("ip4:pptp", addr)

// check err, then do stuff with conn

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


查看完整回答
反对 回复 2021-09-13
?
临摹微笑

TA贡献1982条经验 获得超2个赞

拨号器的 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


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信