nftables服务无法启动且配置文件存在语法错误,请求协助排查
看起来你的nftables配置文件里的集合(set)定义存在语法问题,这直接导致了服务启动失败。咱们来一步步排查修复:
问题分析
你遇到的报错信息如下:
/etc/nftables.conf:10:13-13: Error: syntax error, unexpected junk
nft[371]: set tcp_ok {
/etc/nftables.conf:11:19-19: Error: syntax error, unexpected junk, expecting newline or semicolon or .
type inet_service
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
systemd[1]: Failed to start nftables.
从报错可以看出,解析器在处理tcp_ok等集合的定义时遇到了语法问题。在nftables的语法规则里,即使集合暂时没有元素,也需要明确声明元素部分,否则解析器会认为配置不完整,抛出语法错误。你当前的配置里,tcp_ok、udp_ok、trusted、filter这几个set只有类型声明,缺少了必要的元素定义或者闭合语法。
修正后的配置文件
把每个空集合补充elements = {}来完成定义,修正后的完整配置如下:
#!/usr/bin/env nft -f flush ruleset define interface = "venet0" table inet filter { set tcp_ok { type inet_service elements = {} } set udp_ok { type inet_service elements = {} } set trusted { type ipv4_addr elements = {} } set filter { type ipv4_addr elements = {} } set martians { type ipv4_addr flags constant, interval elements = { 0.0.0.0/8, 127.0.0.0/8 } } chain input { type filter hook input priority 0 policy drop ct state established,related accept iif lo accept iifname $interface ip saddr @trusted accept ip saddr @filter drop ip saddr @martians drop ip daddr @martians drop iifname $interface tcp dport 22 accept iifname $interface tcp dport @tcp_ok accept iifname $interface udp dport @udp_ok accept } }
验证与启动
- 先测试配置文件是否合法,执行命令:
如果没有报错,说明配置语法正确。nft -f /etc/nftables.conf - 再启动nftables服务:
systemctl start nftables - 可以用
systemctl status nftables查看服务状态,确认是否正常运行。
补充说明
之后你可以根据自己的需求,往对应的set里添加元素,比如给tcp_ok添加允许的TCP端口:
set tcp_ok { type inet_service elements = { 80, 443 } }
备注:内容来源于stack exchange,提问作者MKDE

