重启后使用 ipset 的规则
Posted
技术标签:
【中文标题】重启后使用 ipset 的规则【英文标题】:rules with ipset after restart 【发布时间】:2016-03-08 17:26:37 【问题描述】:我使用的是 Debian 8,我有 ipset v6.23 和 iptables v1.4.21。我在 rules.v4 文件中放置了一个带有 ipset 的规则,然后我用 netfilter-persistent 服务重新启动了 iptables。当我重新启动时,iptables 列表为空。 但是如果在文件中我没有用 ipset 设置规则,重启后 iptables 列表是正确的。
谁能帮帮我?
pd:有问题的规则,
iptables -A OUTPUT -p icmp --icmp-type echo-request -m set --match-set test dst -j DROP
当我在重启后执行 netfilter-persistent status 时出现下一个错误:
netfilter-persistent.service - netfilter persistent configuration
Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled)
Active: failed (Result: exit-code) since Tue 2016-02-23 08:14:47 CET; 39s ago
Process: 251 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=1/FAILURE)
Main PID: 251 (code=exited, status=1/FAILURE)
Feb 23 08:14:47 debian netfilter-persistent[251]: run-parts: executing /usr/share/netfilter-pers...art
Feb 23 08:14:47 debian netfilter-persistent[251]: run-parts: /usr/share/netfilter-persistent/plu...e 2
Feb 23 08:14:47 debian netfilter-persistent[251]: run-parts: executing /usr/share/netfilter-pers...art
Feb 23 08:14:47 debian systemd[1]: netfilter-persistent.service: main process exited, code=exit...LURE
Feb 23 08:14:47 debian systemd[1]: Failed to start netfilter persistent configuration.
Feb 23 08:14:47 debian systemd[1]: Unit netfilter-persistent.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.
【问题讨论】:
您可以编辑您的问题以包含有问题的规则吗? @Yoel 我编辑了这个问题,谢谢。 如果我理解正确,则执行命令成功,但在 rules.v4 文件中包含规则失败。你能显示包含规则的那个文件的内容吗? @Yoel 不,这两种方式都不起作用,只有当 Iptables 只有没有 ipset 的规则时才有效。当我在文件中使用 ipset 在控制台中输入规则时,当我重新启动时 iptables 为空,如果我查看 netfilter-persistent 的状态出现错误。 直接调用命令出现什么错误? 【参考方案1】:netfilter-persistent 不保存来自 ipset 系统的值。我认为没有官方的 debian 方式来保存
我建议你放弃使用 netfilter-persistent 并手动进行配置。
我在 /etc/network/interfaces 中进行设置
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
gateway 192.168.1.254
up ipset create inbound hash:ip counters
up ipset create inbound443 hash:ip counters
up iptables-restore /var/lib/iptables/default
/var/lib/iptables/default 是使用 iptables-save 命令转储的我的 iptables 设置。
你需要“up ipset create test hash:ip”
如果网络上有 IPv6,您也需要对 IPv6 执行相同操作。
【讨论】:
【参考方案2】:问题
netfilter-persistent
不保存和恢复 ipset 并且不理解它们,因此在由 netfilter-persistent
调用的 iptables-restore
命令期间缺少名为 test
的 ipset 集。 rules.v4
文件中的 ipset 规则对于 iptables-restore 命令来说是垃圾。
解决方案 #1 - 简单的一个
我不知道有任何 Debian 软件包处理这种情况。
您可以手动为 ipsets 安装 netfilter-persistent 插件。
下载:
https://github.com/freeyoung/netfilter-persistent-plugin-ipset/ 或 https://github.com/dungdm93/netfilter-persistent-plugins/在 Debian 上将文件 10-ipset
复制到 /usr/share/netfilter-persistent/plugins.d/
并使其可执行 (# chmod +x 10-ipset
)。
您的 ipset 规则将进入 /etc/ipset/rules
(对于 dungdm93 的插件)或 /etc/iptables/rules.ipset
(对于 freeyoung 的版本)。
解决方案 #2 – DIY(未测试)
你当然可以在没有插件的情况下自己保存和恢复 ipset 规则,但是……你知道 :-)
保存 ipset 规则(包括 set create 命令)# ipset save >/etc/iptables/rules.ipset
。
编辑/etc/network/interfaces
文件:
auto eth0
iface eth0 inet static
address …
netmask …
gateway …
…
pre-up ipset restore </etc/iptables/rules.ipset
这应该可以。但它不会在重启时保存您的 ipset 规则。
【讨论】:
【参考方案3】:对于 debian buster 或 ubuntu disco,我们有新的包 ipset-persistent 和 iptables-persistent,这可能是您想要的解决方案。
这里有一些有用的说明:
https://dhtar.com/make-ipset-and-iptables-configurations-persistent-in-debianubuntu.html
【讨论】:
以上是关于重启后使用 ipset 的规则的主要内容,如果未能解决你的问题,请参考以下文章
python 将gfwlist转换成带IPSET的的dnsmasq规则,适用于OpenWrt的智能上网