Linuxファイアウォールの実践的設定ガイド: iptables vs. nftables

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

新しいLinuxサーバーをデプロイしました。次は何をしますか?

クラウドに新しいLinuxサーバーを立ち上げたばかりだとします。公開IPアドレスがあり、SSHでログインでき、アプリケーションをデプロイする準備ができています。しかし、待ってください。他のことをする前に、セキュリティについて話す必要があります。現在、そのサーバーは白紙の状態です。ファイアウォールがなければ、それは本質的に無防備な標的です。自動化されたボットやスキャナーが、まさにこのような脆弱なマシンを常にインターネット上で探査しています。

サーバーを無防備なままにしておくことは、非常に大きなリスクです。開いているポートを持つ実行中のすべてのサービスは、侵入者にとっての潜在的なドアとなります。これらのドアをロックする時が来ました。

問題の根源:フィルタリングされていないネットワークポート

ポート80/443のWebサーバーやポート22のSSHのようなネットワークサービスは、接続を受け入れるためにポートを開く必要があります。デフォルトのLinuxインストールでは、多くの場合、インターネット上の誰もがこれらのポートをノックするのを止めるものは何もありません。新しくデプロイされたサーバーは、オンラインになってから最初の1時間以内に、何千もの自動ポートスキャンとログイン試行を受ける可能性があります。

これらの自動化されたスクリプトは、IP範囲を24時間365日スキャンします。SSHパスワードを総当たりで攻撃したり、既知の脆弱性を悪用したり、その他の侵入方法を見つけようとします。解決策は、そもそもサーバーに到達するトラフィックを正確に制御することです。それがファイアウォールの仕事です。

Linuxでは、カーネルのパケットフィルタリングフレームワークはNetfilterと呼ばれています。長年、私たちはiptablesというツールでNetfilterを管理してきました。しかし今日では、その現代的でより効率的な後継であるnftablesが中心的な役割を担うようになりました。

使用するツール:iptables vs. nftables

Linuxファイアウォールについて調べると、すぐに2つの名前が浮かび上がります:iptablesnftablesです。その違いを理解することが、現代的で安全なサーバーを構築する鍵となります。

クラシック:iptables

iptablesは非常に長い間標準でした。Linuxを数年以上使ったことがあるなら、間違いなく使ったことがあるでしょう。そのロジックは、別々のテーブル(filternatなど)とルールのチェーン(INPUTOUTPUTなど)の上に構築されています。

典型的なiptablesのルールセットは次のようになります:

# 受信SSH接続を許可
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 確立済みの接続を許可(戻りのトラフィックに不可欠)
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 他のすべての受信トラフィックをデフォルトでドロップ
sudo iptables -P INPUT DROP

効果的ではありますが、iptablesには欠点があります:

  • 複雑さ: 構文が冗長で、混乱を招く可能性があります。間違いを犯しやすいです。
  • IPv4/IPv6の分離: IPv6には完全に別のツール(ip6tables)と重複したルールセットが必要です。これは現代のネットワークでは本当に頭の痛い問題です。
  • パフォーマンス: ルールセットが大きくなるにつれて、iptablesは遅くなる可能性があります。すべてのパケットが長いルールの連鎖に対して一つずつチェックされる必要があり、遅延を引き起こす可能性があります。

現代的な後継:nftables

nftablesは、iptablesの欠点を修正するためにゼロから設計されました。新しい統一されたコマンドラインツールと、はるかにクリーンな構文を提供します。Debian、Ubuntu、Fedoraを含むほとんどの現代的なLinuxディストリビューションは、現在デフォルトでnftablesを使用しています。

その主な利点は次のとおりです:

  • 統一されたフレームワーク: 単一のnftコマンドで、IPv4、IPv6、およびARPのルールを管理します。もうiptablesip6tablesarptablesを使い分ける必要はありません。
  • アトミックな更新: ルールセット全体を単一のアトミックな操作で置き換えることができます。これにより、更新中に一時的なファイアウォールの隙間や構文エラーによって接続が失われるのを防ぎます。
  • 優れたパフォーマンス: ハッシュテーブルやセットのような、より効率的なデータ構造を使用します。これにより、特に何千ものルールがある場合でも、はるかに高速なパケット処理が可能になります。

新しいサーバーをデプロイする際には、nftablesから始めることを強くお勧めします。これは将来を見据えた選択です。

私のおすすめnftablesファイアウォール設定

堅牢で安全なベースラインファイアウォールをセットアップするためのステップバイステップガイドです。これは、私が新しい本番Webサーバーに使用するまさにその設定です。

まず、nftablesがインストールされていることを確認します。Debian/Ubuntuでは、sudo apt update && sudo apt install nftablesを実行します。RHEL/CentOS/Fedoraでは、sudo dnf install nftablesです。

1. 設定ファイルの作成

コマンドを一つずつ実行するのではなく、ファイアウォールを管理する最も信頼性の高い方法は設定ファイルを使用することです。これにより、ルールセットが読みやすく、バージョン管理しやすく、復元しやすくなります。/etc/nftables.confを作成して編集します:

sudo nano /etc/nftables.conf

2. ルールセットの構築

以下の設定をファイルに貼り付けます。各部分が何をするのかを以下で解説します。

#!/usr/sbin/nft -f

# クリーンな状態から始める
flush ruleset

# IPv4とIPv6の両方のためのメインテーブルを作成
table inet filter {
    # INPUTチェーン:サーバーへの受信トラフィック用
    chain input {
        # デフォルトポリシーはすべてをドロップ。これが最も安全な姿勢です。
        type filter hook input priority 0; policy drop;

        # --- 許可ルール(重要度順) ---

        # 1. ループバックインターフェースからのトラフィックを許可(ローカルサービス用)
        iifname "lo" accept

        # 2. 確立済みおよび関連する接続を許可(魔法のルール)
        ct state established,related accept

        # 3. ICMP (ping) を許可 - ネットワーク診断に便利
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # 4. SSH(ポート22)を許可 - 絶対に不可欠!
        tcp dport 22 accept

        # 5. Webサーバー用にHTTPとHTTPS(ポート80, 443)を許可
        tcp dport { 80, 443 } accept
    }

    # FORWARDチェーン:サーバーを通過するトラフィック用(例:ルーター)
    # 我々はサーバーであり、ルーターではないので、これはドロップします。
    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    # OUTPUTチェーン:サーバーからの送信トラフィック用
    chain output {
        # 我々自身の送信トラフィックはデフォルトで信頼します。
        type filter hook output priority 0; policy accept;
    }
}

設定の解説:

  • flush ruleset: 既存のすべてのルールを消去します。これにより、新しい設定がクリーンな状態で適用されることが保証されます。
  • table inet filter: `inet`ファミリーのために`filter`という名前の単一のテーブルを作成します。これはIPv4とIPv6の両方をエレガントに処理します。これはシンプルさにおける大きな勝利です。
  • chain input { policy drop; }: これが私たちのセキュリティポリシーの核心です。受信トラフィック用のチェーン(`input`)を定義し、そのデフォルトポリシーをdropに設定します。明示的な`accept`ルールに一致しないパケットは、静かに破棄されます。
  • iifname "lo" accept: ローカルループバックインターフェース上のすべてのトラフィックを許可します。多くのアプリケーションが自身と通信するためにこれを必要とします。
  • ct state established,related accept: これが魔法のルールです。コネクショントラッカー(`ct`)を使用して、サーバーが開始した接続に対する戻りのトラフィックを自動的に許可します。これがないと、送信リクエストはできますが、応答を受け取ることはできません。
  • tcp dport 22 accept: ポート22(SSH)への受信TCP接続を明示的に許可します。このルールを忘れると、自分のサーバーからロックアウトされます。
  • tcp dport { 80, 443 } accept: このように、ポートのセット(この場合は標準的なWebサーバー用)へのトラフィックを簡単に許可できることを示しています。
  • chain output { policy accept; }: シンプルにするため、すべての送信トラフィックを許可します。高セキュリティ環境ではこれをさらに制限するかもしれませんが、ほとんどのアプリケーションにとっては実用的で安全な出発点です。

このnftables設定は、私が新しいサーバーに必ず使用するベースラインです。本番環境で非常に安定していることが証明されており, 過度に複雑にすることなく堅牢なセキュリティを提供します。

3. ルールの適用と永続化

次に、新しいルールセットをロードし、nftablesサービスを有効にして、毎回の起動時に自動的に開始されるようにします。

# ファイルからルールをアトミックに適用
sudo nft -f /etc/nftables.conf

# 起動時にnftablesサービスが開始するように有効化
sudo systemctl enable nftables.service

# サービスを今すぐ開始
sudo systemctl start nftables.service

4. ルールセットの確認

有効なルールをクリーンで読みやすい形式で表示するには、次のコマンドを実行します:

sudo nft list ruleset

出力は、/etc/nftables.confファイルと完全に一致するはずです。これにより、ファイアウォールがアクティブであり、意図したとおりに正確に設定されていることが確認できます。

そして、これだけで、あなたのサーバーはもはや無防備な標的ではありません。不要なトラフィックへの扉を閉ざし、将来のための明確で保守可能な設定を提供する、堅牢で現代的なファイアウォールを構築しました。

Share: