iptables
的 NAT(Network Address Translation)表用于对网络流量进行地址转换,主要用于修改数据包的源地址(SNAT)或目标地址(DNAT)。这在一些常见的网络应用场景中非常有用,比如端口转发、IP 伪装等。
NAT 表通常用于以下几种目的:
- 源地址转换(SNAT):将出站数据包的源 IP 地址修改为另一个地址,通常用于实现内网访问外网。
- 目标地址转换(DNAT):将入站数据包的目标 IP 地址修改为另一个地址,通常用于端口转发。
- 端口映射(Port Forwarding):通过 DNAT 将来自外部的请求转发到内部服务器。
- MASQUERADE:一种特殊的 SNAT,通常用于动态 IP 地址的情形,常见于家庭网络或使用 DHCP 的场景。
NAT 表中的链
在 iptables
的 NAT 表中,通常有以下三个链:
- PREROUTING:在路由决策之前对进入的数据包进行处理。
- POSTROUTING:在路由决策之后对即将离开网络接口的数据包进行处理。
- OUTPUT:处理由本机发起的本地流量。
iptables
NAT 表常见命令和用途
1. 源地址转换(SNAT)
源地址转换通常用于内网访问外网时,修改数据包的源地址为网关或路由器的公共 IP 地址。
假设内网机器的 IP 地址为 192.168.1.2
,外网网关的公共 IP 地址为 203.0.113.1
,你希望将内网流量的源地址改为 203.0.113.1
,可以使用以下命令:
sudo iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth0 -j SNAT --to-source 203.0.113.1
-t nat
:指定使用 NAT 表。-A POSTROUTING
:在数据包离开本机之前(POSTROUTING 链)处理数据包。-s 192.168.1.2
:匹配源 IP 地址为192.168.1.2
的数据包。-o eth0
:指定通过eth0
网卡发送的流量(通常是外网网卡)。-j SNAT
:目标是源地址转换(SNAT)。--to-source 203.0.113.1
:将源地址修改为203.0.113.1
。
2. 目标地址转换(DNAT)
目标地址转换通常用于端口转发,将外部流量转发到内部网络中的指定机器。例如,假设你希望将外部对 203.0.113.1:8080
的请求转发到内部服务器 192.168.1.100:80
。
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-t nat
:指定使用 NAT 表。-A PREROUTING
:在数据包进入路由决策之前(PREROUTING 链)进行处理。-p tcp
:匹配 TCP 协议的数据包。--dport 8080
:匹配目标端口为8080
的数据包。-j DNAT
:目标是目标地址转换(DNAT)。--to-destination 192.168.1.100:80
:将目标地址修改为192.168.1.100
,并且转发到该机器的端口80
。
3. MASQUERADE(伪装)
MASQUERADE
是 SNAT
的一种特殊形式,通常用于动态 IP 地址的场景。例如,在家庭网络中,路由器会通过 MASQUERADE
将所有内网设备的源 IP 地址改为路由器的公共 IP 地址。
假设你希望将内网流量的源 IP 地址伪装为外网接口的公共 IP,可以使用如下命令:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-o eth0
:指定通过eth0
网卡发送的流量。-j MASQUERADE
:使用伪装(MASQUERADE)来修改源 IP 地址为本机的公共 IP 地址。
4. 端口映射
如果你想要将外部请求的特定端口转发到内部网络的其他端口,可以使用端口映射。比如,将外部对 203.0.113.1:8080
的请求转发到内部服务器 192.168.1.100
的 9090
端口:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:9090
5. 重定向端口(Redirect)
有时你可能希望将某个端口的流量重定向到同一台机器的其他端口。例如,将所有进入 203.0.113.1:8080
的流量重定向到 80
端口:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
-j REDIRECT
:将流量重定向到指定的端口。--to-port 80
:重定向到本机的80
端口。
查看和删除 NAT 表规则
-
查看 NAT 表规则 要查看当前 NAT 表中的规则,可以使用以下命令:
sudo iptables -t nat -L -v
这会列出所有 NAT 表中的规则及其详细信息。
-
删除 NAT 表规则 删除 NAT 表中的规则,你可以使用
-D
选项。例如,删除一个已经添加的 DNAT 规则:sudo iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-
清空 NAT 表规则 如果想要清空所有 NAT 表中的规则,可以使用:
sudo iptables -t nat -F
保存 NAT 表规则
在大多数 Linux 发行版中,iptables
的规则默认不会在重启后保留。你可以使用 iptables-save
和 iptables-restore
命令保存和恢复规则。
-
保存规则(Debian/Ubuntu 系统):
sudo iptables-save > /etc/iptables/rules.v4
-
恢复规则:
sudo iptables-restore < /etc/iptables/rules.v4
总结
iptables
的 NAT 表非常强大,能够处理各种网络地址转换需求,常用于内网访问外网、端口转发和网络共享等场景。掌握如何配置源地址转换(SNAT)、目标地址转换(DNAT)和端口映射等功能,可以帮助你在 Linux 系统上实现复杂的网络配置和防火墙策略