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


18

我按照教程在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

我注意到iptables -D INPUT规则不存在sudo,您确定它确实在报告成功吗?如果您在内部运行它,行为是否会改变sudo
Bratchley 2014年

Answers:


41

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规则集。


9

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

sudo service netfilter-persistent save

使用上面的命令(至少在安装netfilter-persistent(和iptables-persistent)软件包后才在Ubuntu中工作),不需要手动运行iptables命令或重新配置软件包(甚至是上面接受的Answer所建议的)。


sudo service netfilter-persistent save还是sudo service netfilter-persistent save .?(点末)

感谢您指出,正确的命令是在行尾没有点。相应地更正了答案。
OpenITeX

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

那不是什么DROP意思或没有。来自man iptables

...特殊值ACCEPT,DROP, QUEUE或RETURN。ACCEPT表示让数据包通过。DROP意味着将数据包丢在地板上。 QUEUE的意思是...

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

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

iptables -L | grep "some unique string"

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

-D,-删除链规则规范

-D,-删除链规则数

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


对不起,目前尚不清楚。我正在使用-D选项来删除规则。看到上面的变化
bernie2436

3
-D代表“删除”而不是“ DROP”在谈论时,用术语“ DROP”来表示除跳转目标以外的其他任何东西iptables都令人困惑。
Bratchley 2014年

1

@ steven-monday所述,您可以将自己的规则集保存在适当的目录(即:)中/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是空的。


1

安装iptables-persistent:

sudo apt install iptables-persistent

进行所需的更改后保存规则:

sudo netfilter-persistent save
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.