V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yuhua
V2EX  ›  问与答

如何通过 golang 使用 vpn?

  •  1
     
  •   yuhua · 2015-01-22 12:40:07 +08:00 · 5598 次点击
    这是一个创建于 3409 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在我的服务器上挂了5个vpn(pptp),ppp0~ppp5
    我想启动5个进程,每个进程使用不同的vpn
    proc0 -> ppp0
    proc1 -> ppp1
    proc2 -> ppp2
    proc3 -> ppp3
    proc4 -> ppp4
    用c的话可以通过SO_BINDTODIVICE实现
    现在想用golang的net包来实验,有哪位大牛实现过的?求教
    5 条回复    2019-06-26 16:27:46 +08:00
    nybux
        1
    nybux  
       2015-01-22 13:54:45 +08:00
    用Dialer进行连接,Dialer的LocalAddr设置接口指定的IP,如果不确定ip,可以通过InterfaceByName来获取
    yuhua
        2
    yuhua  
    OP
       2015-01-22 15:29:36 +08:00
    ief, err := net.InterfaceByName(netInterface)
    if err != nil {
    fmt.Println(err)
    }
    addrs, err := ief.Addrs()
    if err != nil {
    fmt.Println(err)
    }
    fmt.Println(addrs[0])
    tcpAddr := &net.TCPAddr{
    IP: addrs[0].(*net.IPNet).IP,
    }
    fmt.Println(tcpAddr)
    d := net.Dialer{LocalAddr: tcpAddr}

    conn, err := d.Dial("tcp", addr)
    if err != nil {
    fmt.Println(err)
    return nil, err
    }

    我试过了,貌似这样不行。一定要通过底层是setsockopt的方法
    同样情况下python使用s.setsockopt(socket.SOL_SOCKET, 25, "ppp0"+'\0')通过了测试
    nybux
        3
    nybux  
       2015-01-22 15:48:25 +08:00   ❤️ 1
    那就用cgo,自己先创建个socket出来,然后用new.FileConn+os.NewFile包装出一个net.Conn对象出来
    yuhua
        4
    yuhua  
    OP
       2015-01-22 17:37:06 +08:00
    哎..还是太麻烦点了。后来考量下业务觉得改用python估计问题也不大。还是谢谢啦~
    mitch
        5
    mitch  
       2019-06-26 16:27:46 +08:00
    今天遇到同样问题,简单搜索了一下,go 1.11 发布后事情简单了点,net 的 dialer 里增加了 Control 的 handler 方便对 socket 进行操作,如下:

    ---------------------------------

    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
    }
    })
    },
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2753 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:37 · PVG 20:37 · LAX 05:37 · JFK 08:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.