dnat核心是将公网流量重定向至内网指定服务器端口,必须配置在nat表的prerouting链,典型命令为:iptables -t nat -a prerouting -i eth0 -p tcp --dport 80 -j dnat --to-destination 192.168.1.100:80,并需配套放行forward链及确保ip转发开启。

DNAT规则的核心是让公网流量准确抵达内网某台服务器的指定端口,关键不在“加一条命令”,而在于链路完整、协议匹配、转发放行三者协同。
明确DNAT作用位置和触发时机
DNAT必须配置在**nat表的PREROUTING链**,这是数据包刚进入网关、尚未进行路由决策时的处理点。外网请求(比如 `curl http://203.101.50.80`)到达网关公网接口后,iptables会在此刻检查目标IP和端口,并按规则重写目标地址为内网服务IP。写出精准映射的DNAT命令
假设: - 网关公网IP为 `203.101.50.80`,监听 `eth0` 接口 - 内网Web服务器IP为 `192.168.1.100`,服务端口为 `80` - 仅允许TCP协议的HTTP访问则执行:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
注意:
-
-i eth0明确限定只处理从公网接口进来的包,避免规则误匹配内网流量 -
--dport 80必须与内网服务实际监听端口一致;若服务监听8080,这里也要写8080 -
--to-destination后不带协议前缀,只写IP:端口,不能写http://或加斜杠
配套放开转发并确保回程通路
DNAT只改目标地址,但Linux默认禁止转发非本机的数据包,必须显式放行: ```bash # 允许已建立连接的返回流量(必须放在最前) iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT允许从公网进、发往内网服务的新建连接
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
允许内网服务主动向外发起连接(如更新、日志上报等,按需开启)
iptables -A FORWARD -s 192.168.1.100 -j ACCEPT
其中 `eth1` 是网关连接内网的接口名,需按实际替换。 <h3>验证与持久化要点</h3> - 测试前确认内网服务已在 `192.168.1.100:80` 正常运行(如 `curl -I http://192.168.1.100`) - 从外网机器执行 `curl -v http://203.101.50.80`,观察是否返回内网页面内容而非连接超时或拒绝 - 规则重启即失效,需保存: ```bash iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu service iptables save # CentOS 7
- 若使用云平台NAT网关(如阿里云VPC NAT),DNAT需在控制台添加条目,不操作iptables,且EIP不能同时被SNAT和DNAT复用
不复杂但容易忽略










