文章

两种内网穿透的区别

两种内网穿透的区别
  • 转发型 典型的有frp,通过一台服务器转发流量

  • 打洞型

    典型的有natter

image-20241011151632931

检测NAT类型

需要用到的工具 Python https://www.python.org/downloads/ Natter.py https://github.com/MikeWang000000/Natter/tree/v0.9 建议使用Linux或者直接在路由器上运行,可以获得更好的穿透效果 首先需要检测当前网络的NAT类型是否满足打洞的要求,可以使用上面这个Natter.py脚本进行检测

1
python natter.py --check-nat

如果如图所示,没有报错就代表可以穿透可以进行下一步操作了

img

如果结果是↓这样的话则说明当前网络不满足穿透条件,无法穿透

img

穿透NAT

测试完成之后可以尝试穿透了

比如我想穿透内网的3389(RDP)远程桌面端口需要运行脚本并输入需要开放的端口即可

img

此时已经显示出来使用外网访问的IP地址和端口了,但是目前还是不能连接的,需要我们进路由器映射端口才可以

这里我以Ikuai软路由来演示,具体操作根据自己使用的路由器来决定哦

img

添加一个端口映射吧内网的某台主机的3389端口映射到外网的3389端口上

img

这样就建立好了映射关系了,此时用一台外网的电脑尝试访问

img

发现已经可以访问了,内网已经被穿透成功了

这个方法是利用NAT1来进行打洞,并维持隧道,测试成功后可以将python脚本放在后台运行

这里我使用的是screen,使用screen

1
screen python natter.py 3389

img

此时依次按下Ctrl+A+D即可让这个窗口切换到后台并保持运行了

进阶玩法

如果需要映射多个端口,比如内网的22,3389这两个端口的时候可以使用下面这种方法

编辑配置文件

1
vim ./natter-config.templete.json

img

img

这里可以实现两种不一样的穿透方法

  1. 上面的不需要指定IP地址只需要指定端口号就可以了
  2. 下面的需要指定内网的IP地址和端口号,这个模式不需要路由器设置端口转发

可以根据自己需求设置不同的模式,同时建议直选其中一种,然后将另一个的IP地址删除掉

下面是全部配置文件的参数

注意:JSON 配置文件不支持代码注释,此处为说明配置用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
“logging”: {
“level”: “info”, // 日志等级:可选值:”debug”、”info”、”warning”、”error”
“log_file”: “./natter.log” // 将日志输出到指定文件,不需要请留空:””
},
“status_report”: {
// 当外部IP/端口发生改变时,会执行下方命令。
// 大括号 {…} 为占位符,命令执行时会被实际值替换。
// 不需要请留空:””
“hook”: “bash ./natter-hook.sh ‘{protocol}’ ‘{inner_ip}’ ‘{inner_port}’ ‘{outer_ip}’ ‘{outer_port}'”,
“status_file”: “./natter-status.json” // 将实时端口映射状态储存至指定文件,不需要请留空:””
},
“open_port”: {
// 此处设置 Natter 打洞IP:端口。(仅打洞)
// 此处地址为 Natter 绑定(监听)的地址,Natter 仅对这些地址打洞,您需要手动设置端口转发。
// 注意:使用默认出口IP,请使用 0.0.0.0 ,而不是 127.0.0.1 。
“tcp”: [
“0.0.0.0:3456”,
“0.0.0.0:3457”
],
“udp”: [
“0.0.0.0:3456”,
“0.0.0.0:3457”
]
},
“forward_port”: {
// 此处设置需要 Natter 开放至公网的 IP:端口。(打洞 + 内置转发)
// Natter 会全自动打洞、转发,您无需做任何干预。
// 注意:使用本机IP,请使用 127.0.0.1,而不是 0.0.0.0 。
“tcp”: [
“127.0.0.1:80”,
“192.168.1.100:443”
],
“udp”: [
“127.0.0.1:53”,
“192.168.1.100:51820”
]
},
“stun_server”: {
// 此处设置公共 STUN 服务器。
// TCP 服务器请确保 TCP/3478 端口开放可用;
// UDP 服务器请确保 UDP/3478 端口开放可用。
“tcp”: [
“stun.stunprotocol.org”,
“stun.voip.blackberry.com”
],
“udp”: [
“stun.miwifi.com”,
“stun.qq.com”
]
},
“keep_alive”: “www.qq.com” // 此处设置 HTTP Keep-Alive 服务器。请确保该服务器 80 端口开放,且支持 HTTP Keep-Alive。
}

最后运行脚本即可实现多端口映射,自动更新IP等操作

1
python natter.py -c ./natter-config.templete.json

错误解读&解决方法

This OS or Python does not support reusing ports!

此操作系统或者 Python 不支持端口重用。 解决方法: 推荐使用内核版本 4.0+ 的 Linux 系统。

No public STUN server is avaliable. Please check your Internet connection.

没有可用的公共 STUN 服务器。请检查您的网络连接。 解决方法: 检查网络,检查防火墙是否阻止 TCP/UDP 端口 3478。

You cannot perform TCP hole punching in a symmetric NAT network.

您无法在一个对称型 NAT 网络中实行 TCP 打洞。 解决方法: 此网络无法打洞。检查您的网络拓扑。检查您是否处于多层 NAT 下。

Natter 给出了外部地址,但我没有办法访问。

解决方法: 检查您是否正确配置了端口转发。检查您的目标服务是否正常启动。尝试关闭光猫的防火墙。如果处于多层 NAT 下,请在光猫或路由器下设置 DMZ 主机或者端口转发。如果上述方案不能解决改问题,则是运营商设置了防火墙,此网络无法开放 TCP 端口。

本文由作者按照 CC BY 4.0 进行授权