我正在尝试在 ufw 中设置 iptables 规则,但我似乎误解了它的工作原理。除了描述的一般语法之外,我找不到任何可靠的文档这里。这是我的问题的简化版本:
在/etc/ufw/after.rules
我附加:
*filter
:ufw-user-input - [0:0]
:FOO-CHAIN - [0:0]
-A FOO-CHAIN -j ufw-user-input
-A FOO-CHAIN -j DROP
COMMIT
这个想法是FOO-CHAIN
,仅允许已允许的数据包ufw allow
,否则丢弃。
问题 - 当我ufw reload
一次时,规则被应用,但在第二次重新加载时,我开始得到一个常量ERROR: Could not load logging rules
。我发现的唯一解决办法是刷新整个表(iptables -F && iptables -X
)。
后续问题:
- 相反,使用它
ufw-user-forward
不会在重新加载时出现错误。这是为什么? - 为什么我必须通过 via
:ufw-user-input - [0:0]
或其他face来定义链ERROR: No such file or directory
?因为这是after.rules
文件,所以它应该在 后运行user.rules
,这意味着ufw-user-input
应该已经定义了。如果我将跳转更改为ufw-before-input
,我可以省略定义它,并且不会出现错误。
答案1
我遇到了同样的问题,我发现UFW内部检查iptables中是否存在ufw-user-input
链,以了解ufw是否处于启用或禁用状态。
使用ufw-user-input
in-A FOO-CHAIN -j ufw-user-input
将防止ufw-user-input
在执行ufw reload
或时删除 do ufw disable
,该链仍然存在,因为 iptables 不接受更改。那么UFW状态就会变得混乱甚至ufw status
崩溃。
ufw disable
您需要确保您的规则在或之后正确清理ufw reload
。
最简单的方法是添加iptables -F FOO-CHAIN || true
或类似删除ufw-user-input
中提到链的所有行/etc/ufw/before.init
。
/etc/ufw/before.init
set -e
case "$1" in
start)
# typically required
;;
stop)
# typically required
iptables -F FOO-CHAIN || true
# You may want to add other lines here to reset your chain in a desirable state if UFW is disabled like
# iptables -A FOO-CHAIN -j RETURN || true
;;
status)
# optional
;;
flush-all)
# optional
;;
*)
echo "'$1' not supported"
echo "Usage: before.init {start|stop|flush-all|status}"
;;
esac
不要忘记before.init
使用chmod +x /etc/ufw/before.init
.
我确认你需要:ufw-user-input - [0:0]
,这是由于UFW的内部,我认为ufw-user-input
是插入在after.rules
.