Iptables之nat配置

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_forward

2. 永久开启(生产环境推荐)

编辑 /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 端口)
  • 需求:
    1. 外网访问 203.0.113.10:80 → 转发到 192.168.1.200:80
    2. 外网访问 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:80

2. SSH 服务映射(2222 → 22)

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.200:22

3. 放行入站流量(如默认策略为 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 iptables

Ubuntu/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 不生效

  1. 检查 IP 转发是否开启:
cat /proc/sys/net/ipv4/ip_forward
# 返回 1 才正确
  1. 检查网卡名称是否正确:ip addr
  2. 检查规则顺序,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-savenetfilter-persistent save)。

删除规则

# 查看规则及序号
iptables -t nat -L PREROUTING -n --line-numbers

# 按序号删除
iptables -t nat -D PREROUTING 3

参考链接