为什么 Iptables 持久服务不保存我的更改?

为什么 Iptables 持久服务不保存我的更改?

我跟着在 ubuntu 12.04 上设置 IP 规则的教程。设置时一切正常 - 但现在我对防火墙进行了更改,这些更改在重新启动后不会保留。我不明白为什么会这样。这是我如何使用 iptables-persistent 的演示。我究竟做错了什么?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back

答案1

iptables-persistent不是这样的。重新启动iptables-persistent“服务”并不会捕获iptables的当前状态并保存;它所做的只是恢复上次配置包时保存的 iptables 规则。

要配置iptables-persistent,您需要告诉它您当前的 iptables 规则集。

实现这一目标的一种方法如下:

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

或者,等效地,该iptables-persistent包还提供以下内容:

dpkg-reconfigure iptables-persistent

(您需要对是否保存规则的问题回答“是”。)

之后,下次iptables-persistent启动/重新启动时,将加载您期望的 iptables 规则集。

答案2

保存当前 iptables 规则的非常简单的方法是使用以下命令:

sudo service netfilter-persistent save

使用上述方法(至少在 Ubuntu 中安装netfilter-persistent(和iptables-persistent)包后有效),无需手动运行 iptables 命令或重新配置包(如上面接受的答案所建议的那样)。

答案3

$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

这不是它的DROP意思或作用。来自man iptables

...特殊值接受,降低,排队或返回。 ACCEPT 表示让数据包通过。下降意味着将数据包扔到地板上。 队列的意思是...

所以您所做的就是添加一条新规则。它可以有效地取代许多其他规则,但这些规则仍然存在。

当检查这样的东西(你的iptables -L输出)时,我会喂它而grep "string unique to this rule"不是用你的眼睛。这样做更容易、更快,而且更不容易出错。

iptables -L | grep "some unique string"

如果要删除规则,请使用开关-D;手册页描述了两种形式:

-D, --删除链规则规范

-D, --删除链规则号

从所选链中删除一条或多条规则。该命令有两个版本:可以将规则指定为链中的数字(第一个规则从 1 开始)或要匹配的规则。

答案4

正如所解释的@史蒂文星期一,您可以自行将规则集保存在适当的目录中(即:/etc/iptables/rules.v{4,6})。

然而,@OpenITeX是对的:调用save的动作service netfilter-persistent更好。

截至今天(18.10),iptables-save 是内置的,iptables-persistent但是不是安装。因此,调用的插件目录service netfilter-persistent是空的,服务打印出规则集已保存,但事实并非如此。

TLDR:安装iptables-persistent并检查插件目录是否/usr/share/netfilter-persistent/plugins.d包含插件。


我是这样想出来的:

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

然后检查/usr/sbin/netfilter-persistent脚本,注意它调用了外部脚本:

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

然后我注意到那/usr/share/netfilter-persistent/plugins.d是空的。

相关内容