我有 nftables 设置来拒绝与我的允许块不匹配的数据包(nft list ruleset
在下面添加),但是这些数据包被丢弃了。
对于上下文,我有一个服务监听端口 8080,只有 localhost 才能访问(目前)。我的设置允许这样做,但客户的请求超时而不是被拒绝。
这是我正在使用的规则集(为简洁起见略微截断),包括我用于调试的跟踪:
# nft list ruleset
table inet firewall {
set allowed_protocols {
type inet_proto
elements = { icmp, ipv6-icmp }
}
set allowed_interfaces {
type ifname
elements = { "lo" }
}
set allowed_tcp_dports {
type inet_service
elements = { 22, 80, 443 }
}
chain allow {
ct state established,related accept
meta l4proto @allowed_protocols accept
iifname @allowed_interfaces accept
meta nftrace set 1
tcp dport @allowed_tcp_dports accept
}
chain input {
type filter hook input priority 20; policy accept;
jump allow
meta nftrace set 1
reject
}
chain forward {
type filter hook forward priority 20; policy accept;
jump allow
meta nftrace set 1
reject
}
}
从我的跟踪中,我可以看到数据包被丢弃:
trace id 36f72c1b inet firewall allow rule meta nftrace set 1 (verdict continue)
trace id 36f72c1b inet firewall allow verdict continue
trace id 36f72c1b inet firewall input rule meta nftrace set 1 (verdict continue)
trace id 36f72c1b inet firewall input rule reject (verdict drop)
它明确读取拒绝,但随后决定放弃。知道这是什么原因吗?
在跟踪中看到
verdict drop
是正常的。拒绝仍然发送正确的 ICMP 错误,而不是简单地丢弃数据包。如果你想确定的话,你可以启动 Wireshark 并查看它们。是的,这令人困惑。