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

175 天前
 MFWT

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/992226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX