V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MFWT
V2EX  ›  宽带症候群

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

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

    说白了,就是利用 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');
    ?>
    
    32 条回复    2023-11-17 11:05:22 +08:00
    zhcode
        1
    zhcode  
       107 天前
    巧了,我和你的方案一模一样,我是把打洞的端口号用 github 的接口记录到 gist 上面,路由器每周重启一次,端口号基本上也就重启路由器的时候会变
    zhcode
        2
    zhcode  
       107 天前
    wg 支持 srv 记录就好了,就不用手动改端口了
    MFWT
        3
    MFWT  
    OP
       107 天前
    @zhcode 主要是 WG 本体不会做这个,根据他们官方的说法是,需要上层应用去解决这个问题
    然后就陷入一个问题中了:虽然说软件是开源的,但是我不会这个语言或者别的什么原因导致没办法改,只能用一些土办法来解决了
    evalfun
        4
    evalfun  
       107 天前
    其实 wg 的灵活性挺低的,内核态的 wg 起来之后甚至没有办法更新 ip 地址。对端 wg 的 ip 地址都变了,只要不重启本端的 wg ,本端 wg 就不会重新解析对端的 ip 地址,而是一直尝试使用旧的 ip 地址连接对端。按照作者的说法是,wg 隧道是用来静态组网的
    Akitora
        5
    Akitora  
       107 天前
    推荐一下 GOST
    duduke
        6
    duduke  
       107 天前 via iPhone
    我是直接生成 vmess 订阅,更新订阅就行。然后地址和端口就更新好了
    faceair
        7
    faceair  
       107 天前
    tailscale 会不会简单点?
    lovexiaofan12312
        8
    lovexiaofan12312  
       107 天前 via iPhone
    其实用 v6+ddns 更方便………
    xwit
        9
    xwit  
       107 天前
    @evalfun 用域名,配合脚本检测,ping 不通了,就重启接口就好了
    465456
        10
    465456  
       107 天前
    ssh+浏览器插件代理转发
    YGBlvcAK
        11
    YGBlvcAK  
       107 天前
    巧妙的方法,不再来个 zerotier 托底吗?如果没有干扰,zt 的速度也是很不错的
    heyeshuang
        12
    heyeshuang  
       107 天前 via Android
    jwz426
        13
    jwz426  
       107 天前
    +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
        14
    dude4  
       107 天前
    @evalfun 是的,所以 op 那边自带一个保活脚本,原理就是……ping 不通对端就重新解析地址然后重启 interface……
    hanguofu
        15
    hanguofu  
       107 天前
    谢谢分享宝贵经验。顺便问问: 你家的移动光猫不会屏蔽家里的 WireGuard 端口吗 ?
    Masoud2023
        16
    Masoud2023  
       107 天前
    我测了几条移动宽带都是 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
        17
    vchroc  
       106 天前
    @duduke 相同的方案
    lihang1329
        18
    lihang1329  
       106 天前
    不过我用的 vmess ,每次端口号变化,写入到 cloudflare workers,
    cloudflare workers 同时生成 clash 配置,clash 客户端配置每 5 分钟更新一次配置
    lihang1329
        19
    lihang1329  
       106 天前
    可以做到配置更新无感
    rtz
        20
    rtz  
       106 天前
    @lihang1329 太巧了,我也是用 worker 自动生成 vmess 订阅
    MFWT
        21
    MFWT  
    OP
       106 天前
    @duduke 主要是我需要用到三层代理,思来想去最好的解决方案当然就是三层 VPN ,主要是人家就是做这个的
    MFWT
        22
    MFWT  
    OP
       106 天前
    @lovexiaofan12312 学校网络不支持 v6 ,只能用流量卡上,这个就不太方便了
    MFWT
        23
    MFWT  
    OP
       106 天前
    @YGBlvcAK
    @faceair

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

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

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

    我这个结果也是在路由器上跑的。
    s82kd92l
        30
    s82kd92l  
       106 天前 via Android
    可以用 mqtt 发布端口到公共服务器某个频道上,然后订阅频道,简单免费
    Dzsss
        31
    Dzsss  
       106 天前
    Mikrotik IP Cloud 的 BTH 了解一下。
    Masoud2023
        32
    Masoud2023  
       106 天前
    @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 这个打进去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2877 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 09:17 · PVG 17:17 · LAX 01:17 · JFK 04:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.