如何使用 nftables 打开其他端口?

如何使用 nftables 打开其他端口?

我正在运行 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 inputip 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第一的。同时使用两者会给您带来更多麻烦。如果您需要同时使用两者,这里有一些额外的相关问答,我在其中回答了这个问题(提示:可能需要数据包标记):

相关内容