序章

Iptablesは、Linuxディストリビューション用のソフトウェアファイアウォールです。 このチートシートスタイルガイドは、一般的な日常のシナリオで役立つファイアウォールルールを作成するiptablesコマンドへのクイックリファレンスを提供します。 これには、ポート、ネットワークインターフェイス、および送信元IPアドレスによってさまざまなサービスを許可およびブロックするiptablesの例が含まれます。

このガイドの使用方法

  • ここで説明するルールのほとんどは、iptablesがデフォルトの入力ポリシーを介して DROP 着信トラフィックに設定されており、着信トラフィックを選択的に許可することを前提としています。
  • 達成しようとしていることに該当する後続のセクションを使用してください。 ほとんどのセクションは他のセクションを前提としていないため、以下の例を個別に使用できます
  • このページの右側にある[コンテンツ]メニュー(ページ幅が広い場合)またはブラウザの検索機能を使用して、必要なセクションを見つけます
  • 指定されたコマンドラインの例をコピーして貼り付け、強調表示された値を独自の値に置き換えます

ルールの順序が重要であることに注意してください。 これらのiptablesコマンドはすべて、-Aオプションを使用して、チェーンの最後に新しいルールを追加します。 チェーン内の別の場所に配置する場合は、-Iオプションを使用して、新しいルールの位置を指定できます(または、ルール番号を指定せずにチェーンの先頭に配置できます)。 )。

注:ファイアウォールを使用する場合は、SSHトラフィック(デフォルトではポート22)をブロックして、自分のサーバーから自分自身をロックアウトしないように注意してください。 ファイアウォールの設定が原因でアクセスできなくなった場合は、アクセスを修正するためにWebベースのコンソールを介してファイアウォールに接続する必要がある場合があります。 DigitalOceanを使用している場合は、回復コンソールの製品ドキュメントで詳細を確認できます。 コンソール経由で接続したら、ファイアウォールルールを変更してSSHアクセスを許可する(またはすべてのトラフィックを許可する)ことができます。 保存したファイアウォールルールでSSHアクセスが許可されている場合、別の方法はサーバーを再起動することです。

sudo iptables -Sおよびsudo iptables -Lを使用して現在のiptablesルールセットを確認できることを忘れないでください。

iptablesコマンドを見てみましょう!

ルールの保存

Iptablesルールは一時的なものです。つまり、再起動後も存続させるには、手動で保存する必要があります。

Ubuntuでは、iptablesルールを保存する1つの方法は、iptables-persistentパッケージを使用することです。 次のようにaptを使用してインストールします。

  1. sudo apt install iptables-persistent

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

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

  1. sudo netfilter-persistent save

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

ルールの一覧表示と削除

iptablesルールを一覧表示および削除する方法を知りたい場合は、次のチュートリアルを確認してください:Iptablesファイアウォールルールを一覧表示および削除する方法

一般的に役立つルール

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

ループバック接続の許可

loopback インターフェイスは、loとも呼ばれ、コンピューターがネットワーク接続をコンピューター自体に転送するために使用するものです。 たとえば、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から発信されたネットワーク接続をブロックするには、次のコマンドを実行します。

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

この例では、-s 203.0.113.51ソースのIPアドレス「203.0.113.51」を指定しています。 送信元IPアドレスは、allowルールを含む任意のファイアウォールルールで指定できます。

代わりに接続を拒否して、接続要求に「接続拒否」エラーで応答する場合は、次のように「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

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

特定の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

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

送信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を許可する

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

特定の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サーバーは、通常、ポート80と443でそれぞれHTTP接続とHTTPS接続の要求をリッスンします。 着信トラフィックのデフォルトポリシーがドロップまたは拒否に設定されている場合は、サーバーがそれらの要求に応答できるようにするルールを作成する必要があります。

すべての着信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

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

すべての着信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

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

すべての着信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

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

サービス: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

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

MySQLに特定のネットワークインターフェイスを許可する

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

  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

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

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

確立されたSMTP接続の送信トラフィックを許可する2番目のコマンドは、OUTPUTポリシーが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

確立されたIMAP接続の発信トラフィックを許可する2番目のコマンドは、OUTPUTポリシーが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は非常に柔軟なツールであるため、ここで説明されていない場合は、特定のニーズに合わせてコマンドをさまざまなオプションと自由に組み合わせて組み合わせることができます。

ファイアウォールの設定方法を決定するためのヘルプが必要な場合は、次のチュートリアルを確認してください:サーバーを保護するための効果的なファイアウォールポリシーを選択する方法