最近折腾完成pve的虚拟机环境后,也部署了几个虚拟机,昨天给软路由升级一下硬盘。升级完成后,重新开机后完成硬盘的分区,并把硬盘虚拟给了群晖。今天发现登录不上群晖的IP,经过好几次排查,检查发现iptebles的规则已经全部没有了。没办法只好重新设置一次,防止下次重启后再丢失NAT规则,我尝试使用以下方法。

使用iptables保存机制

在设置好了iptables规则后,下次重启后还是会被清除,所以我们需要把它保存起来,使用 iptables-save 命令来进行备份。

  • 保存现有iptables规则到 /etc/iptables-rules
1
iptables-save > /etc/iptables-rules
  • 重启后恢复iptables规则

修改网卡文件,当网卡重启的时候自动执行恢复命令

1
vim /etc/network/interfaces
  • 找到网卡eth0的那一节,在节后末尾加上载入恢复命令
1
pre-up iptables-restore < /etc/iptables-rules

pve

  • 查看备份规则
1
cat /etc/iptables-rules

iptables-rules

  • 清理当前iptables规则,⚠️ 注意要在已经备份完成的时候进行删除
1
2
3
iptables -F
iptables -X
iptables -Z

iptables

  • 重启当前主机,看会不会重置规则
1
iptables -L -n --line-numbers

iptables

iptables的规则会在重启或者开机的时候,会自动载入规则,新增iptables规则后建议也执行 iptables-save

直接写在网卡配置文件

表达含义
pre-up网卡启用前的动作
up启用时候的动作
post-up启用后的动作
pre-down关闭前的动作
down关闭时动作
post-down关闭后动作
  • 编辑网卡文件,在末尾写上相关iptables规则
1
vim /etc/network/interfaces
  • 直接写在网卡的配置,每次重启的时候就自动加载规则
1
2
3
4
5
6
7
8
9
10
11
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o esn5 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o ens5 -j MASQUERADE

# iptables NAT

post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 113 -j DNAT --to-destination 10.10.10.10:22
post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 1000:1099 -j DNAT --to-destination 10.10.10.10

post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 223 -j DNAT --to-destination 10.10.10.11:22
post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 1100:1199 -j DNAT --to-destination 10.10.10.11

iptables

这个方法有两个弊端

  • 每条转发规则都要配置2行,分别是post-up时添加规则和post-down时删除规则。好像不写 post-down 也没有事情,应该是防止多条规则覆盖。特别是使用了iptables-persistent 这个软件包。

  • 修改转发规则后,必须执行 service networking restart 重启网卡才能使修改生效。而重启网卡会导致整机瞬间断网,如果有需要保持长连接的业务,会受到严重影响。

最终我选择第一个方法,第二个方法在测试的时候,修改了网卡文件然后重启了网卡,但是iptables规则并没有生效,要重启母鸡才可以。