ナレッジベース

まともな nftables のベースライン

インスタンスが実際に必要とするものを許可し、SSH をレート制限し、書き込み中に自分自身をロックアウトしないデフォルト・ドロップのルールセット。

1つのファイアウォールであって、2つではない

Debian 13 は nftables を /etc/nftables.conf とそれをロードするサービスとともに出荷しています。AlmaLinux 10 は nftables の上に firewalld を搭載し、そのサービスは /etc/sysconfig/nftables.conf がインクルードするものを読み取ります。1つを選んでください。firewalld を手書きのルールセットと一緒に実行すると、どちらでもないルールセットが生成されます。

systemctl disable --now firewalld     # AlmaLinux, if going manual
systemctl enable --now nftables

ルールセット

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  set ssh_flood {
    type ipv4_addr
    flags dynamic, timeout
    timeout 1h
  }

  chain input {
    type filter hook input priority filter; policy drop;

    ct state established,related accept
    ct state invalid drop
    iif lo accept

    ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
    ip6 nexthdr ipv6-icmp accept

    tcp dport 22 ct state new add @ssh_flood { ip saddr limit rate over 6/minute } drop
    tcp dport 22 accept
    tcp dport { 80, 443 } accept
    udp dport 443 accept

    counter comment "dropped by policy"
  }

  chain forward {
    type filter hook forward priority filter; policy drop;
  }

  chain output {
    type filter hook output priority filter; policy accept;
  }
}

人々が間違える部分:

  • ICMPv6 は意図的に全面的に許可されています。近隣探索とパケット過大の両方がそこにあり、手でフィルタリングすると IPv6 が壊れ、1日半の間アプリケーションのバグとして見えます。
  • ssh_flood セットは、1分間に6つの新しい接続を超えるアドレスを1時間のタイムアウトリストに追加します。ログパーサーも cron ジョブもセカンドデーモンもありません。
  • IPv6 の場合、type ipv6_addr でセットを複製し、ip6 saddr でルールを複製します。セットはシングルファミリーです。
  • udp dport 443 は QUIC のためにあります。提供しない場合は削除してください。

自分をロックアウトせずにロードする

systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.conf

最初のコマンドは、2分でルールセットをクリアする一時ユニットをスケジュールし、その名前を出力します。新しいセッションを開いてください。機能する場合は、タイマーを停止します:

systemctl stop run-u1234.timer

機能しない場合は、待つと、マシンが自動的に戻れるようにします。空のルールセットはフィルタリングがないことを意味するので、一晩置いておくのではなく、仕事を終わらせてください。

実際に何をしているかを確認する

nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood

-a はハンドルを表示します。これにより、ファイルを書き換えずに単一のルールを削除できます:

nft delete rule inet filter input handle 12

カウンターは誰も尋ねない質問に答えます: 1週間後にゼロのルールは、間違っているか不要であり、その両方を知る価値があります。

トレース

パケットがルールセットが示すとおりに動作しない場合:

nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor trace

トレースルールは後で削除してください。それは無料ではなく安価です。

ホストファイアウォールが対象としないもの

それはポリシーをフィルタリングし、フラッドはフィルタリングしません。ボリューム攻撃は、ポートに到達するずっと前にエッジでドロップされ、インスタンス上のルールは、すでに処理されたパケットに CPU を費やすだけです。詳細は DDoS保護 を参照してください。

永続化

nft list ruleset > /etc/nftables.conf
systemctl restart nftables

エクスポートされたファイルの先頭に shebang と flush ruleset 行を戻してください。それらがないと、次のロードは実行中のルールセットに追加され、置き換えられず、すべてのルールが2回表示されます。

準備はできている

都市を選べ。サイズを選べ。コインで支払え。

あなたが誰かに関するフォームも、承認する人間を待つ必要も、確認のための電話もありません。請求が完了すれば、認証情報があなたの受信トレイに届きます。