说白了,就是利用 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');
?>
1
zhcode 2023-11-15 19:58:18 +08:00
巧了,我和你的方案一模一样,我是把打洞的端口号用 github 的接口记录到 gist 上面,路由器每周重启一次,端口号基本上也就重启路由器的时候会变
|
2
zhcode 2023-11-15 20:06:21 +08:00
wg 支持 srv 记录就好了,就不用手动改端口了
|
3
MFWT OP @zhcode 主要是 WG 本体不会做这个,根据他们官方的说法是,需要上层应用去解决这个问题
然后就陷入一个问题中了:虽然说软件是开源的,但是我不会这个语言或者别的什么原因导致没办法改,只能用一些土办法来解决了 |
4
evalfun 2023-11-15 22:55:20 +08:00
其实 wg 的灵活性挺低的,内核态的 wg 起来之后甚至没有办法更新 ip 地址。对端 wg 的 ip 地址都变了,只要不重启本端的 wg ,本端 wg 就不会重新解析对端的 ip 地址,而是一直尝试使用旧的 ip 地址连接对端。按照作者的说法是,wg 隧道是用来静态组网的
|
5
Akitora 2023-11-15 23:08:34 +08:00
推荐一下 GOST
|
6
duduke 2023-11-16 00:27:08 +08:00 via iPhone
我是直接生成 vmess 订阅,更新订阅就行。然后地址和端口就更新好了
|
7
faceair 2023-11-16 01:17:59 +08:00
tailscale 会不会简单点?
|
8
lovexiaofan12312 2023-11-16 01:33:56 +08:00 via iPhone
其实用 v6+ddns 更方便………
|
10
465456 2023-11-16 07:55:13 +08:00
ssh+浏览器插件代理转发
|
11
YGBlvcAK 2023-11-16 09:15:19 +08:00
巧妙的方法,不再来个 zerotier 托底吗?如果没有干扰,zt 的速度也是很不错的
|
12
heyeshuang 2023-11-16 09:54:08 +08:00 via Android 2
|
13
jwz426 2023-11-16 10:24:15 +08:00
+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 |
14
dude4 2023-11-16 11:25:28 +08:00
@evalfun 是的,所以 op 那边自带一个保活脚本,原理就是……ping 不通对端就重新解析地址然后重启 interface……
|
15
hanguofu 2023-11-16 12:12:31 +08:00
谢谢分享宝贵经验。顺便问问: 你家的移动光猫不会屏蔽家里的 WireGuard 端口吗 ?
|
16
Masoud2023 2023-11-16 13:57:49 +08:00
我测了几条移动宽带都是 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 端口没有效果 |
18
lihang1329 2023-11-16 18:33:24 +08:00
不过我用的 vmess ,每次端口号变化,写入到 cloudflare workers,
cloudflare workers 同时生成 clash 配置,clash 客户端配置每 5 分钟更新一次配置 |
19
lihang1329 2023-11-16 18:34:59 +08:00
可以做到配置更新无感
|
20
rtz 2023-11-16 19:34:57 +08:00
@lihang1329 太巧了,我也是用 worker 自动生成 vmess 订阅
|
22
MFWT OP @lovexiaofan12312 学校网络不支持 v6 ,只能用流量卡上,这个就不太方便了
|
23
MFWT OP |
26
MFWT OP @Masoud2023
有一个可能是你是光猫拨号,但是光猫有额外防火墙或者没有开 DMZ 给下级路由 我是路由器拨号,然后在路由器上做 Natter 的 当然,我目前怀疑是分地区的,因为有朋友开移动宽带只能拿到 NAT4 ,但是我开两条都能拿到 NAT1 |
27
MFWT OP @lihang1329 思路差不多,我主要是考虑到可以用到完整三层,因此选了 VPN
|
28
MYDB 2023-11-16 23:34:09 +08:00
我 ss 全局连回去,然后顺便手机免流
|
29
Masoud2023 2023-11-17 10:46:51 +08:00
|
30
s82kd92l 2023-11-17 10:51:26 +08:00 via Android
可以用 mqtt 发布端口到公共服务器某个频道上,然后订阅频道,简单免费
|
31
Dzsss 2023-11-17 11:01:40 +08:00
Mikrotik IP Cloud 的 BTH 了解一下。
|
32
Masoud2023 2023-11-17 11:05:22 +08:00
@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 这个打进去 |
33
hi543 264 天前
试一下 tailscale 吧,安装个客户端就可以了。
|