はじめに
Iptables はコマンドラインの ファイアウォール ユーティリティです。これは、システム上にファイアウォールを設定するためのソフトウェアであることを意味します。通常、デフォルトで Linux システムで利用可能です。このガイドでは、iptables ファイアウォールに関連する一般的なルールとコマンドのいくつかについて説明します。接続がシステムとの確立を試みるたびに、ファイアウォールはこれらのルールを参照して、次にとるべきアクションを決定します。
Iptables コマンド
このガイドでは、最も重要な iptables コマンドのいくつかを紹介します。ガイドに従うには、iptables とは何か、そしてそれがどのように機能するかについての基本的な理解が必要です。これにより、以下のコマンドで実装するルールをよりよく把握できるようになります。以下に示すコマンドは、それぞれ単独で使用できることを覚えておいてください。一方で、特定のニーズに合わせてそれらを組み合わせることもできます。
留意事項
読み進める前に、いくつか留意しておくべき点があります。
- iptables におけるルールの順序は重要です。
- チェーンの最後に新しいルールを追加するには、
iptablesコマンドで-A. - 別の位置にルールを追加したい場合は、
-Iオプションを使用する必要があります。このオプションを使用すると、ルールの正確な位置を指定できます。チェーンの最初にルールを配置したい場合は、単にルール番号を指定しないでください。 - サーバーへの一貫したアクセスを確保するため、デフォルトでポート 22 の SSH トラフィックをブロックしてください。
- 万が一、そうしなかったためにサーバーへのアクセスを失った場合は、コンソールを使用して再接続できます。ファイアウォール設定を変更するために SSH トラフィックを許可してください。
- 現在適用されているルールセットを確認したい場合は、次のコマンドを使用します。
sudo iptables -S および sudo iptables -L.
さらに、iptables ファイアウォールルールの一覧表示と削除方法に関する詳細なガイドがあり、iptables ファイアウォールを最大限に活用するのにさらに役立ちます。
前提条件が整ったところで、いくつかの 一般的な iptables コマンド:
ルールの保存方法
まず、ルールを保存する方法を決定することから始めます。iptables ルールは一時的なものであることに注意することが重要です。つまり、保存しない限り、システムを再起動すると失われます。以下は、それぞれ Ubuntu および CentOS サーバーで新しいルールを手動で保存する方法です:
-
Ubuntu
Ubuntu サーバーで新しいルールを保存する最も簡単な方法は、iptables-persistent パッケージを使用することです。次の手順で簡単に このチュートリアルに従って Ubuntu サーバーを作成できます。
新しい iptables ルールを保存するための最初のステップは、iptables-persistent パッケージを apt-get を使用してインストールすることです。入手方法は次のとおりです:
|
1 |
sudo apt-get install iptables-persistent |

インストールプロセス中に、現在適用されているファイアウォールルールを保存するかどうかを決定する必要があります。代わりにルールを更新して変更を保存するには、次のコマンドを使用します:
|
1 |
sudo netfilter-persistent save |

上記のコマンドは、通常 16.04 より後の Ubuntu バージョンで動作します。それ以前のバージョンを使用している場合は、代わりに次のコマンドを使用してください:
|
1 |
sudo invoke-rc.d iptables-persistent save |
-
CentOS
CentOS 6 またはそれ以前のバージョンでは、iptables を使用してファイアウォールを設定できます。CentOS 7 では代わりに FirewallD を使用します。この チュートリアルに従って、CentOS 7 で FirewallD を設定する方法を学んでください.
CentOS では、iptables 初期化スクリプトを使用して新しいルールを保存できます。次のコマンドを参照してください:
|
1 |
sudo service iptables save |
このコマンドは、iptables ファイアウォールの新しいルールを保存します。現在アクティブな iptables ルールは、/etc/sysconfig/iptables ファイルにあります。
便利な Iptables コマンド
それでは、サーバーで使用する必要があるかもしれない、非常に便利な iptables ファイアウォールコマンドに進みましょう。
-
ループバック接続
まず、ループバック接続を許可する方法について説明します。システムは、自身に接続を送信するためにループバックインターフェースを使用します。たとえば、次のコマンドを実行したとします。ping localhost または ping 127.0.0.1。サーバーはループバックインターフェース、またはloを使用して、本質的に自身にpingを送信します。また、アプリケーションサーバーが「localhost」アドレスに接続するように構成されている場合、サーバーがこれを使用することもあります。
どのような状況であっても、iptablesファイアウォールがこれらの接続をブロックしないようにする必要があります。したがって、これらの機能が動作できるように、ループバック接続を許可する必要があります。
ループバックインターフェースに入るすべてのトラフィックを許可するために実行するコマンドは次のとおりです。
|
1 2 |
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT |

-
確立された接続および関連する受信接続
許可する必要があるもう1つの接続タイプは、送信接続です。サーバーが受信トラフィックと送信トラフィックをそれぞれ正しく送受信できるようにするには、確立された接続および関連する受信接続を許可する必要があります。これにより、サーバーは送信接続に対して返信トラフィックを送信できるようになります。確立された接続および関連する受信接続を許可するには、次のコマンドを使用します。
|
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アドレスからの接続をブロックするために使用できるいくつかのコマンドを見ていきます。わかりやすくするために、コマンドの例として 15.15.15.51 IPアドレスを使用します。この値は、特定のIPアドレスに置き換えることができます。
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j DROP |
-s 15.15.15.51 において、-s は送信元(source)を表します。したがって、このコマンドは送信元IPアドレス「15.15.15.51」を指定しています。同様に、任意のファイアウォールルールで送信元IPアドレスを指定できます。これには、許可ルールや拒否ルールも含まれます。
接続を拒否(REJECT)したい場合は、コマンド内でDROPの代わりに次のようにREJECTを使用します。
|
1 |
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT |
その結果、その特定のIPアドレスが接続要求を送信するたびに、サーバーは「接続が拒否されました(connection refused)」というエラーを返します。
-
特定のインターフェースへの接続のブロック
特定のIPアドレスから特定のネットワークインターフェースへのすべての接続要求をブロックすることができます。この例では、IPアドレスは 15.15.15.51 で、ネットワークインターフェースは eth0 です。接続をブロックするには、次のコマンドを使用します。
|
1 |
iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP |
素晴らしいことに、任意のルールでネットワークインターフェースを指定できます。つまり、任意のルールを特定のネットワークのみに適用し、制限することができます。
サービス用ルール:SSH
SSH は、クラウドサーバーを使用している場合に関連してきます。この場合、ポート22での受信SSH接続を許可する必要があります。これらの接続を有効にすることで、サーバーに接続して管理できるようになります。ここでは、SSHに関するいくつかの一般的なルールについて説明します。
-
すべての受信SSHを許可する
以下のコマンドは、すべての受信SSH接続を有効にします:
|
1 2 |
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 |
上記のセットでは、OUTPUTポリシーがACCEPTに設定されていない場合にのみ、2番目のコマンドを使用する必要があります。これにより、確立されたSSH接続の送信トラフィックが許可されます。
-
サブネットからの受信SSHの許可
前のコマンドは、すべての受信接続を許可します。特定のIPアドレスまたはサブネットからの受信接続のみを許可するには、以下のコマンドを使用できます。たとえば、次のサブネットからの受信接続のみを許可したいとします:15.15.15.0/24 サブネット:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
以前と同様に、OUTPUTポリシーがACCEPTに設定されていない場合にのみ、2番目のコマンドを使用する必要があります。これにより、確立されたSSH接続の送信トラフィックが許可されます。
-
送信SSHの許可
ファイアウォールのOUTPUTポリシーがACCEPTに設定されておらず、SSH接続を有効にしたい場合は、これらのコマンドを使用します。これにより、サーバーから他のサーバーへのSSH接続を開始できるようになります:
|
1 2 |
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 |
クラウドサーバーでSSHをさらに活用するには、UbuntuでSSHを使用してリモートサーバーに接続する方法 および SSHキーベースの認証を使用するようにLinuxサーバーを構成する方法.
-
サブネットからの受信Rsyncの許可
Rsyncは、あるシステムから別のシステムにファイルを転送するために使用できる機能です。ポート873で動作します。したがって、特定のIPアドレスまたはサブネットからポート873での受信Rsync接続を許可したい場合は、以下のコマンドを使用します:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
ご覧のとおり、宛先ポートとともに送信元IPアドレスを指定しました。ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ、2番目のコマンドを使用します。これにより、確立されたRsync接続の送信トラフィックが許可されます。さらに、Rsyncを使用して VPS上のローカルディレクトリとリモートディレクトリを同期する方法に関するチュートリアル.
サービスのルール:Webサーバー
HTTP接続は通常、ポート80で受信されます。同様に、HTTPSは通常、ポート443で受信されます。Apache および NginxのようなWebサーバーは、これらのポートをリッスンして接続要求をキャッチします。デフォルトの設定によっては、サーバーがこれらの受信要求を拒否またはドロップする場合があります。そのため、トラフィックを許可するための新しいルールを設定する必要があります。
-
すべての受信HTTP接続の許可
以下のコマンドを使用して、ポート80でのすべての受信HTTP接続を許可できます:
|
1 2 |
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 |
ファイアウォールのOUTPUT ポリシーがACCEPTに設定されていない場合にのみ、2番目のコマンドを使用します。これにより、確立されたHTTP接続の送信トラフィックが許可されます。
-
すべての受信HTTPS接続の許可
ポート443でのすべての受信HTTPS接続要求を許可するには、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、iptablesファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたHTTP接続の送信トラフィックが許可されます。
-
HTTPおよびHTTPSからのすべての受信接続の許可
HTTPとHTTPSの両方のポートからのトラフィックを許可したい場合は、multiportモジュールを使用できます。その場合は、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたHTTPおよびHTTPS接続の送信トラフィックが許可されます。
サービスのルール: MySQL
クライアントがリモートサーバーを使用して、あなたのMySQLデータベースサーバーにアクセスする場合があります。その場合は、関連するポートからの受信トラフィックを手動で許可する必要があります。MySQLはポート3306からの接続要求をリッスンします。
-
サブネットからの受信MySQL接続の許可
特定のサブネットからのMySQL接続を許可する場合は、送信元を指定する必要があります。この例では、次のコマンドを使用して、15.15.15.0/24サブネットからの受信トラフィックを許可します:
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたMySQL接続の送信トラフィックが許可されます。
-
インターフェースへのMySQL接続の有効化
MySQL接続を受信するネットワークインターフェースを指定したい場合は、次のコマンドを使用できます。
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
この場合、eth1.
というプライベートネットワークインターフェースへの接続を許可しています。2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたMySQL接続の送信トラフィックが許可されます。
当社のサーバーでのMySQLの簡単なセットアップに関するチュートリアルを参照してください。.
サービスのルール: PostgreSQL
クライアントがリモートサーバーを使用して、あなたのPostgreSQLデータベースサーバーにアクセスする場合があります。その場合は、これらの受信接続を許可する必要があります。これらの接続はポート5432を経由します。
-
サブネットからの受信PostgreSQL接続の許可
特定のサブネットまたはIPアドレスからの受信PostgreSQL接続を許可するには、次のコマンドを使用できます。ご覧のとおり、送信元として15.15.15.0/24 サブネットを指定しています。
|
1 2 |
sudo iptables -A INPUT -p tcp -s 15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。。これにより、確立されたPostgreSQL接続の送信トラフィックが許可されます。
-
特定のインターフェースへのPostgreSQL接続の有効化
特定のネットワークインターフェースへのPostgreSQL接続のみを許可したい場合は、次のコマンドを使用します。
|
1 2 |
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT |
この場合、次のプライベートネットワークインターフェースへの接続を許可しています:eth1。2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたPostgreSQL接続の送信トラフィックが許可されます。
こちらのUbuntuサーバーにPostgreSQLをインストールするチュートリアル.
サービスのルール:メール
使用しているメールサーバーに合わせてファイアウォールを設定する必要がある場合もあります。たとえば、SendmailおよびPostfixは、さまざまなポートで接続を受信できます。これは、メール配信に使用するプロトコルによって異なります。特定のメール接続をブロックまたは許可するには、使用しているプロトコルを把握する必要があります。
-
受信SMTP接続の許可
SMTP接続は通常、ポート25で受信されます。ただし、SMTPは送信メールにポート587も一般的に使用します。サーバーがこれらの接続に応答できるようにするには、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたSMTP接続の送信トラフィックが許可されます。
-
すべての受信IMAPの許可
サーバーがポート143でのすべての受信IMAP接続に応答できるようにするには、次を入力して実行します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたIMAP接続の送信トラフィックが許可されます。
-
すべての受信IMAPSの許可
サーバーがポート993でのIMAPS接続に応答できるようにするには、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたIMAPS接続の送信トラフィックが許可されます。
-
すべての受信POP3の許可
これらの接続はポート993で受信されます。サーバーがIMAPS接続要求に応答できるようにするには、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールのOUTPUTポリシーがACCEPTに設定されていない場合にのみ使用します。これにより、確立されたPOP3接続の送信トラフィックが許可されます。
-
すべての受信POP3Sの許可
サーバーがポート995で受信されるPOP3S要求との接続を確立できるようにするには、次のコマンドを使用します。
|
1 2 |
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 |
2番目のコマンドは、ファイアウォールの OUTPUT ポリシーが ACCEPT に設定されていない場合にのみ使用します。これにより、確立された POP3S 接続の送信トラフィックが許可されます。
-
送信 SMTP メールのブロック方法
受信接続を許可してサーバーの応答を有効にする代わりに、送信メールを完全にブロックしたい場合があります。次のコマンドを使用すると、ポート25でのすべての送信SMTPメールをブロックできます:
|
1 |
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT |
その結果、ポート25でのすべての送信トラフィックはiptablesファイアウォールによって拒否されます。他のサービスを拒否したい場合も、同じコマンド構造を使用できます。ポート25を該当するポート番号に置き換えるだけです。
まとめ
このガイドでは、重要なiptablesファイアウォールコマンドについて説明しました。iptablesファイアウォールを効果的に設定するために必要な基本ツールが揃っています。万能な解決策は存在しないということを念頭に置いておいてください。これらのコマンドは非常に柔軟です。つまり、ご自身の目的や要件に最適な方法で利用することができます。
快適なコンピューティングを!

コメント
コメントはまだありません。最初のコメントを投稿しましょう。