V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
yinheli
V2EX  ›  分享创造

wireguard 打洞工具

  •  
  •   yinheli ·
    yinheli · 2021-12-28 14:08:45 +08:00 · 9365 次点击
    这是一个创建于 821 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为没有找到合适的,于是自己写了一个,这样就能用 1m 小水管,随时打洞连家里的 nas 了,并享受家宽满速体验。

    https://github.com/yinheli/udppunch

    第 1 条附言  ·  2022-01-05 10:40:12 +08:00
    这只是一个实验性的工具,打算用最简单的代码,尽量用标准库来实现,毕竟 golang 来写个 raw socket 非常简单

    这段时间体验下来,wireguard 的配置是比较麻烦的,特别是你有十来个 peer 要配置的时候,另外打洞的需求也比较难以配合 APP 生态,相对而言就比较推荐用 nebula ,它配置比较简单,而且内置打洞功能,性能差点但是个人用没有多大的差异

    另一个局限性是打洞,不是所有的网络场景都能打洞成功
    比如家宽是联调,出门在外,用手机热点(也是联通,家庭套餐)就无法打洞成功,因为联通分配的出口 IP 居然是同一个,偶尔也不同但是估计是联通内部有特殊的处理,这种网络场景就打洞不成功,这时候找个公共(咖啡厅) wifi 反倒是可以。(当然 nebula 一样的问题,这主要是网络有关,和软件实现无关)
    37 条回复    2022-12-12 18:24:27 +08:00
    shmilyin
        1
    shmilyin  
       2021-12-28 15:18:01 +08:00   ❤️ 1
    挺好的,有没有详细点的教程?
    Saimen
        2
    Saimen  
       2021-12-28 15:59:41 +08:00 via Android
    cool ,之前用过 natpunch-go ,有空试一下这个
    xiejieyin
        3
    xiejieyin  
       2021-12-28 16:22:19 +08:00 via Android
    记录一下 以备不时之需
    redhujiao
        4
    redhujiao  
       2021-12-28 16:34:47 +08:00
    这是什么原理 不是直接转发的吗,
    我用花生壳很慢很慢
    yinheli
        5
    yinheli  
    OP
       2021-12-28 20:39:06 +08:00
    @redhujiao 这个是 UDP 打洞,可以查下维基百科,流量不经过中间代理了,而是转为 p2p 通讯
    yinheli
        6
    yinheli  
    OP
       2021-12-28 21:29:43 +08:00
    @shmilyin 这个是不是不需要教程?配置好 wg 以后,服务端常住运行,两边 nat 后面的设备也运行一下这个工具就行了。
    shmilyin
        7
    shmilyin  
       2021-12-29 08:09:40 +08:00
    @yinheli 对 NAT 的类型是不是有要求,比如 NAT3 以上之类的?
    duqich
        8
    duqich  
       2021-12-29 10:23:00 +08:00
    wireguard 还是 openvpn 好一点呢呢?现在在用 openvpn 感觉好重,想试试 wireguard
    zx900930
        9
    zx900930  
       2021-12-29 19:13:44 +08:00 via Android
    @duqich wireguard 性能更好,配置更简单,除非是为了兼容旧的网络基础设施,新的建议都用 wg
    yinheli
        10
    yinheli  
    OP
       2021-12-29 22:49:55 +08:00
    @shmilyin 可能极少数不行,但是借助中间服务器发现应该绝大部分都没问题,我自己测试的几个网络环境都行,包括 联通 5G 的的上网卡、手机热点共享,多层 NAT (光猫->路由器 1->路由器 2 )
    xiejc
        11
    xiejc  
       2021-12-29 23:02:52 +08:00
    请教一下,server 端没有公网行不行,如果是借助被人的 tcp 端口暴漏的行不行,比方说 frp/ngrok
    Tyanboot
        12
    Tyanboot  
       2021-12-30 04:59:53 +08:00
    自己做这个还不如直接用 tailscale ,反正都是 wireguard 。
    mayli
        13
    mayli  
       2021-12-30 07:39:30 +08:00 via Android
    不错的 解决了好多小白的 nat 穿透问题 不过小白一般只会点点点…不会命令行…
    yinheli
        14
    yinheli  
    OP
       2021-12-30 23:13:40 +08:00
    @xiejc 不行,需要借助一个公网的服务器,毕竟发现协议是自定义的,带宽需求极低,只发几个包知道对端的出口 IP 和端口号才行,如果是持续运行的话,就是每隔 25 秒发一次包,每次几十个字节
    shineit
        15
    shineit  
       2021-12-31 08:26:57 +08:00
    wireguard 移动端可以?
    yinheli
        16
    yinheli  
    OP
       2021-12-31 22:44:34 +08:00
    @shineit 有 app 的
    leiclye
        17
    leiclye  
       2022-01-01 17:48:13 +08:00
    老哥, Win 环境是要先安装 Go 么 ? 看里面写着(This program cannot be run in DOS mode)
    yinheli
        18
    yinheli  
    OP
       2022-01-01 19:29:47 +08:00
    @leiclye 抱歉了,我没有在 windows 上测试,手头只有 linux 和 mac [dog.jpg]
    yinheli
        19
    yinheli  
    OP
       2022-01-01 21:10:12 +08:00
    @leiclye 刚借了台电脑测试了下,是可以的,下载文件后要补充一下后缀,添加 '.exe' 然后管理员运行 powershell

    有个坑点要留意:如果你是用手机热点共享测试连 PC 和你家的网络( NAS),可能不行。当然你家宽带和手机如果是不同的运营商可能可以,我家联通宽带,因为和手机套餐是一起的,我发现它们连出口 IP 都是一样。

    最好是两端的网络是在两个不同的 NAT ,并且中间一定要经过公网环境。

    祝你成功!
    2i2Re2PLMaDnghL
        20
    2i2Re2PLMaDnghL  
       2022-01-03 19:29:18 +08:00
    @xiejc 借助别人的话你需要暴露 UDP 端口
    bao3
        21
    bao3  
       2022-01-03 21:33:35 +08:00
    如果需求不高,可以使用 tailscale 。
    yinheli
        22
    yinheli  
    OP
       2022-01-04 13:43:49 +08:00
    @bao3 是的,如果比较倾向于开源也可以使用 nebula , 我这只是玩玩 wireguard ,它性能较好
    leiclye
        23
    leiclye  
       2022-01-04 14:27:26 +08:00
    # ./punch-server-linux-amd64 -port 51888
    2022/01/04 14:09:20 listen udp 0.0.0.0:51888: bind: address already in use
    leiclye
        24
    leiclye  
       2022-01-04 14:28:52 +08:00
    服务器上的 WG 的端口是用的 51888. 打洞程序在服务器运行的时候也是需要用 51888, 还是需要另外换一个 port ?
    leiclye
        25
    leiclye  
       2022-01-04 14:31:58 +08:00
    如果换另外一个端口, CLI 敲下后没有任何输出内容.
    yinheli
        26
    yinheli  
    OP
       2022-01-04 14:39:25 +08:00
    @leiclye server 端和 wg 没有关系,它只是相当于一个注册表,用来交换 client 端的地址信息,类似 stun 的协议,就是多了个能获取其他客户端的公网出口信息的功能,打洞是为了让节点之前能直接通讯,流量不过中间的 server

    https://s4.ax1x.com/2022/01/04/TLVxKA.png
    stephCurry
        27
    stephCurry  
       2022-01-04 18:27:16 +08:00 via iPhone
    安卓 ios 这些移动端后续会支持吗
    stephCurry
        28
    stephCurry  
       2022-01-04 19:47:11 +08:00 via iPhone
    另外,peer 端的 endpoint 是否也要改为 vps 的 ip 和打洞的端口?
    yinheli
        29
    yinheli  
    OP
       2022-01-05 10:10:40 +08:00
    @stephCurry 那我比较建议你用 nebula ,它本身有 app 端

    > peer 端的 endpoint 是否也要改为 vps 的 ip 和打洞的端口?

    不用,参与到打洞的 peer 的 endpoint 是从 server 端拿到的,这个打洞工具的 client 端拿到后会设置 https://github.com/yinheli/udppunch/blob/v0.1.0/client/client.go#L98
    wspsxing
        30
    wspsxing  
       2022-01-07 11:21:38 +08:00
    老哥,client 静默退出是因为打洞成功了吗?

    transfer: 0 B received, 9.83 KiB sent 然后这样连不上是说明 洞实际并没有打通吗

    能简单的说下流程吗
    yinheli
        31
    yinheli  
    OP
       2022-01-07 13:04:37 +08:00
    @wspsxing 要在两边都运行 client ,连同一个 server

    假设你有 2 个设备( A ,B ),分别在两个 nat 后面,它们没有独立公网 IP ,但是都能访问互联网,(比如你办公室的 PC & 家里的 NAS)

    1. 随便找个有固定公网 IP 的机器,把 server 端跑起来,记得防火墙放行对应的 UDP 端口
    2. 配置 wg ( A, B 都要配置)

    # A 设备 : wg0.conf
    [Interface]
    Address = 10.18.0.2/16
    PrivateKey = A_private_key

    # B peer
    [Peer]
    PublicKey = B_public_key
    AllowedIPs = 10.18.0.0/16


    # -----------

    # B 设备: wg0.conf
    [Interface]
    Address = 10.18.0.3/16
    PrivateKey = B_private_key

    # A peer
    [Peer]
    PublicKey = A_public_key
    AllowedIPs = 10.18.0.0/16



    3. A 、B 都启动 wg & 启动客户端,稍等片刻,A 和 B 应该都被设置好了 endpoint ( wg show 看一下),然后他们应该能互通了
    例如在 A 上 ping B: ping 10.18.0.3

    注意事项:
    记得开启机器的 IP 转发,以及 iptables 的 SNAT/DNAT

    # vi /etc/sysctl.conf
    #
    # apply config
    # sysctl -p
    net.ipv4.ip_forward = 1

    # SNAT/DNAT
    iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -j MASQUERADE
    wspsxing
        32
    wspsxing  
       2022-01-07 16:32:02 +08:00
    噢,谢谢了,不过我想要的是 你的服务的工作流程,因为 wg 我是搭好了的。 机器的 IP 转发,以及 iptables 的 SNAT/DNAT 是只需要 server 设置吧,两个客户端不需要特别的设置吧?@yinheli
    461da73c
        33
    461da73c  
       2022-01-09 10:35:07 +08:00 via Android
    都有公网 ip 了,为啥要这么折腾,两个内网连到公网的 wg 就可以了。
    yinheli
        34
    yinheli  
    OP
       2022-01-09 17:51:52 +08:00   ❤️ 1
    @461da73c 如果你有公网 IP 或者你的公网服务器带宽非常大,并且没有额外费用,确实是没有打洞需求,这种打洞需求一般是两边都是没有固定 IP 的如家宽,还期望没有额外的带宽成本
    linyichang
        35
    linyichang  
       2022-09-04 15:37:09 +08:00
    如何知道是否打洞成功了呢?
    yinheli
        36
    yinheli  
    OP
       2022-09-04 16:51:14 +08:00
    @linyichang 参与的 wg 节点能通讯就可以了,这只是辅助工具,利用 wg 的 listen 端口向外发了空负载的包
    ixinshang
        37
    ixinshang  
       2022-12-12 18:24:27 +08:00
    我对于 p2p 设置看懵了。
    机器在欧洲,两台机器 ping 。 还是有快 600ms 了。

    op 能指个道不?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3207 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:58 · PVG 19:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.