端口转发和NAT(网络地址转换)是企业网络中最常用的功能,它们使内部网络的私有IP可以访问外部网络,同时也允许外部用户访问内部网络的服务。本文以Ubuntu 22.04为例,深入讲解Linux系统下iptables/firewalld的端口转发和NAT配置方法。
▶一、NAT工作原理
NAT分为源NAT(SNAT)和目的NAT(DNAT)。SNAT修改数据包的源IP地址,使内网设备使用公网IP访问外部网络(即上网功能)。DNAT修改数据包的目的IP地址,将外部对公网IP的访问转发到内网服务器(即端口映射功能)。两者都依赖内核的ip_forward功能。
▶二、开启内核IP转发
# 临时开启(立即生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 验证开启状态
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
▶三、使用iptables配置SNAT
# 内网访问外网的SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 公网IP
# 使用MASQUERADE(动态公网IP时使用)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# FORWARD链放行转发的流量
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
▶四、端口映射(DNAT)
# 将外网80端口映射到内网Web服务器
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.100:80
# 将外网的不同端口映射到不同内网服务器
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8443 -i eth0 -j DNAT --to-destination 192.168.1.200:443
# 多端口映射
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -i eth0 -j DNAT --to-destination 192.168.1.100
# 确认FORWARD链放行了目标端口
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
▶五、Firewalld配置端口转发
# firewalld端口转发
# 开启伪装
firewall-cmd --add-masquerade --permanent
# 端口转发(外部80到内部8080)
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
# 转发到不同IP
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100 --permanent
# 转发到不同IP的不同端口
firewall-cmd --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.1.100 --permanent
# 通过富规则实现更复杂的转发
firewall-cmd --add-rich-rule='rule family="ipv4" forward-port port="3306" protocol="tcp" to-port="3306" to-addr="10.0.0.10"'
# 重新加载防火墙规则
firewall-cmd --reload
▶六、多端口批量转发
# 批量配置端口转发脚本
PORTS=(80 443 8080 8443)
for port in "${PORTS[@]}"; do
iptables -t nat -A PREROUTING -p tcp --dport $port -i eth0 -j DNAT --to-destination 192.168.1.100
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport $port -j ACCEPT
done
# 使用ipset批量管理内网IP段
ipset create internal_net hash:net
ipset add internal_net 192.168.1.0/24
ipset add internal_net 10.0.0.0/8
# NAT规则使用ipset
iptables -t nat -A POSTROUTING -m set --match-set internal_net src -o eth0 -j MASQUERADE
▶七、端口转发安全控制
# 限制转发只针对特定源IP
iptables -t nat -A PREROUTING -p tcp --dport 3389 -s 公司公网IP -i eth0 -j DNAT --to-destination 192.168.1.10:3389
# 记录转发的连接日志
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j LOG --log-prefix "PORT_FWD_HIT: " --log-level 4
# 限制每IP转发连接数
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -m connlimit --connlimit-above 100 -j REJECT
# 转发规则超时自动失效(用cron脚本定时检查)
# */30 * * * * iptables -t nat -L PREROUTING -n | grep 192.168.1.100
▶八、NAT穿透与UPnP
对于小型办公网络,可以使用miniupnpd实现UPnP协议支持,允许内网设备自动请求端口映射。配置UPnP时需要注意安全限制:限制允许请求的IP范围、设置端口映射最大数量、启用客户端白名单。生产环境建议由管理员手动配置端口转发,避免UPnP带来的安全风险。
▶九、负载均衡NAT
# 使用iptables实现简单的负载均衡转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.102:80
# 或者使用随机分配
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.101
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.102
▶十、NAT排障与调试
端口转发排障步骤:验证内网服务器自身能否正常提供服务、确认内核ip_forward已开启、检查所有相关iptables规则语法、确认FORWARD链默认策略为ACCEPT、使用tcpdump在内外网两侧分别抓包对比、检查系统日志中的iptables LOG记录。常见的NAT问题多为FORWARD链未配置或规则顺序错误。
▶十一、源NAT地址池与端口复用
当大量内网用户通过同一个公网IP上网时,端口耗尽是一个常见问题。配置SNAT地址池可以让多个公网IP分担出站连接的端口分配,显著提升并发连接容量。使用iptables的SNAT目标配合多IP轮询,配置端口范围限制和超时缩短提高端口利用效率。配合连接跟踪优化,可以支持单台NAT设备处理数十万并发连接。
▶十二、IPv6 NAT配置与过渡技术
虽然IPv6地址充足一般不需要NAT,但在过渡时期仍需要IPv4和IPv6互通。NAT64/DNS64技术允许纯IPv6客户端访问IPv4网络,配置Tayga或Jool实现IPv6到IPv4的地址转换和端口映射。对于双栈环境,合理配置NAT64前缀和DNS64规则确保用户无感知地访问IPv4资源。
▶十三、NAT网关的高可用部署
NAT网关是网络出口的单点故障隐患,需要配置主备模式实现高可用。使用Keepalived实现虚拟IP漂移,两台NAT服务器共享一个VIP,主服务器故障时备用服务器自动接管所有NAT连接。iptables规则和连接跟踪表需要定期同步到备用服务器,方法包括使用conntrackd工具同步连接表状态确保故障切换时现有连接不中断。
NAT网关的性能瓶颈通常在于并发连接处理能力,使用多队列网卡和多核心绑定的方式提升NAT处理性能。不同网卡分配独立的中断队列避免CPU核心竞争。大型NAT网关需要配置专门的iptables规则优化,减少不必要的连接跟踪减轻CPU负担。
注册
登录控制台
