两种内网穿透的区别
- 转发型 典型的有frp,通过一台服务器转发流量
-
打洞型
典型的有natter
检测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
如果如图所示,没有报错就代表可以穿透可以进行下一步操作了
如果结果是↓这样的话则说明当前网络不满足穿透条件,无法穿透
穿透NAT
测试完成之后可以尝试穿透了
比如我想穿透内网的3389(RDP)远程桌面端口需要运行脚本并输入需要开放的端口即可
此时已经显示出来使用外网访问的IP地址和端口了,但是目前还是不能连接的,需要我们进路由器映射端口才可以
这里我以Ikuai软路由来演示,具体操作根据自己使用的路由器来决定哦
添加一个端口映射吧内网的某台主机的3389端口映射到外网的3389端口上
这样就建立好了映射关系了,此时用一台外网的电脑尝试访问
发现已经可以访问了,内网已经被穿透成功了
这个方法是利用NAT1来进行打洞,并维持隧道,测试成功后可以将python脚本放在后台运行
这里我使用的是screen,使用screen
1
screen python natter.py 3389
此时依次按下Ctrl+A+D即可让这个窗口切换到后台并保持运行了
进阶玩法
如果需要映射多个端口,比如内网的22,3389这两个端口的时候可以使用下面这种方法
编辑配置文件
1
vim ./natter-config.templete.json
这里可以实现两种不一样的穿透方法
- 上面的不需要指定IP地址只需要指定端口号就可以了
- 下面的需要指定内网的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 端口。