我跟着这在 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
是空的。