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

wireguard 打洞工具

  •  
  •   yinheli · 187 天前 · 5444 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    https://github.com/yinheli/udppunch

    第 1 条附言  ·  179 天前
    这只是一个实验性的工具,打算用最简单的代码,尽量用标准库来实现,毕竟 golang 来写个 raw socket 非常简单

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

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

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

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

    祝你成功!
    2i2Re2PLMaDnghL
        20
    2i2Re2PLMaDnghL  
       181 天前
    @xiejc 借助别人的话你需要暴露 UDP 端口
    bao3
        21
    bao3  
       181 天前
    如果需求不高,可以使用 tailscale 。
    yinheli
        22
    yinheli  
    OP
       180 天前
    @bao3 是的,如果比较倾向于开源也可以使用 nebula , 我这只是玩玩 wireguard ,它性能较好
    leiclye
        23
    leiclye  
       180 天前
    # ./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  
       180 天前
    服务器上的 WG 的端口是用的 51888. 打洞程序在服务器运行的时候也是需要用 51888, 还是需要另外换一个 port ?
    leiclye
        25
    leiclye  
       180 天前
    如果换另外一个端口, CLI 敲下后没有任何输出内容.
    yinheli
        26
    yinheli  
    OP
       180 天前
    @leiclye server 端和 wg 没有关系,它只是相当于一个注册表,用来交换 client 端的地址信息,类似 stun 的协议,就是多了个能获取其他客户端的公网出口信息的功能,打洞是为了让节点之前能直接通讯,流量不过中间的 server

    https://s4.ax1x.com/2022/01/04/TLVxKA.png
    stephCurry
        27
    stephCurry  
       180 天前 via iPhone
    安卓 ios 这些移动端后续会支持吗
    stephCurry
        28
    stephCurry  
       180 天前 via iPhone
    另外,peer 端的 endpoint 是否也要改为 vps 的 ip 和打洞的端口?
    yinheli
        29
    yinheli  
    OP
       179 天前
    @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  
       177 天前
    老哥,client 静默退出是因为打洞成功了吗?

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

    能简单的说下流程吗
    yinheli
        31
    yinheli  
    OP
       177 天前
    @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  
       177 天前
    噢,谢谢了,不过我想要的是 你的服务的工作流程,因为 wg 我是搭好了的。 机器的 IP 转发,以及 iptables 的 SNAT/DNAT 是只需要 server 设置吧,两个客户端不需要特别的设置吧?@yinheli
    461da73c
        33
    461da73c  
       175 天前 via Android
    都有公网 ip 了,为啥要这么折腾,两个内网连到公网的 wg 就可以了。
    yinheli
        34
    yinheli  
    OP
       175 天前   ❤️ 1
    @461da73c 如果你有公网 IP 或者你的公网服务器带宽非常大,并且没有额外费用,确实是没有打洞需求,这种打洞需求一般是两边都是没有固定 IP 的如家宽,还期望没有额外的带宽成本
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2744 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:59 · PVG 21:59 · LAX 06:59 · JFK 09:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.