使用 Natter 在无公网 IP 的网络上实现端口映射

最近更新日期:2026 年 1 月 9 日,2:44

注意

在此感谢 MikeWang000000 写出来的一个非常实用的程序。

操作前需要确认网络环境是全锥型 NAT,否则无法继续。

首先,去光猫或路由器里后台管理页面设置一下 DMZ IP 到使用 Natter 的主机,然后拿 NAT Type Tester 测试一下 NAT 类型。请注意,映射出去的端口是动态的,是由运营商的 NAT 设备随机分配的,无法指定。


此工具不需要“想要连接到你”的人拥有这个工具,Natter 只在服务端部署,客户端不需要使用任何软件。

1、前言

由于公网 IPv4 地址池耗尽,现在三大运营商基本上不给家庭宽带公网 IP 了,这导致有很多需要公网 IP 用的服务都用不了。

一般情况下,除了和运营商要公网 IP,或是使用内网穿透程,基本上没其它的方法。

现在呢,有新东西可以玩了,那就是 Natter。

2、Natter 的好处有啥?

和内网穿透相比,Natter 不需要内网穿透服务器,不需要经过服务器中转。

3、什么是 NAT ?

请访问下面的链接,查看百科的详细介绍:

百度百科 - NAT
https://baike.baidu.com/item/nat/320024

维基百科 - NAT
https://zh.wikipedia.org/zh-hans/网络地址转换

4、什么是 Fullcone NAT?

所有从同一个内网的 IP 或端口,发送出来的请求都会被映射到同一个外网的 IP 或端口,且任何一个外网主机都可以通过访问映射后的公网地址,实现访问位于内网的主机设备功能。外网主机可以主动连接内网主机。

而 Natter 就使用了 Fullcone NAT 的这个特性。

5、Natter 的来头

Natter 是 Github 用户 MikeWang000000 编写的一个 Python 脚本程序,主要用途就是来在全锥型 NAT(Fullcone NAT)的网络环境下,通过“打洞”的方式,将本地网络的端口公开到至互联网上,比如公开我的世界服务器。

6、原帖、详情和下载

6.1、详情见

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

位于 V2EX 的原帖
https://global.v2ex.co/t/879549
如果您位于中国大陆,可能无法访问。在帖子中,作者也说明了 Natter 的工作原理

6.2、下载脚本

因为是 Python 脚本,使用前请在计算机中准备好 Python 环境。
电脑浏览器建议右键“链接另存为”

直接下载脚本:
Github: https://raw.githubusercontent.com/MikeWang000000/Natter/refs/heads/master/natter.py
如果您在中国大陆,可能无法访问

GHPROXY 镜像站:(如果 Github 无法访问就试试这个)
https://ghfast.top/https://raw.githubusercontent.com/MikeWang000000/Natter/refs/heads/master/natter.py

jsdelivr 镜像站:(如果 Github 无法访问就试试这个)
https://fastly.jsdelivr.net/gh/MikeWang000000/Natter@master/natter.py

7、可使用此脚本的操作系统

只要是能用 Python 的系统就都能用这个脚本,Windows、Linux、Mac、Android 都可以用,BSD 我不太清楚,自行测试吧。

8、使用方法

使用前,需要满足这些条件:

  • 全锥 NAT 网络环境
  • 设备可运行 Python
  • 在路由器或光猫的后台页面设置 DMZ IP 到使用 Natter 脚本的设备
  • 重中之重:按照本文的步骤,都正确无误设置完毕后,保持程序的运行。


如果使用 Windows 系统,建议把下载下来的 natter.py 文件,放到系统盘 Windows 文件夹,方便以后调用,比如用 Windows + R 键,就像这样:


在 Windows 11 系统下,使用运行快速调用 Natter

以上条件都满足后,你可以使用 Natter 脚本。默认是测试模式,测试模式下 Natter 会自动尝试打洞,如果没问题,脚本返回这些内容

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
2023-11-01 01:00:08 [I] Natter
2023-11-01 01:00:08 [I] Tips: Use `--help` to see help messages
2023-11-01 01:00:12 [I]
2023-11-01 01:00:12 [I] tcp://192.168.1.100:13483 <--Natter--> tcp://203.0.113.10:14500
2023-11-01 01:00:12 [I]
2023-11-01 01:00:12 [I] Test mode in on.
2023-11-01 01:00:12 [I] Please check [ http://203.0.113.10:14500 ]
2023-11-01 01:00:12 [I]
2023-11-01 01:00:12 [I] LAN > 192.168.1.100:13483 [ OPEN ]
2023-11-01 01:00:12 [I] LAN > 192.168.1.100:13483 [ OPEN ]
2023-11-01 01:00:12 [I] LAN > 222.223.140.10:14500 [ OPEN ]
2023-11-01 01:00:13 [I] WAN > 222.223.140.10:14500 [ OPEN ]
2023-11-01 01:00:13 [I]

在测试模式下,如果四个 IP 都是 OPEN 开放状态,那么就复制 WAN 那行的 IP 和端口,粘贴到浏览器,看看是否返回了这些内容:

1
2
3
It works!
--------
Natter

提示

如果能打开,就表示成功。试试用其他设备,在不同网络下打开,比如蜂窝网络。
一定要保持 Natter 程序是正在运行的状态,关闭程序会导致连接失败。

如果你用 Windows 系统,建议先关掉防火墙,两个都关
,然后再去试,不然会有些奇怪的问题。

9、其他示例

用我的世界服务器举个例子吧,我们起一个新的 CMD 窗口,然后打这个命令

1
natter.py -t 127.0.0.1 -p 25565 

提示:如果想公开机器自身的的端口,直接写 natter.py -p 25565 就可以了,可省略 -t 参数。

如果要公开其他局域网的 IP 的端口,比如公开 192.168.1.2 的我的世界服务器端口,那就这样写:

1
natter.py -t 192.168.1.2 -p 25565

很简单,对吧?

四个 IP 和端口状态都是 OPEN 后,复制 WAN IP 那行的 IP 地址和端口,给你的好友或是其他人,别人就可以连接上你了

其他用法,可以使用 natter.py --help 命令查看更多使用方式。

调试模式下的测试模式,可以使用 natter.py -v 命令查看更多的输出,也包含了来访者的 IP。

10、来源 IP 问题

只在乎能通,不在乎其他的话,请忽略这一段。

在 Windows 系统,这个问题不太好搞,如果要查看,倒是可以用杀毒软件查看 python.exe 建立的连接,例如火绒的网络监视器,或者你使用系统自带的“资源监视器”工具来查看 python.exe 的连接。

(文章作者:至少能查看来源 IP,比 FRP 内网穿透好点。)

或者,把模式调成 gost 转发,但需要提前下好 gost 转发器可执行文件并放进系统文件夹。

以下可能很少人用得到,可略过,需要 Linux 系统的 Root 权限:
还有一种法子,就是在 Linux 系统上跑 Natter,然后开启系统的 IP 转发,然后转发方式是 IPtables,这种是不会丢失源地址(对于应用程序来说),也只有这种方式不会丢失。
另外一种,就是映射到其他主机上的端口,这种就需要把“其他主机”上的网关,设置为运行 Natter 设备的机器,这第二种法子,我推荐在软路由上搞。

如果你只在乎能通,不考虑别的,略过这一段就行。

11、多层 NAT 嵌套

如果是光猫拨号,而且有二级路由 NAT 的话,需要自上而下都要设置一遍 DMZ。

举例子,如果网络是这种接法:
光猫 → 路由器 → 想用 Natter 的主机

那么就先去光猫超级管理员账号后台管理页面,设置 DMZ IP 到下级路由器的 WAN IP,然后再到下级路由器的后台设置 DMZ IP 到要用 Natter 的主机。

这样就可以正常使用了。

12、示例截图

一些无关紧要的示例截图。
测试模式,Natter 在命令行里的示例图,未开调试模式


手机的 NAT 行为检测工具,如果 DMZ 设置到手机,也会是全锥 NAT


NAT Type Tester 测试的类型,请以第一次结果为准

13、其他

我不是此工具的开发者,我只是这个工具的受益者,不要来问改造 Natter 的事情。

我只是总结,然后发一篇文章。更多玩法请自行发挥。

另外,听说国外有些地方的宽带也不提供公网 IP,只是听说,但不一定是,但如果是全锥 NAT 的话,也可以试试。


使用 Natter 在无公网 IP 的网络上实现端口映射
https://marshmallowlands.github.io/2025/03/30/2025-01/Natter/
作者
Marshmallowlands
发布于
2025年3月30日
许可协议