導入
IptablesはLinuxディストリビューション用のソフトウェアファイアウォールです。このチートシートスタイルのガイドは、一般的な日常シナリオで役立つファイアウォールルールを作成するiptablesコマンドのクイックリファレンスを提供します。これには、ポート、ネットワークインターフェース、およびソースIPアドレスによってさまざまなサービスを許可またはブロックするiptablesの例が含まれます。
このガイドの使用方法
- ここで説明されているほとんどのルールは、あなたのiptablesがデフォルトの入力ポリシーを介して着信トラフィックをDROPしていると想定しており、着信トラフィックを選択的に許可したいと考えています
- 達成しようとしていることに該当するその後のセクションを使用してください。ほとんどのセクションは他に依存していないため、以下の例を独立して使用できます
- このページの右側にある目次メニュー(幅広いページ幅では)またはブラウザの検索機能を使用して必要なセクションを見つけます
- 指示されたコマンドラインの例をコピーして貼り付け、ハイライトされた値を自分の値に置き換えます
ルールの順序が重要であることを念頭に置いてください。これらのすべてのiptables
コマンドは、新しいルールをチェーンの末尾に追加するために-A
オプションを使用しています。それをチェーンの別の場所に置きたい場合は、新しいルールの位置を指定する-I
オプションを使用できます(またはルール番号を指定しないことでチェーンの先頭に配置できます)。
注意:ファイアウォールを操作する際は、デフォルトでSSHトラフィック(ポート22)をブロックして自分自身をサーバーから排除しないように注意してください。ファイアウォール設定によりアクセスが失われた場合、ウェブベースのコンソールを介してアクセスを修復する必要があります。DigitalOceanを使用している場合は、詳細について当社のリカバリーコンソール製品ドキュメントをご覧ください。コンソールに接続したら、ファイアウォールルールを変更してSSHアクセスを許可するか(またはすべてのトラフィックを許可する)ことができます。保存されたファイアウォールルールがSSHアクセスを許可する場合、別の方法としてサーバーを再起動することができます。
現在のiptablesルールセットは、sudo iptables -S
およびsudo iptables -L
で確認できます。
では、iptablesコマンドを見てみましょう!
ルールの保存
iptablesルールは一時的なものであり、再起動後に維持するために手動で保存する必要があります。
Ubuntuでは、iptablesルールを保存する方法の1つとしてiptables-persistent
パッケージを使用します。次のようにaptでインストールします:
インストール中に、現在のファイアウォールルールを保存するかどうかを尋ねられます。
ファイアウォールルールを更新して変更を保存する場合は、次のコマンドを実行します:
他のLinuxディストリビューションには、iptablesの変更を永続化する別の方法がある場合があります。詳細については関連するドキュメントを参照してください。
ルールのリストと削除
iptablesのルールのリストと削除方法について学びたい場合は、このチュートリアルをご覧ください:iptablesファイアウォールルールのリストと削除方法。
一般的に便利なルール
このセクションには、ほとんどのサーバーで一般的に有用なルールを作成するためのさまざまなiptablesコマンドが含まれています。
ループバック接続を許可する
ループバック インターフェースは、コンピューターが自身へのネットワーク接続を転送するために使用するものです。たとえば、ping localhost
または ping 127.0.0.1
を実行すると、サーバーはループバックを使用して自身に ping を送信します。また、アプリケーションサーバーを localhost
アドレスでデータベースサーバーに接続するように構成した場合にも、ループバックインターフェースが使用されます。そのため、ファイアウォールがこれらの接続を許可していることを確認する必要があります。
ループバックインターフェースですべてのトラフィックを受け入れるには、次のコマンドを実行します:
確立されたおよび関連する受信接続を許可する
通常、ネットワークトラフィックは適切に機能するためには、双方向であることが必要です。つまり、サーバー自体が開始した出力接続の戻りトラフィックを許可するファイアウォールルールを作成するのが一般的です。このコマンドによってそれが許可されます:
確立された出力接続を許可する
すべての確立された接続のアウトバウンドトラフィックを許可することを検討してください。これらは通常、合法的な着信接続への応答です。このコマンドでそれを許可できます:
内部ネットワークが外部にアクセスすることを許可
eth0
が外部ネットワークであり、eth1
が内部ネットワークであると仮定して、内部から外部へのアクセスを許可するには、次のコマンドを実行します:
無効なパケットを破棄
一部のネットワークトラフィックパケットは無効としてマークされます。このタイプのパケットをログに記録することがあるかもしれませんが、通常はそれらを破棄しても問題ありません。次のコマンドを使用して行います:
IPアドレスをブロック
特定のIPアドレスから発信されるネットワーク接続をブロックするには、たとえば203.0.113.51
のようなIPアドレスを使用して次のコマンドを実行します:
この例では、-s 203.0.113.51
は ソース IP アドレスを “203.0.113.51” に指定しています。ソース IP アドレスは、許可 ルールを含む任意のファイアウォール ルールで指定できます。
接続を 拒否 して、接続要求に「接続拒否」エラーを返信する場合は、「DROP」を「REJECT」に置き換えます。
ネットワーク インターフェイスへの接続のブロック
特定の IP アドレス(例: 203.0.113.51
)から特定のネットワーク インターフェイス(例: eth0
)への接続をブロックするには、次のコマンドを使用します:
これは前述の例と同じですが、-i eth0
が追加されています。ネットワーク インターフェイスは、任意のファイアウォール ルールで指定でき、ルールを特定のネットワークに制限する素晴らしい方法です。
サービス: SSH
ローカル コンソールのないサーバーを使用している場合は、おそらく着信 SSH 接続(ポート 22)を許可してサーバーに接続して管理する必要があります。このセクションでは、さまざまな SSH 関連ルールでファイアウォールを構成する方法について説明します。
すべての着信SSHを許可する
すべての着信SSH接続を許可するには、次のコマンドを実行します:
2番目のコマンドは、OUTPUT
ポリシーが ACCEPT
に設定されていない場合にのみ必要です。established SSH 接続の送信トラフィックを許可するためのものです。
特定のIPアドレスまたはサブネットからの着信SSHを許可する
特定のIPアドレスまたはサブネットからの着信SSH接続を許可するには、ソースを指定します。たとえば、203.0.113.0/24
サブネット全体を許可したい場合は、次のコマンドを実行します:
2番目のコマンドは、OUTPUT
ポリシーが ACCEPT
に設定されていない場合にのみ必要です。established SSH 接続の送信トラフィックを許可するためのものです。
出力SSHを許可する
ファイアウォールのOUTPUT
ポリシーがACCEPT
に設定されていない場合、およびサーバーが他のサーバーに対してSSH接続を開始するために外部SSH接続を許可したい場合、次のコマンドを実行できます:
特定のIPアドレスまたはサブネットからの着信Rsyncの許可
Rsyncはポート873で実行され、1台のコンピューターから別のコンピューターにファイルを転送するために使用できます。
特定のIPアドレスまたはサブネットからの着信rsync接続を許可するには、送信元IPアドレスと宛先ポートを指定します。たとえば、サーバーに対して203.0.113.0/24
サブネット全体からrsyncを許可する場合は、次のコマンドを実行します:
確立済みのrsync接続の出力トラフィックを許可する2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
サービス:Webサーバー
ApacheやNginxなどのWebサーバーは、通常、HTTPとHTTPSの接続に対してそれぞれポート80と443でリクエストを待ち受けます。受信トラフィックのデフォルトポリシーがドロップまたは拒否に設定されている場合、サーバーがこれらのリクエストに応答できるようにするルールを作成する必要があります。
すべての着信 HTTP を許可する
すべての着信 HTTP(ポート 80)接続を許可するには、次のコマンドを実行します:
2番目のコマンドは、OUTPUT
ポリシーが ACCEPT
に設定されていない場合にのみ、確立された HTTP 接続のアウトバウンドトラフィックを許可するものです。
すべての着信 HTTPS を許可する
すべての着信 HTTPS(ポート 443)接続を許可するには、次のコマンドを実行します:
2番目のコマンドは、OUTPUT
ポリシーが ACCEPT
に設定されていない場合にのみ、確立された HTTP 接続のアウトバウンドトラフィックを許可するものです。
すべての着信 HTTP および HTTPS を許可する
HTTP および HTTPS トラフィックの両方を許可する場合は、multiport モジュールを使用して両方のポートを許可するルールを作成できます。すべての着信 HTTP および HTTPS(ポート 443)接続を許可するには、次のコマンドを実行します:
第2のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ、確立されたHTTPおよびHTTPS接続の送信トラフィックを許可するものです。
サービス: MySQL
MySQLはポート3306でクライアント接続を待ち受けています。MySQLデータベースサーバーがリモートサーバー上のクライアントによって使用されている場合は、そのトラフィックを許可する必要があります。
特定のIPアドレスまたはサブネットからのMySQLの許可
特定のIPアドレスまたはサブネットからのMySQLへの着信接続を許可するには、ソースを指定します。たとえば、203.0.113.0/24
サブネット全体を許可する場合は、次のコマンドを実行します:
第2のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ、確立されたMySQL接続の送信トラフィックを許可するものです。
特定のネットワークインターフェースへのMySQLの許可
特定のネットワークインターフェース(たとえば、プライベートネットワークインターフェースeth1
があるとします)にMySQL接続を許可するには、次のコマンドを使用します:
MySQL接続の確立された出力トラフィックを許可する2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
サービス:PostgreSQL
PostgreSQLはクライアント接続をポート5432で待機します。 PostgreSQLデータベースサーバーがリモートサーバーのクライアントによって使用されている場合は、そのトラフィックを許可する必要があります。
特定のIPアドレスまたはサブネットからのPostgreSQL
特定のIPアドレスまたはサブネットからの着信PostgreSQL接続を許可するには、ソースを指定します。 たとえば、203.0.113.0/24
サブネット全体を許可する場合は、次のコマンドを実行します:
OUTPUT
ポリシーがACCEPT
に設定されていない場合は、PostgreSQL接続の確立された出力トラフィックを許可するために、2番目のコマンドが必要です。
特定のネットワークインターフェースへのPostgreSQLの許可
特定のネットワークインターフェース(たとえば、プライベートネットワークインターフェースeth1
があるとします)へのPostgreSQL接続を許可するには、次のコマンドを使用します:
PostgreSQL接続の確立されたアウトバウンドトラフィックを許可する2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
サービス: メール
メールサーバー(SendmailやPostfixなど)は、メール配信に使用されるプロトコルに応じてさまざまなポートでリッスンします。メールサーバーを実行している場合は、使用しているプロトコルを特定し、適切な種類のトラフィックを許可してください。また、出力SMTPメールをブロックするルールの作成方法も説明します。
出力SMTPメールのブロック
サーバーが出力メールを送信しない場合は、その種類のトラフィックをブロックしたい場合があります。ポート25を使用する出力SMTPメールをブロックするには、次のコマンドを実行してください:
これはiptablesを設定して、ポート25のすべての送信トラフィックを拒否します。ポート25の代わりに他のサービスをポート番号で拒否する必要がある場合は、上記の25
をそのポート番号に置き換えてください。
すべての受信SMTPを許可
サーバーがポート25でSMTP接続に応答するようにするには、次のコマンドを実行してください:
すべての受信IMAPを許可
サーバーがIMAP接続、ポート143に応答するようにするには、次のコマンドを実行してください:
すべての受信IMAPSを許可
サーバーがIMAPS接続(ポート993)に応答するようにするには、次のコマンドを実行してください:
アウトバウンドトラフィックのIMAPS接続が許可されるようにする2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
すべての着信POP3を許可する
サーバーがPOP3接続(ポート110)に応答するようにするには、次のコマンドを実行してください:
アウトバウンドトラフィックのPOP3接続が許可されるようにする2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
すべての着信POP3Sを許可する
サーバーがPOP3S接続(ポート995)に応答するようにするには、次のコマンドを実行してください:
アウトバウンドトラフィックのPOP3S接続が許可されるようにする2番目のコマンドは、OUTPUT
ポリシーがACCEPT
に設定されていない場合にのみ必要です。
結論
それは、iptablesファイアウォールを設定する際に一般的に使用される多くのコマンドをカバーしているはずです。もちろん、iptablesは非常に柔軟なツールですので、ここでカバーされていない場合は、さまざまなオプションを組み合わせて、特定のニーズに合わせてコマンドを使い分けてください。
ファイアウォールの設定方法についてのヘルプをお探しの場合は、このチュートリアルを参照してください:サーバーを保護するための効果的なファイアウォールポリシーの選択方法。