家里用的路由器,表面上看只是把Wi-Fi信号发出来,实际上它一直在后台默默做一件重要的事——地址转换。你可能没注意过,家里的手机、平板、笔记本都用着像192.168.1.x这样的内网地址,但访问百度或淘宝时却能正常加载网页。这背后就是NAT(Network Address Translation)在起作用。
NAT是什么?
简单说,NAT就是让多个设备共用一个公网IP上网的技术。运营商不会给每台手机或电脑都分配独立公网IP,那样资源根本不够用。于是路由器就充当“翻译官”,把内网私有地址转成公网地址,再把返回的数据准确送回对应的设备。
工作在哪个层级?
NAT运行在网络层,也就是OSI模型的第三层。它不关心你用的是微信还是浏览器,只盯着IP包头里的源地址和目标地址。当数据包从内网发往外网时,NAT设备会修改源IP地址,换成自己的公网IP,同时记录下这次转换关系。
比如你的手机IP是192.168.1.100,想访问百度服务器。数据包先到路由器,NAT把它改成“源地址:202.101.23.45(公网IP),源端口:5001”,并存下这张映射表。等百度回包回来,路由器一看目标端口是5001,就知道该转给192.168.1.100这台手机。
常见的NAT类型
静态NAT是一对一映射,通常用于企业把内部服务器对外发布。而家庭用户用的大多是动态NAT或PAT(端口地址转换),也就是多个内网设备共享一个公网IP,靠端口号来区分不同连接。
比如两台手机同时刷抖音,路由器会给它们分配不同的出站端口,如5001和5002。虽然公网IP一样,但通过端口能准确识别回程数据该给谁。
协议栈中的处理流程
在Linux系统中,NAT由netfilter框架实现,主要依赖iptables规则。数据包经过协议栈时,在PRE_ROUTING和POST_ROUTING两个钩子点被拦截处理。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
这条命令的意思是:所有来自192.168.1.0网段、从eth0接口发出的数据包,都做地址伪装(即动态NAT)。MASQUERADE会自动获取当前公网IP,适合拨号上网这种IP变动的场景。
遇到NAT会有什么问题?
有些应用会直接在数据体里写IP地址,比如老旧的FTP主动模式。客户端告诉服务器“我开在192.168.1.100:21”,结果对方按这个地址连不上。这时候就需要ALG(应用层网关)模块介入,深度解析协议内容并同步修改里面的地址信息。
视频会议或P2P下载有时也会卡在NAT穿透上。打个比方,两家人都躲在各自的路由器后面,彼此不知道怎么直连。这时候就得靠STUN、TURN这类辅助技术帮忙“引荐”了。
服务器维护中的实际应对
运维人员常会查看NAT表状态,确认连接是否正常建立和释放。Linux下可以用以下命令查看:
cat /proc/net/nf_conntrack | grep YOUR_IP
如果发现连接数暴增且不释放,可能是程序有连接泄漏,也可能是遭遇了SYN Flood攻击。合理设置conntrack超时时间,能减轻这类压力。
在部署服务时,若需外部主动接入(如监控探针、远程调试),得提前规划好端口映射规则。否则即使服务跑起来了,外网也访问不到。