# 背景
# 参考地址
- https://post.smzdm.com/p/akk5mn0r/,2个检测局域网NAT类型的小工具
- https://blog.csdn.net/corrupt/article/details/132302628
- https://tieba.baidu.com/p/8903398863,设置为NET1的方法
# NAT背景介绍
- 通过NAT可以让局域网内的众多主机使用一个公网IP访问Internet。
- 由于IPV4紧缺,家用网络大部分都在NAT环境中。目前NAT分为4个类型:NAT1、NAT2、NAT3、NAT4
- NAT1:Full Cone NAT(全锥形NAT);
- NAT2:Address Restricted Cone NAT(受限锥型NAT);
- NAT3:Port Restricted Cone NAT(端口受限锥型NAT);
- NAT4:Symmetric NAT(对称型NAT);
- 从NAT1到NAT4限制越多,而家用网络最常见的是NAT3和NAT4。
- 一般来说NAT3还能接受,NAT4可以换网络服务商了。
# 各级别NAT的特点
- NAT1: 只要内网主机通过NAT开通一个“洞”,任何外网主机都可以通过这个“洞”访问内网主机
- NAT2: 内网主机通过NAT开通一个“洞”,只有内网主动连接的外网主机可以通过这个“洞”访问内网主机
- NAT3: 内网主机通过NAT开通一个“洞”,只有内网主动连接的外网主机的端口发出的请求才可以通过这个“洞”访问内网主机
- NAT4: 和端口限制型的区别在于,内网主机对外的每个连接都会使用不同的端口,而端口限制型对外的每个连接都会使用相同的端口
# NAT的检测方法
- Windows系统可以使用
nattypetester
,如果软件默认的STUN server
地址不可用,可以填写国内小米的服务器stun.miwifi.com
。点击Test按钮然后在RFC 3489
可以看到NAT类型数据 - Linux可以使用pystun3(如果是python2环境,可使用pystun),pystun3基于python可用pip安装
# 准备步骤
# 可行性调研
- 四川移动2022年办理的宽带,默认是NET4
- 网络查询结果大部分表明:让运营商直接修改宽带为NET1方案是不可能的
- 但是通过方法,可以让某一个内网实现 NET1全椎形NAT
# 步骤
- 光猫桥接(这个需要运营商设置)。
- 家用宽带拨号上网
- 局域网的某一台机器固定ip获取
- 使用DMZ设置为固定ip的机器
- 进行检测,发现已经可以实现全椎型NAT1
# 方法论
- 有多种方式实现宽带打洞,只是之前自己没有接触过
- 最开始接触的是基于路由器的宽带打洞,因此在这个上面花了很多时间尝试,由于物理限制,暂未成功
- 当使用内网打洞这个技术领域时,发现并不需要强制与路由器绑定,因为路由器需要刷机;
- 通过其他方案尝试,且获得成功!
# 基于natmap+路由器方式打洞
# 家用路由刷机说明
- 由于运营商路由器功能有限,因此需要刷机成openwrt系统。
- 经检索,确认RAX3000Z型号无法刷机,因为是中兴的cpu.
- 中移的RAX3000M可以刷,因为是联发科的CPU。
OpenWrt
是一个高度可定制的嵌入式设备操作系统,基于Linux内核。它最初设计用于无线路由器,但现在已经扩展到支持各种嵌入式设备,包括网络存储设备(NAS)、智能家居设备等。OpenWrt 的主要特点是它的灵活性和强大的社区支持,使其成为许多高级用户和技术爱好者的首选。
# 刷机方案选择
小米4a千兆版,官网价格99
- 有说新版本(24年新买的版本)没有使用联发科的芯片,可能无法刷机,使用老版本可以刷
- 小米4a千兆版刷机博客说明:
https://blog.csdn.net/u013488276/article/details/141136009
- 咸鱼二手4a千兆的,价格在40左右
咸鱼买刷好openwrt的二手路由器
- 目前找到好几款价格在40~80左右,质量目前尚不清楚
# 实践进度
- 由于实现成本高于其他方案,暂未实施
# 基于lucky打洞
- 也是主流的打洞方案,不过好像是闭源的
- 有说是缝合怪,功能大而全
- 暂未采用该方案
# 基于Natter打洞
# 参考资料
- natter开源仓库使用说明:
https://github.com/MikeWang000000/Natter/blob/master/docs/README.md
- kali笔记-通过打洞来实现内网映射(宝藏博客,没事可以多逛):
https://blog.bbskali.cn/4058.html
# 实践参考
# 打洞验证
- 在nat1的环境下进行验证
python3 natter.py
- 输出结果:
2024-11-22 20:30:11 [I] Natter v2.1.1
2024-11-22 20:30:11 [I] Tips: Use `--help` to see help messages
2024-11-22 20:30:16 [I]
2024-11-22 20:30:16 [I] tcp://192.168.10.7:40343 <--Natter--> tcp://112.xx.xx.185:11325
2024-11-22 20:30:16 [I]
2024-11-22 20:30:16 [I] Test mode in on.
2024-11-22 20:30:16 [I] Please check [ http://112.xx.xx.185:11325 ]
2024-11-22 20:30:16 [I]
2024-11-22 20:30:16 [I] LAN > 192.168.10.7:40343 [ OPEN ]
2024-11-22 20:30:16 [I] LAN > 192.168.10.7:40343 [ OPEN ]
2024-11-22 20:30:16 [I] LAN > 112.xx.xx.185:11325 [ OPEN ]
2024-11-22 20:30:17 [I] WAN > 112.xx.xx.185:11325 [ OPEN ]
- 外网浏览器访问:
http://112.xx.xx.185:11325
, 返回Natter
的欢迎界面
# 打洞实操
- 使用内置转发,对外开放本机 80 端口:
python3 natter.py -p 80
- 使用 iptables 内核转发(需要 root 权限),对外开放本机 80 端口:
sudo python3 natter.py -m iptables -p 80
- 使用iptables内核转发22端口:
python3 natter.py -m iptables -p 22
- 注意,使用iptables转发的时候效率最高,但是不能强制退出,否则无法清理iptables记录,(使用 iptables转发时,除了强制退出,例如
SIGKILL
,Natter 在正常退出时均会清理相关规则。否则需要手动清理,或者重启机器让系统自动重置) - iptables转发方法的目标 IP 具有限制,应当为 本机 或其下级主机的IP 地址
# 转发方法对比
下表列出了不同转发方法之间的差异。
总的来说:
- iptables 是最推荐的转发方法。
- 如果您不是 Linux 用户,您可以选择 socat, gost 或者 socket 方法。
- socket 方法,是 Natter 采用的默认转发方法。
iptables | nftables | socat | gost | socket | |
---|---|---|---|---|---|
操作系统限制 | 仅 Linux | 仅 Linux | 跨平台 | 跨平台 | 跨平台 |
保留源 IP | 可 | 可 | 不可 | 不可 | 不可 |
转发效率 | 高 | 高 | 中 | 中 | 中 |
转发类型 | 内核 | 内核 | 多进程 | 协程 | 多线程 |
root 权限 | 需要 | 需要 | 无需 | 无需 | 无需 |
第三方依赖 | 是 | 是 | 是 | 是 | 否 |
依赖最低版本 | 1.4.1 | 0.9.0 | 1.7.2 | 2.3 | - |
依赖最佳版本 | ≥ 1.4.20 | ≥ 1.0.6 | ≥ 1.7.2 | ≥ 2.3 | - |
# ddns实现动态域名映射
# 参考文档
- 阿里云获取recordId:
https://blog.csdn.net/ren991630622/article/details/77174574
- 个人服务器实现阿里云DDNS:
https://blog.csdn.net/qq_37383852/article/details/123113866
# 资源
- 已放置在natter源码中
# 总结篇
# NAT1内网穿透的本质
- 全椎型网络nat1,内外网洞通的情况下,所有外网设备都可以通过这个洞口进行访问,这是网关设备洞通的关键;
- 套接字保活,这是让这个洞口可以长期提供服务的核心原因;(TCP连接在长时间没有数据传输时可能会被中间设备认为是“死连接”而被断开)
- socket允许多个套接字绑定到同一个地址和端口组合,这是可以实现大内网洞通关键,否则只有网关设备可以洞通;
# NAT1内网穿透的核心步骤
- 通过stun服务器,获取本次洞通的公网ip和端口,这是通过 stun服务器返回的数据;洞通的过程中,需要记录本地的ip及端口(网关ip及端口);
- 用这个网关端口连接保活服务器进行保活,包括tcp保活和ucp保活。 否则洞通会断掉,外网设备无法访问内网设备;
- 进行转发策略的操作,实现具体的洞通业务;
# 内网打洞原理
- 参考文档(基于该文档,NAT1几乎不需打洞,NAT2,NAT3可以打洞):
https://blog.csdn.net/NJUPT_T/article/details/51170623
- 内网的ip是由网关分配的,内网数据发出去的时候,映射到一个公网地址,这是一个动态计算的过程(特别是端口号),因此称为动态ip地址。
- 外部网是无法直接访问内网计算机的,但在大部分情况下,借助一台有公网ip地址电脑(这里叫服务器),通过某种方式,可以实现连接,这种技术叫做“打洞”。
- 家用宽带的DMZ功能:为了解决安装防火墙后外网用户不能访问内网服务器问题,而特意设立的一个缓存区别,通常DMZ位于企业内部网和外网之间的一个小型网络区域内,用于存放一些必须公开的服务器。 所有的家用宽带都是有动态公网ip的(一定要是拨号的那台设备);