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

wireguard 打洞工具

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

    因为没有找到合适的,于是自己写了一个,这样就能用 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  
    PRO
       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     Solana     2695 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 02:27 PVG 10:27 LAX 19:27 JFK 22:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86