经常使用iptables的应该都会用到ipset,这是一个强化iptables集合功能的必备工具,ipset唯一的瑕疵可能就是基于内存的,需要定期手动保存到本地,并且每次重启Linux后,还需要重新恢复ipset,如果iptables里使用了ipset合集的话,没有重新恢复ipset还会造成iptables运行失败,这对于服务器安全来说带来了很大的不变。

ipset.jpg

今天,明月分享个通用性比较还适用于各个Linux发行版的办法,来解决这个问题,目前在Debian Linux下测试通过。

保存ipset规则

ipset save > /etc/iptables/ipset

创建Systemd服务文件

新建/etc/systemd/system/ipset-restore.service,内容如下:

[Unit]
Description=Restore IPSet Rules
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ipset restore -f /etc/iptables/ipset

[Install]
WantedBy=multi-user.target

确保服务在 After=network.target 之后启动

使用 Requires=network.target 确保网络就绪

启用服务

systemctl daemon-reload
systemctl enable ipset-restore.service

验证这个自启动服务状态:

systemctl status ipset-restore.service

结果应该显示 "active (exited)" 状态

说白了就是了自己创建一个自启动服务在每次重启Linux的时候自动恢复ipset,我们仅仅需要定期手动的存储ipset到指定位置文件即可。当然,也可以利用systemctl在关机重启时自动导出保存ipset到指定文件,配合启动自动恢复。

ipset-with-iptables.png

只需要创建 systemd 服务文件

vim /etc/systemd/system/save-ipset.service

内容如下:

[Unit]
Description=Save IPSet Rules on Shutdown
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
Requires=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ipset save > /etc/iptables/ipset
TimeoutStartSec=0

[Install]
WantedBy=halt.target reboot.target shutdown.target

保存,退出

启用服务

sudo systemctl daemon-reload
sudo systemctl enable save-ipset.service
最后修改:2025 年 08 月 08 日
如果觉得我的文章对你有用,请随意赞赏