Linux 下的 NAT(网络地址转换) 配置通常通过内核自带的 netfilter 框架完成,常用的配置工具为 iptables(适用于 IPv4)和 nftables(新一代替代方案)。本文将从基础概念到具体命令,介绍在 Linux 上配置 NAT 的完整流程。

NAT 主要分为两类:SNAT(源地址转换) 和 DNAT(目的地址转换)。SNAT 通常用于局域网主机共享公网出口,而 DNAT 常用于将公网流量转发到内网服务。此外,MASQUERADE 是 SNAT 的一种特殊形式,适用于动态获取的外网 IP 地址。
在开始配置之前,请确认 Linux 内核已经开启 IP 转发 功能。可以通过修改内核参数实现:
echo 1 > /proc/sys/net/ipv4/ip_forward
此命令会立即生效但不持久。若需永久开启,请编辑 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的配置文件,添加或修改如下行:
net.ipv4.ip_forward = 1
随后运行 sysctl -p 使修改生效。
使用 iptables 配置 SNAT(静态公网 IP):假设内网网卡为 eth1,外网网卡为 eth0,内网网段为 192.168.1.0/24,公网 IP 为 203.0.113.5。在 POSTROUTING 链上添加规则:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5
该规则表示:从 192.168.1.0/24 网段发出且从 eth0 离开的数据包,将源地址改写为 203.0.113.5。
使用 MASQUERADE(动态公网 IP):如果外网接入方式为 PPPoE 或 DHCP,地址会动态变化,推荐使用 MASQUERADE。其规则如下:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
相较 SNAT,MASQUERADE 能够自动获取出口接口的当前 IP,但会带来轻微性能损耗,适合小型网络。
使用 DNAT 配置端口转发:若希望外网用户通过公网 IP 的 TCP 80 端口访问内网服务器 192.168.1.100 上的 Web 服务,需要在 PREROUTING 链添加 DNAT 规则:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
同时,为了保证响应流量能够正确返回,还需在 POSTROUTING 链中配置反向转换(通常结合 SNAT 或 MASQUERADE 让内网服务器感知源地址为网关)。例如:
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1
其中 192.168.1.1 是网关内网接口的 IP。这会使得外部访问内网服务器的数据包在转发时同时修改源地址,以确保内网服务器将响应直接回送给网关。
无论配置 SNAT 还是 DNAT,都必须确保 FORWARD 链 允许转发流量。例如,在内网完全信任的情况下,可以执行:
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
第一条允许内网到外网的转发,第二条允许来自外网且属于已有连接响应的数据包进入内网。对于 DNAT 场景,还需放行转发到内网服务器目标端口的流量。
配置完成后,可以使用 iptables -t nat -L -n -v 查看当前 NAT 规则,验证规则是否生效。也可通过 conntrack -L 查看连接跟踪表。
若要让 NAT 配置在系统重启后依然有效,需要将规则保存到持久化文件。在基于 Debian/Ubuntu 的系统中,安装 iptables-persistent 并执行:
netfilter-persistent save
或者手动执行:
iptables-save > /etc/iptables/rules.v4
在 RHEL/CentOS 系列中,可以使用 service iptables save 或 iptables-save > /etc/sysconfig/iptables,具体取决于系统版本和服务管理方式。
对于使用 nftables 的现代 Linux 发行版(如 RHEL 9、Debian 11),推荐使用 nft 命令配置 NAT。首先需要定义表:
nft add table nat
创建 SNAT 规则(需指定链类型和钩子):
nft add chain nat postrouting { type nat hook postrouting priority 100 \;
nft add rule nat postrouting ip saddr 192.168.1.0/24 oifname "eth0" snat ip 203.0.113.5
MASQUERADE 规则为:
nft add rule nat postrouting ip saddr 192.168.1.0/24 oifname "eth0" masquerade
DNAT 规则示例:
nft add chain nat prerouting { type nat hook prerouting priority -100 \;
nft add rule nat prerouting tcp dport 80 dnat to 192.168.1.100:80
同时,需要添加转发性规则(在 forward 链中)并确保 ip_forward 已开启。保存 nftables 配置可使用 nft list ruleset > /etc/nftables.conf 或使用发行版的持久化机制。
最后,配置 NAT 时需要注意以下要点:防火墙策略 必须兼容 NAT 规则,避免出现数据包被 FORWARD 链丢弃的情况;如果系统启用了 SELinux 或 AppArmor,可能需要调整相关布尔值或配置;在同时存在 IPv6 的环境中,IPv6 的 NAT 配置需使用 ip6tables 或 nftables 的 ip6 地址族;建议在配置之前备份现有规则,并逐条测试,以免影响线上业务。
综上所述,Linux 配置 NAT 的核心在于启用内核 IP 转发、在 nat 表 中正确放置 POSTROUTING 和 PREROUTING 规则,并确保 FORWARD 链允许必要的流量。根据外网地址是否固定选择 SNAT 或 MASQUERADE,根据访问方向选择 DNAT。掌握 iptables 与 nftables 两种用法,能够应对绝大多数 Linux NAT 配置场景。

查看详情

查看详情