检测NAT类型
需要用到的工具
Python
https://www.python.org/downloads/
Natter.py
https://github.com/MikeWang000000/Natter/tree/v0.9
建议使用Linux或者直接在路由器上运行,可以获得更好的穿透效果
首先需要检测当前网络的NAT类型是否满足打洞的要求,可以使用上面这个Natter.py脚本进行检测
python natter.py --check-nat
如果如图所示,没有报错就代表可以穿透可以进行下一步操作了
如果结果是↓这样的话则说明当前网络不满足穿透条件,无法穿透
穿透NAT
测试完成之后可以尝试穿透了
比如我想穿透内网的3389(RDP)远程桌面端口需要运行脚本并输入需要开放的端口即可
此时已经显示出来使用外网访问的IP地址和端口了,但是目前还是不能连接的,需要我们进路由器映射端口才可以
这里我以Ikuai软路由来演示,具体操作根据自己使用的路由器来决定哦
添加一个端口映射吧内网的某台主机的3389端口映射到外网的3389端口上
这样就建立好了映射关系了,此时用一台外网的电脑尝试访问
发现已经可以访问了,内网已经被穿透成功了
这个方法是利用NAT1来进行打洞,并维持隧道,测试成功后可以将python脚本放在后台运行
这里我使用的是screen,使用screen
screen python natter.py 3389
此时依次按下Ctrl+A+D即可让这个窗口切换到后台并保持运行了
进阶玩法
如果需要映射多个端口,比如内网的22,3389这两个端口的时候可以使用下面这种方法
编辑配置文件
vim ./natter-config.templete.json
这里可以实现两种不一样的穿透方法
- 上面的不需要指定IP地址只需要指定端口号就可以了
- 下面的需要指定内网的IP地址和端口号,这个模式不需要路由器设置端口转发
可以根据自己需求设置不同的模式,同时建议直选其中一种,然后将另一个的IP地址删除掉
下面是全部配置文件的参数
注意:JSON 配置文件不支持代码注释,此处为说明配置用途。
{
“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。
}
“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等操作
python natter.py -c ./natter-config.templete.json
错误解读&解决方法
This OS or Python does not support reusing ports!
解决方法: 推荐使用内核版本 4.0+ 的 Linux 系统。
No public STUN server is avaliable. Please check your Internet connection.
解决方法: 检查网络,检查防火墙是否阻止 TCP/UDP 端口 3478。
You cannot perform TCP hole punching in a symmetric NAT network.
解决方法: 此网络无法打洞。检查您的网络拓扑。检查您是否处于多层 NAT 下。
Q:Natter 给出了外部地址,但我没有办法访问。
文章作者: Timo在此
文章链接: https://blog.xioxix.com/archives/277
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Timo在此!
文章链接: https://blog.xioxix.com/archives/277
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Timo在此!
给你个新的命令:
curl https://ghproxy.com/https://raw.githubusercontent.com/MikeWang000000/Natter/v0.9/natter.py | python – –check-nat
直接这样就能检测nat
Great information shared.. really enjoyed reading this post thank you author for sharing this post .. appreciated