重启后使用 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的智能上网

iptables之ipset使用介绍

iptables一次性封多个ip,使用ipset 工具

Linux使用iptables设置黑白名单使用ipset工具

重启系统后iptables规则不生效,请求帮助解决

重启系统后iptables规则不生效,请求帮助解决