IPSetを用いたProxmox VEでの国別IPブロック:ファイアウォールとパフォーマンスの最適化

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

わずか5分で数千のブルートフォース攻撃を阻止する

ProxmoxクラスターのSSHやWebポートをインターネットに公開している場合、/var/log/auth.logのログを確認してみてください。毎分、身に覚えのない多数のIPがパスワードを「推測」しようと試行を繰り返しているのがわかります。筆者の12台のVMを持つ個人ラボでは、一晩で5,000回以上のログイン失敗が記録されたことがあり、そのほとんどはユーザーが存在するはずのない国からのIPレンジによるものでした。

数千ものファイアウォールルールを手動で作成するのは不可能です。そこで**IPSet**が必要になります。CPUに1,000行もの個別のルールを照合させる代わりに、IPSetはそれらを1つのリストにまとめます。Linuxカーネルのハッシュテーブル(hash table)メカニズムにより、リストがいかに大きくても、IPがブラックリストに含まれているかどうかのチェックはほぼ瞬時に完了します。

クイックスタート:ファイアウォールの有効化と基本的なIPSetの作成

自動化を行う前に、Proxmoxのファイアウォール構造を理解する必要があります。このシステムは、データセンター(全体)、ノード(物理サーバー)、VM/CT(仮想マシン/コンテナ)の3つのレイヤーで管理されています。

ステップ1:データセンターレベルでファイアウォールを有効にする

  1. Proxmox Web UIにアクセスします。
  2. Datacenter > Firewall > Options を選択します。
  3. FirewallYes に設定します。

警告: 保存ボタンを押す前に、内部IPからのポート8006および22に対する ACCEPT ルールを必ず作成してください。そうしないと、サーバーから自分自身がロックアウトされてしまいます。

ステップ2:IPSetの初期化

Datacenter > Firewall > IPSetCreate をクリックします。名前を blacklist_country とします。これが、後でブロックしたいIPレンジを格納する「コンテナ」になります。

ステップ3:ブロックルールの適用

Datacenter > Firewall に移動し、以下のパラメータで Add を選択します:

  • Direction: in
  • Action: DROP
  • Source: +blacklist_country (ProxmoxにこれがIPSetリストであることを認識させるために、プラス記号は必須です)。
  • Enable: チェックを入れます。

なぜIPSetは通常のルールよりも優れているのか?

従来のiptablesルールを使用すると、システムはパケットを上から順にチェックします。5,000のIPレンジをブロックしている場合、5,001番目の正当なパケットは5,000回の比較プロセスを経る必要があります。これはCPUリソースの無駄遣いであり、ネットワーク遅延(レイテンシ)を増加させます。

IPSetを使用すると、Proxmoxはアルゴリズム計算量 O(1) を利用します。リストに10個のIPがあろうと100,000個あろうと、処理時間は変わりません。これは、最大帯域幅を維持しながらシステムを保護するための最良の方法です。

スクリプトによるGeoIPブロックの自動化

IPDenyから数千行のCIDRをWebインターフェースにコピー&ペーストするのは苦行です。私は通常、特定の国(例:中国 – CN、ロシア – RU)のIPリストを取得し、pvesh ツールを介してProxmoxに直接流し込むスクリプトを使用しています。

#!/bin/bash
# UI上で作成したIPSetの名前
IPSET_NAME="blacklist_cn"
COUNTRY_CODE="cn"

# 最新のIPレンジリストをダウンロード
curl -s -o /tmp/${COUNTRY_CODE}.zone http://www.ipdeny.com/ipblocks/data/countries/${COUNTRY_CODE}.zone

# 各行を読み込み、データセンターのIPSetに追加
while read -r line; do
    pvesh create /cluster/firewall/ipset/${IPSET_NAME} --cidr "$line" > /dev/null 2>&1
done < /tmp/${COUNTRY_CODE}.zone

echo "${COUNTRY_CODE} のブロックリストの更新が完了しました"

実行後、IPSetの blacklist_cn にネットワークレンジが自動的に追加されているのがわかります。このIPSetを指すDROPルールを1つ作成するだけで、その国からのすべての接続試行は玄関口で拒否されます。

管理者からの実践的なアドバイス

1. 盲目的にブロックしない

多くの人が見知らぬ国をすべてブロックする習慣がありますが、Cloudflareを使用している場合、Proxmoxレイヤーでの国別ブロックは、誤ってCloudflare의 IPまでブロックしてしまう可能性があります。まずはアプリケーションプロキシ(Application Proxy)レイヤーでのブロックを優先し、SSHなどの機密性の高いサービスにのみIPSetを使用するようにしてください。

2. 優先順位(Priority)のルール

Proxmoxでは、ルールは上から下へと実行されます。致命的なミスは、ACCEPTルールの下にDROPルールを配置することです。常に「**まず拒否し、その後に許可する**」ことを忘れないでください。IPSetルールは常にシーケンス0または1に配置しましょう。

3. 複数のVMにセキュリティグループ(Security Groups)を使用する

数十台のVMを管理している場合、個別にファイアウォールを設定しないでください。**Security Group**(例:Web-Protection)を作成し、そこにIPSetルールを追加してから、そのグループをすべてのVMに割り当てます。更新が必要なときは、1か所を修正するだけで済みます。

4. 定期的なログ監視

ブロックして終わりではありません。DROPルールで info レベルのログを有効にしてください。**Firewall** > **Log** を確認することで、潜在的な顧客を誤ってブロックしていないか、あるいは新たな攻撃パターンを特定して迅速に対応できているかを知ることができます。

まとめ

IPSetの使用は、Proxmoxを強固な盾に変えるプロフェッショナルな方法です。セキュリティが向上するだけでなく、ハードウェアのパフォーマンスも最適化されます。各国のIPレンジは時間の経過とともに変動するため、Cronjobを設定してスクリプトを週に一度などの頻度で定期実行することを忘れないでください。

Share: