如何在 Debian 10 buster 给 nftables 防火墙开放端口

3CX 之前基于 Linux 的服务器都是使用 debian 9 ,debian 9 上使用的防火墙是 iptables。我们想要在防火墙上开放 12000 的 udp 端口可以使用下面的命令:

iptables -A INPUT -p udp --dport 12000 --jump ACCEPT

最近 3CX 的测试版放出后,服务器更新后就会自动升级成 debian 10。有这部分需求的用户可能会发现原来的命令不能使用了,因为 debian 10 中已经使用 nftables 替换了 iptables。

为什么要替换 iptables 呢?

因为 iptables 发展到今天,有一些难以解决的问题。比如可扩展性,性能问题,代码维护等一系列的问题。

iptables 和 nftables 的主要区别在那里?

在iptables中,默认有几个表(filter,nat)和链(FORWARD,INPUT…)。在nftables中,没有默认的表/链。

另外,在 iptables 中,每条规则只有一个目标(-j ACCEPT,-j LOG …)。在 nftables 中,你可以在一条规则中执行几个动作。

nftables 包括内置的数据集功能。在 iptables 中是没有的,需要一个单独的工具:ipset。

在 iptables 框架中,每个系列都有很多命令:iptables、ip6tables、arptables、ebtables。现在,nftables 允许你在一个单一的 CLI 工具中实现所有功能。

nftables 具有一个新的 Linux 内核子系统,称为 nf_tables。新的引擎机制受到类似 BPF 系统的启发,有一组基本表达式,可以组合起来建立复杂的过滤规则。

如果在 nftables 上开放端口

我们可以使用下面命令查看 nft 的 tables 和 chains。

$ nft list ruleset

可以看到 3CX 把要用的端口都加入到 nftables 的表格里面。

nftables 里的配置文件在 /etc/nftables.conf。我们可以使用 vim 或者 nano 之类的文本编辑器打开,里面能看到一些配置:

可以看到里面为 3CX 以及一些其他的服务都开放了端口。如果我们想要加上新的端口可以参考以下命令:

udp dport { 12000 } counter accept comment "for test"

上面的命令意思分别是:

  • udp:流量的类型。可以使用 tcp/udp/icmp 等协议。
  • dport:指 destination port,目的地端口。
  • 括号中的为端口号,使用逗号分隔,连续端口使用 – 表示。
  • counter:表示计数。可以查看有多少数据包访问。
  • accept:表示接收数据。drop 表示丢弃。
  • comment:表示备注。

3CX 使用的 cs state new 表示网络的连接状态。分为 new,established,related,untracked 。一般我们可以不设置。

设置好后保存,然后重启服务器。重启 nftables 服务可能会不生效,因为 3CX 的 nftables 配置文件目录其实是在 /var/lib/3cxpbx/Bin/nftables.conf

重启完成后我们可以输入命令 nft list ruleset 看一下配置是否生效了。