nftablesで本サーバへの接続量を制限してみた

July 3, 2024 – 2:49 pm

自宅サーバーを運営すると必ず直面するのがスパムによる大量のアクセスだ。

これに対抗する手段のひとつとして、特定のIPアドレスからの単位時間あたりの接続数が一定数を超えた場合には、一定時間、このIPアドレスからのアクセスを遮断することが考えらえる。

nftablesの使用法についてRed Hatのドキュメントのなかに、「nftablesを使用した接続数の制限」というのを見つけた。そのなかに、具体的に「1分以内に新しいTCP接続を11個以上試行するIPアドレスのブロック」の方法が示されていた。

この方法をわがサーバーにも採用させてもらうことにした。

まず、IPv4アドレスの動的SET denylist を作成。このSETでは、ここに登録されたアドレスを一定時間後に自動的に削除する。このテーブルは以下のnftコマンドで生成される:

# nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }

ここで、パラメータ timeout 5m で登録後の持続時間を5分となる。

次に、1分以内に新規TCP接続を10個以上確立しようとするホストのソースIPアドレスを denylistセットに自動的に追加するルールをtableに追加。

# nft add rule ip filter input ip protocol tcp ct state new, untracked limit rate over 10/minute add @denylist { ip saddr }

dnylist セットに登録されたIPアドレスからの接続をすべて破棄するルールを追加。

# nft add rule ip filter input ip saddr @denylist drop

以上の手続きで作成されたrulesetの関連部を以下に示す:

    set denylist {
          type ipv4_addr
          size 65535
          flags dynamic,timeout
          timeout 5m
          elements = { 3.224.220.101 timeout 5m expires 1m27s67ms, 17.241.219.202 timeout 5m expires 2m55s650ms,
                       23.22.35.162 timeout 5m expires 1m39s825ms, 34.87.102.213 timeout 5m expires 3m35s500ms,
                       40.77.167.43 timeout 5m expires 1m32s672ms, 52.70.240.171 timeout 5m expires 1m36s137ms,
                       52.167.144.20 timeout 5m expires 35s846ms, 66.249.79.67 timeout 5m expires 1m9s26ms,
                       139.59.40.65 timeout 5m expires 3m54s286ms, 152.228.220.143 timeout 5m expires 26s871ms,
                       156.96.56.22 timeout 5m expires 4m38s128ms, 157.55.39.12 timeout 5m expires 4m6s269ms,
                       185.106.92.74 timeout 5m expires 1m21s881ms, 194.124.75.19 timeout 5m expires 43s410ms }
        }

    chain input {
          type filter hook input priority filter; policy accept;
     (省略)
          ip protocol tcp ct state new,untracked limit rate over 10/minute add @denylist { ip saddr }
          ip saddr @denylist drop
      (主略)
    }

  


Post a Comment