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

前書き

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

このガイドの使用方法
  • iptablesファイアウォールの設定を始めたばかりの場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14をご覧ください-04 [iptablesの紹介]

  • ここで説明するルールのほとんどは、デフォルトの入力ポリシーを使用してiptablesが着信トラフィックに* DROP *に設定されており、選択的にトラフィックを許可することを前提としています

  • 達成しようとしているものに該当する後続のセクションを使用します。 ほとんどのセクションは他のセクションに基づいていないため、以下の例を個別に使用できます。

  • このページの右側にある[コンテンツ]メニュー(広いページ幅)またはブラウザの検索機能を使用して、必要なセクションを見つけます

  • 指定されたコマンドラインの例をコピーして貼り付け、赤の値を独自の値に置き換えます

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

`+ sudo iptables -S `と ` sudo iptables -L +`で現在のiptablesルールセットを確認できることを忘れないでください。

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

ルールを保存する

Iptablesルールは短命です。つまり、再起動後も保持するにはルールを手動で保存する必要があります。

ウブンツ

Ubuntuでは、再起動後もiptablesルールを保存する最も簡単な方法は、 `+ iptables-persistent +`パッケージを使用することです。 次のようにapt-getでインストールします。

sudo apt-get install iptables-persistent

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

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

sudo netfilter-persistent save

16.04より前のバージョンのUbuntuでは、代わりに次のコマンドを実行します。

sudo invoke-rc.d iptables-persistent save

CentOS 6以降

CentOS 6以前では、CentOS 7はデフォルトでFirewallDを使用します。`+ iptables + `initスクリプトを使用してiptablesルールを保存できます。

sudo service iptables save

これにより、現在のiptablesルールが `+ / etc / sysconfig / iptables +`ファイルに保存されます。

ルールのリストと削除

iptablesルールをリストおよび削除する方法を学びたい場合は、このチュートリアルをご覧ください:https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules[How To Iptables Firewallルールのリストと削除]。

一般的に役立つルール

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

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

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

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

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

確立済みおよび関連する着信接続を許可する

ネットワークトラフィックは通常、双方向の着信および発信が適切に機能する必要があるため、サーバーが発信接続へのリターントラフィックを許可するように、「確立」および「関連」着信トラフィックを許可するファイアウォールルールを作成するのが一般的ですサーバー自体によって開始されます。 このコマンドはそれを可能にします:

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

確立された発信接続を許可する

すべての*確立された*接続の発信トラフィックを許可することができます。これは通常、正当な着信接続への応答です。 このコマンドはそれを可能にします:

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

内部から外部

`+ eth0 `が外部ネットワークであり、 ` eth1 +`が内部ネットワークであると仮定すると、内部から外部にアクセスできるようになります。

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

無効なパケットをドロップ

一部のネットワークトラフィックパケットは、*無効*とマークされます。 このタイプのパケットをログに記録することが役立つ場合もありますが、多くの場合、それらをドロップしても問題ありません。 次のコマンドを使用してください。

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

IPアドレスをブロックする

特定のIPアドレス、たとえば「15.15.15.51」から発信されるネットワーク接続をブロックするには、次のコマンドを実行します。

sudo iptables -A INPUT -s  -j DROP

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

代わりに「接続拒否」エラーで接続要求に応答する接続を「拒否」したい場合は、次のように「DROP」を「REJECT」に置き換えます。

sudo iptables -A INPUT -s  -j REJECT

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

特定のIPアドレスからの接続をブロックするには、たとえば 「15.15.15.51」、特定のネットワークインターフェース、例: + eth0 +、次のコマンドを使用します:

iptables -A INPUT -i  -s  -j DROP

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

サービス:SSH

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

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

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

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

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

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

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

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

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

発信SSHを許可する

ファイアウォールの「+ OUTPUT 」ポリシーが「 ACCEPT +」に設定されておらず、発信SSH接続(サーバーが別のサーバーへのSSH接続を開始する)を許可する場合は、次のコマンドを実行できます。

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

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

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

特定のIPアドレスまたはサブネットからの着信rsync接続を許可するには、ソースIPアドレスと宛先ポートを指定します。 たとえば、 `+ 15.15.15.0 / 24 +`サブネット全体をサーバーとrsyncできるようにするには、次のコマンドを実行します。

sudo iptables -A INPUT -p tcp -s  --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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)接続を許可するには、次のコマンドを実行します。

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

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

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

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

sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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)接続を許可するには、次のコマンドを実行します。

sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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接続を許可するには、ソースを指定します。 たとえば、 `+ 15.15.15.0 / 24 +`サブネット全体を許可する場合は、次のコマンドを実行します。

sudo iptables -A INPUT -p tcp -s  --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

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

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

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

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

サービス:PostgreSQL

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

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

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

sudo iptables -A INPUT -p tcp -s  --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

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

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

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

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

サービス:メール

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

送信SMTPメールをブロックする

サーバーが送信メールを送信してはならない場合、その種のトラフィックをブロックすることができます。 ポート25を使用する送信SMTPメールをブロックするには、次のコマンドを実行します。

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

これにより、ポート25のすべての発信トラフィックが*拒否*されるようにiptablesが構成されます。 ポート25の代わりにポート番号で別のサービスを拒否する必要がある場合は、単に置き換えてください。

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

サーバーがポート25のSMTP接続に応答できるようにするには、次のコマンドを実行します。

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

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

すべての着信IMAPを許可

サーバーがポート143のIMAP接続に応答できるようにするには、次のコマンドを実行します。

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

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

すべての着信IMAPSを許可

サーバーがポート993のIMAPS接続に応答できるようにするには、次のコマンドを実行します。

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

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

すべての着信POP3を許可

サーバーがポート110のPOP3接続に応答できるようにするには、次のコマンドを実行します。

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

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

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

サーバーがポート995のPOP3S接続に応答できるようにするには、次のコマンドを実行します。

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

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

結論

これは、iptablesファイアウォールを構成するときに一般的に使用されるコマンドの多くをカバーするはずです。 もちろん、iptablesは非常に柔軟なツールであるため、ここで説明されていない場合は、コマンドをさまざまなオプションと自由に組み合わせて特定のニーズに合わせてください。

ファイアウォールの設定方法を決定するためのヘルプを探している場合は、このチュートリアルをご覧ください:https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to -secure-your-servers [サーバーを保護するための効果的なファイアウォールポリシーの選択方法]。

がんばろう!

前の投稿:Python 3でWeb APIを使用する方法
次の投稿:FreeBSD 12.0にApache、MySQL、およびPHP(FAMP)スタックをインストールする方法