Linux上实现NAT需开启IP转发,配置iptables的SNAT(出站修改源IP)和DNAT(入站修改目的IP),并配合filter表允许转发,最后保存规则以确保重启后生效。

Linux上实现网络地址转换(NAT),核心是利用
iptables
NAT
iptables
要使用
iptables
1. 开启IP转发功能 在配置任何NAT规则之前,你的Linux系统必须开启IP转发功能,否则数据包无法在不同网络接口之间转发。
echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p # 确保修改立即生效
为了让这个设置在系统重启后依然有效,你需要编辑
/etc/sysctl.conf
net.ipv4.ip_forward = 1
2. 源地址转换(SNAT) SNAT主要用于内网主机通过一个共享的公网IP访问互联网。当内网主机的数据包离开Linux路由器时,其源IP地址会被修改为路由器的公网IP。
MASQUERADE
MASQUERADE
iptables -t nat -A POSTROUTING -o <你的公网出口网卡名> -j MASQUERADE
例如,如果你的公网网卡是
eth0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
SNAT
iptables -t nat -A POSTROUTING -o <你的公网出口网卡名> -j SNAT --to-source <你的公网IP地址>
例如,如果公网IP是
203.0.113.10
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.10
如果你有多个公网IP,也可以指定一个范围:
--to-source 203.0.113.10-203.0.113.20
3. 目的地址转换(DNAT) DNAT通常用于将外部网络(互联网)的请求,转发到内部网络中的特定服务器或服务。比如,你有一个Web服务器在内网,但希望通过公网IP的80端口访问它。
iptables -t nat -A PREROUTING -i <你的公网入口网卡名> -p tcp --dport <外部访问端口> -j DNAT --to-destination <内网服务器IP>:<内网服务端口>
例如,将公网
eth0
192.168.1.100
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
如果外部访问端口和内部服务端口相同,可以省略内部端口:
--to-destination 192.168.1.100
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.100
4. 配合FILTER
FILTER
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
这里的
eth0
eth1
5. 保存规则
iptables
apt-get install iptables-persistent netfilter-persistent save netfilter-persistent reload
yum install iptables-services systemctl enable iptables systemctl start iptables iptables-save > /etc/sysconfig/iptables
在较新的CentOS版本中,可能需要使用
firewalld
iptables
firewalld
要理解
iptables
NAT
iptables
NAT
PREROUTING
POSTROUTING
OUTPUT
数据包一进到Linux系统,如果它要被转发,最先碰到的就是
PREROUTING
PREROUTING
接着,数据包经过路由判断,决定是发给本地进程还是转发出去。如果它要发出去,在离开系统之前,会经过
POSTROUTING
POSTROUTING
还有一个
OUTPUT
OUTPUT
PREROUTING
POSTROUTING
所以,整个流程就像一个精密的流水线:数据包进来(
PREROUTING
POSTROUTING
NAT
配置SNAT和DNAT虽然看起来直接,但实际操作中有很多细节需要注意,否则很容易掉进坑里。
1. 网络拓扑和IP规划的清晰度: 在动手配置之前,务必画一张清晰的网络拓扑图,明确哪些是公网接口、哪些是内网接口,以及各个网段的IP地址规划。特别是内网服务器的IP地址,必须是静态的或者通过DHCP保留,这样DNAT才能稳定地转发到正确的目的地。如果你内网服务器的IP经常变动,DNAT规则很快就会失效。
2. 接口方向的准确性(-i 和 -o):
iptables
-i
-o
PREROUTING
-i
POSTROUTING
-o
3. 端口和协议的精确匹配: DNAT时,如果你只希望转发特定服务的请求,比如Web服务的80端口,就一定要指定
-p tcp --dport 80
4. MASQUERADE
SNAT
MASQUERADE
SNAT
--to-source <公网IP>
5. FILTER
FILTER
FORWARD
--state NEW,ESTABLISHED,RELATED
6. 环回问题(Hairpin NAT / NAT Loopback): 这是一个常见的坑。如果内网主机想通过公网IP访问内网的服务器(比如通过域名解析到公网IP),数据包会先到达路由器,然后DNAT到内网服务器。但如果路由器没有特殊处理,内网服务器收到的请求源IP是路由器的内网IP,而不是原始内网主机的IP,这可能导致一些应用识别客户端IP失败。更糟糕的是,响应包可能不会再次经过路由器,直接返回给请求主机,导致连接中断。解决这个问题通常需要额外的SNAT规则,将内网访问内网服务器的数据包的源IP也进行转换,或者在DNS层面解决。
7. 规则的顺序和持久化:
iptables
iptables-save
iptables-restore
iptables-persistent
让
iptables
1. 使用iptables-persistent
sudo apt-get install iptables-persistent
安装过程中,它会询问你是否保存当前的IPv4和IPv6规则。选择“是”,它就会将当前规则保存到
/etc/iptables/rules.v4
/etc/iptables/rules.v6
iptables
sudo netfilter-persistent save
这个命令会把当前内存中的
iptables
netfilter-persistent
sudo netfilter-persistent reload
2. 使用iptables-services
firewalld
iptables-services
iptables
sudo yum install iptables-services
sudo systemctl enable iptables # 设置开机自启动 sudo systemctl start iptables # 立即启动iptables服务
iptables
sudo iptables-save > /etc/sysconfig/iptables
这个命令会将当前内存中的IPv4规则导出到
/etc/sysconfig/iptables
iptables
sudo ip6tables-save > /etc/sysconfig/ip6tables
firewalld
iptables
firewalld
sudo systemctl stop firewalld sudo systemctl disable firewalld
然后才能启用
iptables
3. 通过自定义启动脚本 这是一个更通用的方法,适用于任何Linux发行版,但需要你手动创建和管理脚本。
创建规则文件: 将当前的
iptables
/etc/iptables/rules.sh
sudo iptables-save > /etc/iptables/rules.v4
创建加载脚本: 创建一个shell脚本,例如
/etc/rc.local
/etc/init.d/your_iptables_script
systemd
/etc/rc.local
#!/bin/bash /sbin/iptables-restore < /etc/iptables/rules.v4 exit 0
确保
/etc/rc.local
sudo chmod +x /etc/rc.local
systemd
.service
# /etc/systemd/system/iptables-restore.service [Unit] Description=Restore iptables rules Before=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/sbin/iptables-restore < /etc/iptables/rules.v4 ExecStop=/sbin/iptables-save > /etc/iptables/rules.v4 RemainAfterExit=yes [Install] WantedBy=multi-user.target
然后启用并启动这个服务:
sudo systemctl enable iptables-restore.service sudo systemctl start iptables-restore.service
无论你选择哪种方法,核心思想都是在系统启动时,将你保存的
iptables
以上就是Linux如何使用iptables实现网络地址转换的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号