Iptables之nat配置
概述
iptables 是 Linux 内核自带的包过滤防火墙,NAT(网络地址转换)是其核心功能之一。本文档详细介绍 SNAT 和 DNAT 的配置方法,涵盖内网主机上网、外网访问内网服务等典型场景。
核心概念:
- SNAT(Source NAT):修改数据包的源 IP,用于内网主机通过网关访问外网
- DNAT(Destination NAT):修改数据包的目标 IP/端口,用于将外网请求映射到内网服务
- 前提条件:网关服务器需开启 IP 转发功能
基础准备:开启 IP 转发
1. 临时开启(重启失效,用于测试)
echo 1 > /proc/sys/net/ipv4/ip_forward2. 永久开启(生产环境推荐)
编辑 /etc/sysctl.conf:
net.ipv4.ip_forward = 1使配置生效:
sysctl -p场景 1:SNAT(内网主机通过网关访问外网)
环境假设
- 网关服务器:
- 内网网卡
eth1,IP:192.168.1.2 - 外网网卡
eth0,IP:203.0.113.10
- 内网网卡
- 内网主机:
192.168.1.100,网关指向192.168.1.2 - 内网网段:
192.168.1.0/24
需求
内网主机通过网关公网 IP 访问外网。
配置命令
方式一:固定公网 IP(SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10方式二:动态公网 IP(MASQUERADE)
适用于 ADSL 拨号、DHCP 等 IP 不固定的场景:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE参数说明
| 参数 | 说明 |
|---|---|
-t nat |
操作 nat 表 |
-A POSTROUTING |
在路由后、发送前修改源 IP |
-s 192.168.1.0/24 |
匹配内网网段流量 |
-o eth0 |
出站网卡(外网网卡) |
--to-source |
替换后的源 IP(网关公网 IP) |
验证方法
# 内网主机 ping 外网 IP
ping 223.5.5.5
# 网关查看 NAT 规则
iptables -t nat -L POSTROUTING -n
# 查看连接追踪
conntrack -L | grep 192.168.1.100场景 2:DNAT(外网访问内网服务)
环境假设
- 网关服务器:外网网卡
eth0(IP:203.0.113.10),内网网卡eth1(IP:192.168.1.1) - 内网服务器:
192.168.1.200,提供 Web 服务(80 端口)和 SSH 服务(22 端口) - 需求:
- 外网访问
203.0.113.10:80→ 转发到192.168.1.200:80 - 外网访问
203.0.113.10:2222→ 转发到192.168.1.200:22
- 外网访问
配置命令
1. Web 服务映射(80 端口)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.200:802. SSH 服务映射(2222 → 22)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.200:223. 放行入站流量(如默认策略为 DROP)
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT参数说明
| 参数 | 说明 |
|---|---|
-A PREROUTING |
在路由前修改目标 IP/端口 |
-i eth0 |
入站网卡(外网网卡) |
--dport 80 |
匹配外网请求的目标端口 |
--to-destination |
转发后的内网目标地址 |
验证方法
# 外网测试 Web 服务
curl http://203.0.113.10
# 外网测试 SSH 服务
ssh -p 2222 用户名@203.0.113.10
# 网关查看 DNAT 规则
iptables -t nat -L PREROUTING -n
# 查看连接状态
netstat -an | grep :80保存 NAT 规则
CentOS/RHEL
# 保存规则
iptables-save > /etc/sysconfig/iptables
# 设置开机自启
systemctl enable iptables && systemctl restart iptablesUbuntu/Debian
# 安装持久化工具
apt-get install -y iptables-persistent
# 保存规则
netfilter-persistent save常用管理命令
| 操作 | 命令 |
|---|---|
| 查看所有 NAT 规则 | iptables -t nat -L -n -v |
| 查看 PREROUTING 链 | iptables -t nat -L PREROUTING -n |
| 查看 POSTROUTING 链 | iptables -t nat -L POSTROUTING -n |
| 删除 PREROUTING 规则 | iptables -t nat -D PREROUTING <序号> |
| 清空 PREROUTING 链 | iptables -t nat -F PREROUTING |
| 清空 POSTROUTING 链 | iptables -t nat -F POSTROUTING |
| 查看连接追踪 | conntrack -L |
常见问题与注意事项
NAT 不生效
- 检查 IP 转发是否开启:
cat /proc/sys/net/ipv4/ip_forward
# 返回 1 才正确- 检查网卡名称是否正确:
ip addr - 检查规则顺序,PREROUTING 需在 POSTROUTING 之前匹配
内网访问公网 IP 映射无效
内网主机访问网关公网 IP 时,DNAT 生效但返回路径未经过 SNAT,需添加规则:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80云服务器 DNAT 无效
云服务器(阿里云、腾讯云等)的公网 IP 为弹性 IP,需在云控制台配置安全组或端口转发,开放对应端口,否则外网流量无法到达服务器。
规则重启后丢失
确认已执行保存操作(iptables-save 或 netfilter-persistent save)。
删除规则
# 查看规则及序号
iptables -t nat -L PREROUTING -n --line-numbers
# 按序号删除
iptables -t nat -D PREROUTING 3