为什么使用以下 nftables 规则时 SSH 会挂起?

为什么使用以下 nftables 规则时 SSH 会挂起?
$ 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" acceptoif "lo" accept

相关内容