MFWT

分享一下我日常用的打洞回家法,不知道有没有 V 友也用这个的

  •  
  •   MFWT · Nov 15, 2023 · 8553 views
    This topic created in 1087 days ago, the information mentioned may be changed or developed.

    说白了,就是利用 natter/natmap 等软件,对 FullCone 宽带(移动不给 v4 公网,只有 FullCone 了)进行端口打洞,打出来的洞 TCP 和 UDP 都可以跑,理论上可以直接用,不过为了安全和方便期间,我把他转发到了 WireGuard 上面,这样在学校的时候只需要让 WireGuard 连接这个端口,就可以访问家里的内网了

    一个问题是,这样打洞打出来的端口,端口号是随机的,幸好 natter 提供了 Hook 功能,打洞成功后只需要调用 curl 把它推送到外面网站(我在博客站放了个小脚本)的一个文件上,访问端要连接的时候读取一下这个文件并写入 WireGuard 配置文件中(同样可以用 curl 和一点 bat 脚本即可办到)就能知道最新地址了

    一般来说重拨号后读一次就可以用到下次重拨号,还是不错的

    现在唯一要祈祷的就是,移动不要收回我的 NAT1 ,不然我就得走中转了

    附,网站上的脚本,请注意保护好密钥,最好再给脚本改个名,因为脚本写得很简陋,很容易被有心之人利用来写入恶意文件什么的:

    <?php
        /*
            使用方法:
            1. 更新信息:GET http://your_api/<脚本名>.php?key=访问密钥&act=update&ip=新的 IP&port=新的端口
            2. 获取信息:GET http://your_api/<脚本名>.php?key=访问密钥
    
            请在这个 php 文件的同目录下面放一个 ip.txt 文件用来记录信息,需要有可读写权限,666 就行
        */
        $key = '在此处填写你的访问密钥';
        if(empty($_GET['key']) || $_GET['key'] != $key){die('failed');}
        if(!empty($_GET['act']) && $_GET['act'] == 'update')
        {
            if(empty($_GET['ip']) || empty($_GET['port']))
            {
                die('failed');
            }
            file_put_contents('ip.txt',$_GET['ip'].':'.$_GET['port']);
            die('success');
        }
        readfile('ip.txt');
    ?>
    
    34 replies  •  2025-10-13 10:50:39 +08:00
    zhcode
    zhcode
    Nov 15, 2023
    1
    巧了,我和你的方案一模一样,我是把打洞的端口号用 github 的接口记录到 gist 上面,路由器每周重启一次,端口号基本上也就重启路由器的时候会变
    zhcode
    zhcode
    Nov 15, 2023
    2
    wg 支持 srv 记录就好了,就不用手动改端口了
    MFWT
    MFWT
    OP
    Nov 15, 2023
    3
    @zhcode 主要是 WG 本体不会做这个,根据他们官方的说法是,需要上层应用去解决这个问题
    然后就陷入一个问题中了:虽然说软件是开源的,但是我不会这个语言或者别的什么原因导致没办法改,只能用一些土办法来解决了
    evalfun
    evalfun
    Nov 15, 2023
    4
    其实 wg 的灵活性挺低的,内核态的 wg 起来之后甚至没有办法更新 ip 地址。对端 wg 的 ip 地址都变了,只要不重启本端的 wg ,本端 wg 就不会重新解析对端的 ip 地址,而是一直尝试使用旧的 ip 地址连接对端。按照作者的说法是,wg 隧道是用来静态组网的
    Akitora
    Akitora
    Nov 15, 2023
    5
    推荐一下 GOST
    duduke
    duduke
    Nov 16, 2023 via iPhone
    6
    我是直接生成 vmess 订阅,更新订阅就行。然后地址和端口就更新好了
    faceair
    faceair
    Nov 16, 2023
    7
    tailscale 会不会简单点?
    lovexiaofan12312
    lovexiaofan12312
    Nov 16, 2023 via iPhone
    8
    其实用 v6+ddns 更方便………
    xwit
    xwit
    Nov 16, 2023
    9
    @evalfun 用域名,配合脚本检测,ping 不通了,就重启接口就好了
    465456
    465456
    Nov 16, 2023
    10
    ssh+浏览器插件代理转发
    YGBlvcAK
    YGBlvcAK
    Nov 16, 2023
    11
    巧妙的方法,不再来个 zerotier 托底吗?如果没有干扰,zt 的速度也是很不错的
    heyeshuang
    heyeshuang
    Nov 16, 2023 via Android❤️2
    12
    jwz426
    jwz426
    Nov 16, 2023
    13
    +1 ,虽然有公网 IP ,但是我也测试过这套方案做备份。
    natmap 安卓使用 wg 的话,有一个魔改版支持 ip4p 的客户端可以用。
    https://github.com/heiher/natmap/wiki/faq#%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84
    dude4
    dude4
    Nov 16, 2023
    14
    @evalfun 是的,所以 op 那边自带一个保活脚本,原理就是……ping 不通对端就重新解析地址然后重启 interface……
    hanguofu
    hanguofu
    Nov 16, 2023
    15
    谢谢分享宝贵经验。顺便问问: 你家的移动光猫不会屏蔽家里的 WireGuard 端口吗 ?
    Masoud2023
    Masoud2023
    Nov 16, 2023
    16
    我测了几条移动宽带都是 UDP NAT3 ,这个需要路由器配置什么吗?还是分地区?


    [INFO] - Getting STUN server IP...
    [INFO] - Checking NAT Type for UDP...
    [INFO] - NAT Type for UDP: [ Port restricted (NAT 3) ]
    [WARNING] - The NAT type of your network is not full cone (NAT 1). TCP hole punching may fail.
    [INFO] - Checking NAT Type for TCP...
    [INFO] - NAT Type for TCP: [ Cone NAT ]
    [INFO] - Start punching...
    [WARNING] - TCP hole punching seems to fail. Maybe you are behind a firewall. However, you may check this address from another network: ('x.x.x.x', xxxx)
    [INFO] - TCP keep-alive...

    之后访问对应 ip 端口没有效果
    vchroc
    vchroc
    Nov 16, 2023
    17
    @duduke 相同的方案
    lihang1329
    lihang1329
    Nov 16, 2023
    18
    不过我用的 vmess ,每次端口号变化,写入到 cloudflare workers,
    cloudflare workers 同时生成 clash 配置,clash 客户端配置每 5 分钟更新一次配置
    lihang1329
    lihang1329
    Nov 16, 2023
    19
    可以做到配置更新无感
    rtz
    rtz
    Nov 16, 2023
    20
    @lihang1329 太巧了,我也是用 worker 自动生成 vmess 订阅
    MFWT
    MFWT
    OP
    Nov 16, 2023
    21
    @duduke 主要是我需要用到三层代理,思来想去最好的解决方案当然就是三层 VPN ,主要是人家就是做这个的
    MFWT
    MFWT
    OP
    Nov 16, 2023
    22
    @lovexiaofan12312 学校网络不支持 v6 ,只能用流量卡上,这个就不太方便了
    MFWT
    MFWT
    OP
    Nov 16, 2023
    23
    @YGBlvcAK
    @faceair

    ZT 和 TS 我都考虑过,但是在我这边几乎无法使用,因此最后放弃了
    其实要论兜底的话,用流量卡(校园网不支持 v6 )+v6DDNS 也可以连回去,而且因为路由器能拿到公网 v6 ,所以其实问题不大,主题中的方法是拿不到公网 v4 才想出来的下策
    MFWT
    MFWT
    OP
    Nov 16, 2023
    24
    @jwz426 感谢分享,我去看看
    MFWT
    MFWT
    OP
    Nov 16, 2023
    25
    @hanguofu 我进去超管后台关掉了所有防火墙,交给软路由处理了
    MFWT
    MFWT
    OP
    Nov 16, 2023
    26
    @Masoud2023
    有一个可能是你是光猫拨号,但是光猫有额外防火墙或者没有开 DMZ 给下级路由
    我是路由器拨号,然后在路由器上做 Natter 的

    当然,我目前怀疑是分地区的,因为有朋友开移动宽带只能拿到 NAT4 ,但是我开两条都能拿到 NAT1
    MFWT
    MFWT
    OP
    Nov 16, 2023
    27
    @lihang1329 思路差不多,我主要是考虑到可以用到完整三层,因此选了 VPN
    MYDB
    MYDB
    Nov 16, 2023
    28
    我 ss 全局连回去,然后顺便手机免流
    Masoud2023
    Masoud2023
    Nov 17, 2023
    29
    @MFWT #26

    你的路由器是 openwrt 吗?有开防火墙的 NAT1 吗?

    我这个结果也是在路由器上跑的。
    s82kd92l
    s82kd92l
    Nov 17, 2023 via Android
    30
    可以用 mqtt 发布端口到公共服务器某个频道上,然后订阅频道,简单免费
    Dzsss
    Dzsss
    Nov 17, 2023
    31
    Mikrotik IP Cloud 的 BTH 了解一下。
    Masoud2023
    Masoud2023
    Nov 17, 2023
    32
    @MFWT #26

    我打开 NAT1 了,确实是 openwrt 的问题

    https://serverfault.com/questions/441257/how-to-configure-totally-open-dmz-with-openwrt 设置了下 DMZ ,一下子就开了

    之后得抽时间自己编译下固件把 https://www.right.com.cn/forum/thread-319827-1-1.html 这个打进去
    hi543
    hi543
    Mar 11, 2024
    33
    试一下 tailscale 吧,安装个客户端就可以了。
    molezznet
    molezznet
    Oct 13, 2025
    34
    natter 不错, 不过支持 ip4p 的客户端太少了。 想公网访问 nas 的 webdav 就好了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2011 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    ♥ Do have faith in what you're doing.