今年忙着备考,比较忙,但是还是想花点时间,记录一下这几年我所自学到的可能不是很有用(以及准确)的知识,更希望的是,对有想学习这方面知识的大家有一定的帮助。其中,学习OpenWrt有一段时间了,期间用所学知识帮助了不少同学,亲戚朋友改善网络,也给一些小公司做过网络优化,本系列记录一下我所学习到的OpenWrt项目的细节。
NAT介绍
(资料图)
NAT(网络地址转换)技术目前已被广泛应用在家庭网络环境中,通常用于IPv4协议。简单来说NAT技术的诞生,就是因为IPv4地址数量稀少,为了缓解v4网络地址紧张,出现了NAT技术以供一个地址多台设备共用。
在绝大多数应用场景中,几乎感受不到NAT的存在,但对于个别应用场景,NAT会严重影响网络使用体验。
NAT根据转换方式可分为:
静态NAT
动态NAT
端口复用NAT(NAPT 主流)
而根据转换后端口连通性可分为(STUN定义):
完全锥型
限制型锥型
端口限制型
对称型
通常家庭宽带为完全锥型或对称型,外部连通性根据类型1-4递减。
NAT优缺点
优点:
是一道天然防火墙,外部公网无法直接访问私网主机
共享网络,理论上最多可共享给65535台主机
极大程度缓解IPv4地址稀少
作为NAT主机,是私网唯一网络出口,可以灵活程度管理私网主机联网
缺点:
严重影响个别应用场景,例如P2P技术(包括P2P游戏联机互动)
NAT主机性能会严重影响所控制的内部网络性能,导致延迟,丢包,网络不稳定等
外网访问内网会受限,如果内网有提供服务,默认下不能被外部网络访问
对于某些数据包严格的应用(不允许修改数据包),则无法使用
根据使用场景,选择适合您的NAT类型
通常情况下,为了确保网络安全性,强烈建议使用对称型NAT,但是包括但不限于如下场景建议尽可能选择完全锥型NAT:
直播,其中需要推流,VTS联动,游戏联动,以及对网络要求较高的游戏或应用等
游戏,尤其是对网络延迟敏感,需要很高的网络稳定性
P2P下载,完全锥型可能会获得更高的下载速度,当然还有上传速度
多人使用(多连接数),完全锥型NAT会一定程度上减轻NAT主机负担,带来网络质量提升,但现如今NAT主机性能完足够,几乎没有影响
检测您的NAT类型
BitComet-菜单栏-工具-检测NAT类型
https://github.com/HMBSbige/NatTypeTester/releases项目
上述两种工具使用都很简单,一键式自动检测并汇报结果。
OpenWrt NAT实现原理
1.防火墙(firewall C && firewall4)
OpenWrt防火墙属于包过滤类型防火墙,根据设定规则(源地址,目标地址,连接协议,端口甚至是不同时间段等等),对于数据包选择性入站/出站/转发。然而改变NAT类型即意味着改变端口数据包选择性,所以需要改变firewall及其后端,以支持不同NAT(默认情况下OpenWrt为对称型NAT)
2.Netfilter/iptables && Netfilter/nftables
OpenWrt firewall C由iptables实现,firewall 4由nftables(可改为iptables)实现,所以fullcone补丁二者默认情况下不能通用。
3.Linux Netfilter框架
2中的项目补丁通过对Linux内核下netfilter/nftable 或 netfilter/iptables进行扩展,在内核态进行NAT端口映射表刷新和修改,以实现高效的fullcone,具体原理可查阅:
同时,lean's/lede中给出了另一种fullcone实现方式(高性能fullcone,上述fullcone的实现被称为兼容模式fullcone),能实现超高并发吞吐量和超多连接数(感谢lean)。
当然改完之后需要对firewall源码打patch,以使用fullcone模块,实现fullcone。
小结
对于大多数小伙伴来说,不太需要关心NAT类型,因为多数情况下家庭网络环境很简单,设备数量和连接数通常很少,但是对于某些高效性或安全性应用场景,则需要考虑采用何种NAT,以在相对高效和相对安全中权衡。
NAT技术的贡献很大,极大程度上缓解了IPv4网络地址紧张的问题,但是NAT的广泛应用,却违背了网络互联互通的这个最基本且最重要的特性,且最重要的是,NAT改变了人们对网络的看法,也严重影响IPv6协议的推广,甚至出现NAT6(应用在IPv6层的NAT)这种有些让人摸不到头脑的技术,但是NAT,并不能改变IPv4紧张的本质,未来,网络发展到相当规模后,NAT势必会成为阻碍。