Natter: 在 NAT1 下开放公网 TCP 端口

2022-09-12 23:52:08 +08:00
 mikewang

Natter

GitHub: https://github.com/MikeWang000000/Natter


目前公网 IP 越来越稀缺,有些地区已经无法申请公网 IP 了。
不过,在 NAT 1 网络下,我们可以通过一种 “打洞” 的方式,将本地的 TCP 端口暴露至公网上,运行 HTTP 服务等。
经过一番研究,我使用 Python 写了一个工具,起名叫 Natter 。

简洁地说,Natter 的原理就是端口重用:

  1. 由本地端口 A 向外发起 TCP 长连接,维持 NAT 端口映射关系;
  2. 同时监听端口 A ,对外提供服务。

Natter 应当运行于路由器上,因为这样只经过一层 NAT 。不过,正确设置 DMZ 主机,经过多层 NAT 也是 OK 的。

好消息是国内运营商级 NAT 多数已经转为 NAT 1 了,因此开放公网 TCP 端口应该是比较容易的。
目前我在中国移动的家庭宽带上已经成功使用 Natter 开放公网 TCP 端口。

16484 次点击
所在节点    宽带症候群
118 条回复
lanlandezei
2022-09-13 15:38:33 +08:00
star 了,明天用家里的移动宽带试下
shikkoku
2022-09-13 16:03:17 +08:00
显示 It works!,但是我怎么让 BT 软件打通?公网 IP 的 IP 端口不一样。
jousca
2022-09-13 18:54:30 +08:00
@shikkoku BT 软件需要你自己去打通?你是 NAT1 它就能接收传入连接。
jousca
2022-09-13 18:58:53 +08:00
测试了,功能挺好玩的。可用~
shikkoku
2022-09-13 18:59:24 +08:00
@jousca #43 那可能对我没什么用😢
mikewang
2022-09-13 19:04:10 +08:00
@Zy143L UDP 网络环境不稳定的时候可能会影响类型判断,不过仅作参考,不影响 Natter 运行。

@mikeluckybiy 可以简单理解为一个时间段内,锥形的端口映射关系是固定的,因此有打洞的可能性。而对称型的映射关系不固定,因此只能做“被动”的一方,不能对外提供服务。

@shikkoku 理论上,打洞端口 A ,得到了公网端口 B 。可以设置 BT 软件端口号也设为 B ,然后端口 A 数据转发至 B ,从而得到一致端口。
mikewang
2022-09-13 19:09:38 +08:00
@shikkoku 实际上,NAT 1 对于 BT 应该已经足够了,毕竟用的 UDP ,不需要对 TCP 打洞。
shikkoku
2022-09-13 19:16:40 +08:00
@mikewang #47 绝大部分连接时 TCP 。
tediorelee
2022-09-13 19:33:52 +08:00
感觉还不错啊,四川电信千兆公网 ipv6 无 ipv4 公网,感觉是打洞成功了
Tink
2022-09-13 19:37:18 +08:00
启用 shellclash 的情况下,tcp nat 会变成对称的,不启用就是 nat1
star7th
2022-09-13 19:45:25 +08:00
也可以试下 内网穿透搞一下 https://www.showdoc.com.cn/gaoyixia
shikkoku
2022-09-13 20:14:18 +08:00
@mikewang #47 好像不行
mikewang
2022-09-13 20:31:52 +08:00
#49 @tediorelee 对的,看到这个就是成功,恭喜你。

#51 @star7th 这个穿透是服务器中转的么? Natter 注重于直连打洞,无限制访问

#52 @shikkoku 哈哈 有点尴尬,这个转发事情应该是由 Natter 做的,我画了个饼,还没写,等我更新吧。
1423
2022-09-13 20:36:47 +08:00
有联通用户成功的吗
wym0823
2022-09-13 20:45:07 +08:00
OSError: [WinError 10048] 通常每个套接字地址(协议 /网络地址 /端口)只允许使用一次。
有时候会有这个报错,原因不明~好像是端口被占用?
mikewang
2022-09-13 20:47:58 +08:00
@wym0823 频繁打洞会出现这种情况。换个端口号试试。各个操作系统对于端口释放时间的限制不太一样。
Caan07
2022-09-13 22:42:57 +08:00
@mikewang 请问 OP 有 Openwrt 上直接安装的 ipk 安装包吗?
mikewang
2022-09-13 23:01:18 +08:00
@Caan07 目前还没有,不过操作应该很简单:
1. 上传 natter.py 脚本
2. opkg install python3-light
3. python natter.py -t 3456

如果没有 python3 ,使用 python-light 也是兼容的。
eijnix
2022-09-13 23:33:18 +08:00
需要转发的用 类似于这样的命令就行:
ssh -L 192.168.0.103:3456:127.0.0.1:8000 -N 127.0.0.1

需要注意前面一定要用自己的局域网地址 而不是 127.0.0.1
Zy143L
2022-09-14 01:14:39 +08:00
问题都解决了
只是发现 TCP NAT 测试不是很准...时不时的测出 NAT4 模式 更换了一部分 nat 服务器列表 现在稳定一些了

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

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

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

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

© 2021 V2EX