我正在运行 Debian Linux 服务器。
我需要打开一些防火墙端口;通常这对于 iptables 来说很简单,但是这个服务器正在运行 nftables。
当我打开conf文件时,它没有显示规则:
cx:/etc# cat nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
}
chain forward {
type filter hook forward priority 0;
}
chain output {
type filter hook output priority 0;
但如果我列出规则,我就可以看到它们:
:/etc# nft list ruleset
table inet filter {
chain input {
jump phonesystem
}
chain phonesystem {
ip daddr 224.0.1.75 counter packets 0 bytes 0 accept
tcp dport { http, https, sip, sip-tls, 5062, 5090 } ct state new counter packets 0 bytes 0 accept
udp dport { sip, 5090, 7000-10999 } counter packets 0 bytes 0 accept
}
}
table ip filter {
chain INPUT {
meta l4proto tcp tcp dport 22 counter packets 0 bytes 0 accept
jump phonesystem
}
chain phonesystem {
ip daddr 224.0.1.75 counter packets 0 bytes 0 accept
tcp dport { http, https, sip, sip-tls, 5062, 5090 } ct state new counter packets 0 bytes 0 accept
udp dport { sip, 5090, 7000-10999 } counter packets 0 bytes 0 accept
}
chain FORWARD {
type filter hook forward priority 0; policy accept;
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
meta l4proto tcp tcp dport 22 counter packets 0 bytes 0 accept
}
}
table ip6 filter {
chain INPUT {
jump phonesystem
}
chain phonesystem {
tcp dport { http, https, sip, sip-tls, 5062, 5090 } ct state new counter packets 0 bytes 0 accept
udp dport { sip, 5090, 7000-10999 } counter packets 0 bytes 0 accept
}
chain FORWARD {
type filter hook forward priority 0; policy accept;
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
}
table ip security {
chain INPUT {
type filter hook input priority 150; policy accept;
}
chain FORWARD {
type filter hook forward priority 150; policy accept;
}
chain OUTPUT {
type filter hook output priority 150; policy accept;
}
现在我想打开,例如端口4001。
我已经尝试了许多对 IP 表和链式电话系统的命令,但总是出现语法错误。很好奇我哪里出错了!
例如
:/etc# nft add rule ip filter input tcp dport 4001 accept
Error: Could not process rule: No such file or directory
add rule ip filter input tcp dport 4001 accept
或者
:/etc# nft add rule ip phonesystem tcp dport 4001 counter accept
Error: syntax error, unexpected tcp, expecting string
add rule ip phonesystem tcp dport 4001 counter accept
如果我想打开更多端口,我该如何将其添加到电话系统链中?
答案1
你的系统默认情况下使用iptables-nft
而不是iptables-legacy
:
从 Debian Buster 开始,nf_tables 是使用 iptables 时的默认后端,通过 iptables-nft 层(即,通过 nf_tables 内核子系统使用 iptables 语法)。这也会影响 ip6tables、arptables 和 ebtables。
工具配置iptables因此正在使用iptables-nft
而不是iptables-legacy
。所以可见nftables也。同样的情况也发生在ip6tables
.
所以nft list ruleset
实际显示的是inet
原生定义的族(双IPv4+IPv6)nftables通过/etc/nftables.conf
和iptables
其他配置或工具完成的命令的结果。
您不应该更改ip filter INPUT/OUTPUT/FORWARD
链等中的规则,否则iptables
稍后当无法从链中翻译回来时可能会失败nftables 兼容性APIiptables。同样,nft
可能无法解码所有iptables' 链,因为他们可能仍然使用不可翻译的iptables匹配或目标。当前规则集中并非如此(或者#
有时会显示带注释 ( ) 的行)。
看起来ip filter INPUT
(以及ip6 filter INPUT
)仍然inet filter input
以某种方式损坏(问题中的某个地方也必须有错误的剪切/粘贴,链的重复phonesystem
看起来很可疑),因为它没有显示为基础链,而是显示为用户/常规链:应该首先使其type filter hook input priority 0; policy accept;
成为在数据包路径中使用 Netfilter 挂钩的基本链。如果没有这个,这里就不会发生输入过滤。或者,如果这是剪切/粘贴错误,这会阻止知道默认输入策略是否是丢弃数据包(否则为什么需要接受它们?),这会影响我最后的建议。
来回答这个问题。您每次都会犯语法错误:要么是错误的链名称(区分大小写),要么缺少强制的表名称。本来可以工作但随后会妨碍命令的进一步使用的iptables
命令是:
nft add rule ip filter INPUT tcp dport 4001 accept
nft add rule ip filter phonesystem tcp dport 4001 counter accept
无论如何不要这样做。
用于iptables-save
显示规则集iptables格式,并iptables
照常使用来更改规则,因为它是使用以下命令创建的iptables
(系统地查看计数器规则提示):
iptables -A INPUT -p tcp --dport 4001 -j ACCEPT
iptables -A phonesystem -p tcp --dport 4001 -j ACCEPT
您可以自由地在 inet 过滤表中添加规则,因为不会有使用冲突。或者您可以创建自己的表来满足您的需求,只要它的名称不会与iptables(-通过 nft API):
例如:
nft add table ip myowntable
nft add chain ip myowntable mycustominput '{ type filter hook input priority 10; policy accept; }'
请注意,存在交互作用。当一个数据包在链中丢失时,它会永远保持丢失状态。当一个数据包在链中被接受时(例如: ),它仍然可以在相同的钩子/类型(例如:或)ip filter INPUT
中的链钩子中被丢弃。所以这是有道理的:inet filter input
ip myowntable mycustominput
丢弃的数据包不会被恢复:
nft add rule ip myowntable mycustominput tcp dport 5555 drop
但下面不会有帮助(接受它ip myowntable mycustominput
不会阻止它被其他规则删除之前的其他地方ip filter INPUT
):
nft add rule ip myowntable mycustominput tcp dport 4001 accept
结论:如果系统上有其他工具正在使用iptables
,请继续使用iptables
或切换到该工具nftables第一的。同时使用两者会给您带来更多麻烦。如果您需要同时使用两者,这里有一些额外的相关问答,我在其中回答了这个问题(提示:可能需要数据包标记):