$ cat /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table ip firewall {
chain input {
type filter hook input priority filter; policy drop;
iif "lo" accept
iif != "lo" ip daddr 127.0.0.0/8 drop
tcp dport 22 accept
ct state established,related accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy drop;
iif "lo" accept
udp dport { 53, 123 } accept
tcp dport { 53, 80, 443 } accept
ct state established,related accept
}
}
连接最终可以正常工作,但所花的时间比预期的要长得多。
正在运行journalctl -f
,我看到systemd[1]: Failed to start User Manager for UID 1000
连接已最终建立。
如果我运行nft flush ruleset
,连接立即有效。
答案1
对于传入连接,所有外部传入数据包都符合此规则:
iif != "lo" ip daddr 127.0.0.0/8 drop
因为它们来自一个非本地环回接口,并且它们的目标地址肯定不在 127.0.0.0/8 网络中。我很惊讶它即使在超时后也能通过,除非您还启动并运行了 IPv6。
对于所有本地发起的传出连接(非 DNS、NTP、HTTP 和 HTTPS),它们将遵循输出链丢弃策略。同样,除非您还启动并运行 IPv6,否则它们根本不会起作用。
答案2
发现问题了… 中的拼写错误chain output
应该iif "lo" accept
是oif "lo" accept
。