如何使iptables 80转8080的端口转发规则重启后持久生效?
解决iptables端口转发重启后失效的问题
问题回顾
你已经成功设置了端口转发,把80端口的请求转到8080:
sudo iptables -A PREROUTING -t nat -i enp0s25 -p tcp --dport 80 -j REDIRECT --to-port 8080
现在能正常通过webapp/访问,但重启系统后就失效了——这是因为iptables的规则默认是临时存储在内存里的,系统重启后会被自动清空。下面是几种稳定可靠的解决方式:
方法一:用iptables-persistent保存并自动加载规则(推荐)
这是Debian/Ubuntu系最常用的方式,专门用来持久化iptables规则:
- 先把当前生效的规则保存到配置文件:
sudo mkdir -p /etc/iptables # 如果目录不存在就创建 sudo iptables-save > /etc/iptables/rules.v4 - 安装iptables-persistent工具:
安装过程中会弹出提示,问你是否保存当前的IPv4/IPv6规则,直接选Yes就好。以后每次修改iptables规则后,记得重新执行sudo apt update && sudo apt install iptables-persistentiptables-save命令更新配置文件,这样重启后就能自动加载最新规则了。
方法二:自定义systemd服务加载规则
如果不想安装额外工具,可以自己写一个systemd服务来实现开机加载:
- 创建服务配置文件:
sudo nano /etc/systemd/system/iptables-restore.service - 粘贴以下内容进去:
[Unit] Description=Restore Persistent iptables Rules Before=network.target # 确保在网络启动前加载规则 [Service] Type=oneshot ExecStart=/sbin/iptables-restore < /etc/iptables/rules.v4 RemainAfterExit=yes [Install] WantedBy=multi-user.target - 保存退出后,先把当前规则保存到文件:
sudo iptables-save > /etc/iptables/rules.v4 - 启用并启动服务:
这样每次开机时,systemd就会自动帮你加载保存的iptables规则。sudo systemctl enable iptables-restore.service sudo systemctl start iptables-restore.service
方法三:添加到rc.local(适合老旧系统)
如果你的系统还在使用rc.local(比如一些CentOS 7之前的版本或自定义系统),可以把规则命令直接加到里面:
- 编辑rc.local文件:
sudo nano /etc/rc.local - 在
exit 0这一行之前添加你的iptables命令:iptables -A PREROUTING -t nat -i enp0s25 -p tcp --dport 80 -j REDIRECT --to-port 8080 - 确保rc.local有执行权限:
这样系统开机时会自动执行rc.local里的命令,重新添加端口转发规则。sudo chmod +x /etc/rc.local
小提醒
- 如果你同时在用
ufw或者firewalld这类防火墙管理工具,它们可能会覆盖直接设置的iptables规则,建议统一用一种方式管理防火墙,避免冲突。 - 不管用哪种方法,设置完后最好重启一下系统测试一下,确认端口转发能正常工作,避免影响用户访问。
内容的提问来源于stack exchange,提问作者Aravind S




