Iptables Essentials:一般的なファイアウォールルールとコマンド

導入

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でインストールします:

  1. sudo apt install iptables-persistent

インストール中に、現在のファイアウォールルールを保存するかどうかを尋ねられます。

ファイアウォールルールを更新して変更を保存する場合は、次のコマンドを実行します:

  1. sudo netfilter-persistent save

他のLinuxディストリビューションには、iptablesの変更を永続化する別の方法がある場合があります。詳細については関連するドキュメントを参照してください。

ルールのリストと削除

iptablesのルールのリストと削除方法について学びたい場合は、このチュートリアルをご覧ください:iptablesファイアウォールルールのリストと削除方法

一般的に便利なルール

このセクションには、ほとんどのサーバーで一般的に有用なルールを作成するためのさまざまなiptablesコマンドが含まれています。

ループバック接続を許可する

ループバック インターフェースは、コンピューターが自身へのネットワーク接続を転送するために使用するものです。たとえば、ping localhost または ping 127.0.0.1 を実行すると、サーバーはループバックを使用して自身に ping を送信します。また、アプリケーションサーバーを localhost アドレスでデータベースサーバーに接続するように構成した場合にも、ループバックインターフェースが使用されます。そのため、ファイアウォールがこれらの接続を許可していることを確認する必要があります。

ループバックインターフェースですべてのトラフィックを受け入れるには、次のコマンドを実行します:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A OUTPUT -o lo -j ACCEPT

通常、ネットワークトラフィックは適切に機能するためには、双方向であることが必要です。つまり、サーバー自体が開始した出力接続の戻りトラフィックを許可するファイアウォールルールを作成するのが一般的です。このコマンドによってそれが許可されます:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

確立された出力接続を許可する

すべての確立された接続のアウトバウンドトラフィックを許可することを検討してください。これらは通常、合法的な着信接続への応答です。このコマンドでそれを許可できます:

  1. sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

内部ネットワークが外部にアクセスすることを許可

eth0が外部ネットワークであり、eth1が内部ネットワークであると仮定して、内部から外部へのアクセスを許可するには、次のコマンドを実行します:

  1. sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

無効なパケットを破棄

一部のネットワークトラフィックパケットは無効としてマークされます。このタイプのパケットをログに記録することがあるかもしれませんが、通常はそれらを破棄しても問題ありません。次のコマンドを使用して行います:

  1. sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

IPアドレスをブロック

特定のIPアドレスから発信されるネットワーク接続をブロックするには、たとえば203.0.113.51のようなIPアドレスを使用して次のコマンドを実行します:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j DROP

この例では、-s 203.0.113.51ソース IP アドレスを “203.0.113.51” に指定しています。ソース IP アドレスは、許可 ルールを含む任意のファイアウォール ルールで指定できます。

接続を 拒否 して、接続要求に「接続拒否」エラーを返信する場合は、「DROP」を「REJECT」に置き換えます。

  1. sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

ネットワーク インターフェイスへの接続のブロック

特定の IP アドレス(例: 203.0.113.51)から特定のネットワーク インターフェイス(例: eth0)への接続をブロックするには、次のコマンドを使用します:

  1. iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

これは前述の例と同じですが、-i eth0 が追加されています。ネットワーク インターフェイスは、任意のファイアウォール ルールで指定でき、ルールを特定のネットワークに制限する素晴らしい方法です。

サービス: SSH

ローカル コンソールのないサーバーを使用している場合は、おそらく着信 SSH 接続(ポート 22)を許可してサーバーに接続して管理する必要があります。このセクションでは、さまざまな SSH 関連ルールでファイアウォールを構成する方法について説明します。

すべての着信SSHを許可する

すべての着信SSH接続を許可するには、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

2番目のコマンドは、OUTPUT ポリシーが ACCEPT に設定されていない場合にのみ必要です。established SSH 接続の送信トラフィックを許可するためのものです。

特定のIPアドレスまたはサブネットからの着信SSHを許可する

特定のIPアドレスまたはサブネットからの着信SSH接続を許可するには、ソースを指定します。たとえば、203.0.113.0/24 サブネット全体を許可したい場合は、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

2番目のコマンドは、OUTPUT ポリシーが ACCEPT に設定されていない場合にのみ必要です。established SSH 接続の送信トラフィックを許可するためのものです。

出力SSHを許可する

ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合、およびサーバーが他のサーバーに対してSSH接続を開始するために外部SSH接続を許可したい場合、次のコマンドを実行できます:

  1. sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

特定のIPアドレスまたはサブネットからの着信Rsyncの許可

Rsyncはポート873で実行され、1台のコンピューターから別のコンピューターにファイルを転送するために使用できます。

特定のIPアドレスまたはサブネットからの着信rsync接続を許可するには、送信元IPアドレスと宛先ポートを指定します。たとえば、サーバーに対して203.0.113.0/24サブネット全体からrsyncを許可する場合は、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

確立済みのrsync接続の出力トラフィックを許可する2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

サービス:Webサーバー

ApacheやNginxなどのWebサーバーは、通常、HTTPとHTTPSの接続に対してそれぞれポート80と443でリクエストを待ち受けます。受信トラフィックのデフォルトポリシーがドロップまたは拒否に設定されている場合、サーバーがこれらのリクエストに応答できるようにするルールを作成する必要があります。

すべての着信 HTTP を許可する

すべての着信 HTTP(ポート 80)接続を許可するには、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

2番目のコマンドは、OUTPUT ポリシーが ACCEPT に設定されていない場合にのみ、確立された HTTP 接続のアウトバウンドトラフィックを許可するものです。

すべての着信 HTTPS を許可する

すべての着信 HTTPS(ポート 443)接続を許可するには、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

2番目のコマンドは、OUTPUT ポリシーが ACCEPT に設定されていない場合にのみ、確立された HTTP 接続のアウトバウンドトラフィックを許可するものです。

すべての着信 HTTP および HTTPS を許可する

HTTP および HTTPS トラフィックの両方を許可する場合は、multiport モジュールを使用して両方のポートを許可するルールを作成できます。すべての着信 HTTP および HTTPS(ポート 443)接続を許可するには、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第2のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ、確立されたHTTPおよびHTTPS接続の送信トラフィックを許可するものです。

サービス: MySQL

MySQLはポート3306でクライアント接続を待ち受けています。MySQLデータベースサーバーがリモートサーバー上のクライアントによって使用されている場合は、そのトラフィックを許可する必要があります。

特定のIPアドレスまたはサブネットからのMySQLの許可

特定のIPアドレスまたはサブネットからのMySQLへの着信接続を許可するには、ソースを指定します。たとえば、203.0.113.0/24サブネット全体を許可する場合は、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

第2のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ、確立されたMySQL接続の送信トラフィックを許可するものです。

特定のネットワークインターフェースへのMySQLの許可

特定のネットワークインターフェース(たとえば、プライベートネットワークインターフェースeth1があるとします)にMySQL接続を許可するには、次のコマンドを使用します:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

MySQL接続の確立された出力トラフィックを許可する2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

サービス:PostgreSQL

PostgreSQLはクライアント接続をポート5432で待機します。 PostgreSQLデータベースサーバーがリモートサーバーのクライアントによって使用されている場合は、そのトラフィックを許可する必要があります。

特定のIPアドレスまたはサブネットからのPostgreSQL

特定のIPアドレスまたはサブネットからの着信PostgreSQL接続を許可するには、ソースを指定します。 たとえば、203.0.113.0/24サブネット全体を許可する場合は、次のコマンドを実行します:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

OUTPUTポリシーがACCEPTに設定されていない場合は、PostgreSQL接続の確立された出力トラフィックを許可するために、2番目のコマンドが必要です。

特定のネットワークインターフェースへのPostgreSQLの許可

特定のネットワークインターフェース(たとえば、プライベートネットワークインターフェースeth1があるとします)へのPostgreSQL接続を許可するには、次のコマンドを使用します:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

PostgreSQL接続の確立されたアウトバウンドトラフィックを許可する2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

サービス: メール

メールサーバー(SendmailやPostfixなど)は、メール配信に使用されるプロトコルに応じてさまざまなポートでリッスンします。メールサーバーを実行している場合は、使用しているプロトコルを特定し、適切な種類のトラフィックを許可してください。また、出力SMTPメールをブロックするルールの作成方法も説明します。

出力SMTPメールのブロック

サーバーが出力メールを送信しない場合は、その種類のトラフィックをブロックしたい場合があります。ポート25を使用する出力SMTPメールをブロックするには、次のコマンドを実行してください:

  1. sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

これはiptablesを設定して、ポート25のすべての送信トラフィックを拒否します。ポート25の代わりに他のサービスをポート番号で拒否する必要がある場合は、上記の25をそのポート番号に置き換えてください。

すべての受信SMTPを許可

サーバーがポート25でSMTP接続に応答するようにするには、次のコマンドを実行してください:

  1. sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

すべての受信IMAPを許可

サーバーがIMAP接続、ポート143に応答するようにするには、次のコマンドを実行してください:

  1. sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

すべての受信IMAPSを許可

サーバーがIMAPS接続(ポート993)に応答するようにするには、次のコマンドを実行してください:

  1. sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

アウトバウンドトラフィックのIMAPS接続が許可されるようにする2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

すべての着信POP3を許可する

サーバーがPOP3接続(ポート110)に応答するようにするには、次のコマンドを実行してください:

  1. sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

アウトバウンドトラフィックのPOP3接続が許可されるようにする2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

すべての着信POP3Sを許可する

サーバーがPOP3S接続(ポート995)に応答するようにするには、次のコマンドを実行してください:

  1. sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

アウトバウンドトラフィックのPOP3S接続が許可されるようにする2番目のコマンドは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ必要です。

結論

それは、iptablesファイアウォールを設定する際に一般的に使用される多くのコマンドをカバーしているはずです。もちろん、iptablesは非常に柔軟なツールですので、ここでカバーされていない場合は、さまざまなオプションを組み合わせて、特定のニーズに合わせてコマンドを使い分けてください。

ファイアウォールの設定方法についてのヘルプをお探しの場合は、このチュートリアルを参照してください:サーバーを保護するための効果的なファイアウォールポリシーの選択方法

Source:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands