序章
Iptablesは、Linuxディストリビューション用のソフトウェアファイアウォールです。 このチートシートスタイルガイドは、一般的な日常のシナリオで役立つファイアウォールルールを作成するiptablesコマンドへのクイックリファレンスを提供します。 これには、ポート、ネットワークインターフェイス、および送信元IPアドレスによってさまざまなサービスを許可およびブロックするiptablesの例が含まれます。
このガイドの使用方法
- ここで説明するルールのほとんどは、iptablesがデフォルトの入力ポリシーを介して DROP 着信トラフィックに設定されており、着信トラフィックを選択的に許可することを前提としています。
- 達成しようとしていることに該当する後続のセクションを使用してください。 ほとんどのセクションは他のセクションを前提としていないため、以下の例を個別に使用できます
- このページの右側にある[コンテンツ]メニュー(ページ幅が広い場合)またはブラウザの検索機能を使用して、必要なセクションを見つけます
- 指定されたコマンドラインの例をコピーして貼り付け、強調表示された値を独自の値に置き換えます
ルールの順序が重要であることに注意してください。 これらすべて iptables
コマンドは -A
チェーンの最後に新しいルールを追加するオプション。 チェーンのどこかに置きたい場合は、 -I
新しいルールの位置を指定できるオプション(またはルール番号を指定せずにチェーンの先頭に配置する)。
注:ファイアウォールを使用する場合は、SSHトラフィック(デフォルトではポート22)をブロックして、自分のサーバーから自分自身をロックアウトしないように注意してください。 ファイアウォールの設定が原因でアクセスできなくなった場合は、アクセスを修正するためにWebベースのコンソールを介してファイアウォールに接続する必要がある場合があります。 DigitalOceanを使用している場合は、回復コンソールの製品ドキュメントで詳細を確認できます。 コンソール経由で接続したら、ファイアウォールルールを変更してSSHアクセスを許可する(またはすべてのトラフィックを許可する)ことができます。 保存したファイアウォールルールでSSHアクセスが許可されている場合、別の方法はサーバーを再起動することです。
現在のiptablesルールセットを次のコマンドで確認できることを忘れないでください sudo iptables -S
と sudo iptables -L
.
iptablesコマンドを見てみましょう!
ルールの保存
Iptablesルールは一時的なものです。つまり、再起動後も存続させるには、手動で保存する必要があります。
Ubuntuでは、iptablesルールを保存する1つの方法は、 iptables-persistent
パッケージ。 次のようにaptを使用してインストールします。
- sudo apt install iptables-persistent
インストール中に、現在のファイアウォールルールを保存するかどうかを尋ねられます。
ファイアウォールルールを更新して変更を保存する場合は、次のコマンドを実行します。
- sudo netfilter-persistent save
他のLinuxディストリビューションには、iptablesの変更を永続的にする別の方法がある場合があります。 詳細については、関連するドキュメントを参照してください。
ルールの一覧表示と削除
iptablesルールを一覧表示および削除する方法を知りたい場合は、次のチュートリアルを確認してください:Iptablesファイアウォールルールを一覧表示および削除する方法。
一般的に役立つルール
このセクションには、ほとんどのサーバーで一般的に役立つルールを作成するさまざまなiptablesコマンドが含まれています。
ループバック接続の許可
loopback インターフェース、別名 lo
は、コンピュータがネットワーク接続を自分自身に転送するために使用するものです。 たとえば、 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アドレスから発信されたネットワーク接続をブロックするには、 203.0.113.51
たとえば、次のコマンドを実行します。
- sudo iptables -A INPUT -s 203.0.113.51 -j DROP
この例では、 -s 203.0.113.51
sourceIPアドレス「203.0.113.51」を指定します。 送信元IPアドレスは、allowルールを含む任意のファイアウォールルールで指定できます。
代わりに接続を拒否して、接続要求に「接続拒否」エラーで応答する場合は、次のように「DROP」を「REJECT」に置き換えます。
- sudo iptables -A INPUT -s 203.0.113.51 -j REJECT
ネットワークインターフェイスへの接続のブロック
特定のIPアドレスからの接続をブロックするには、たとえば 203.0.113.51
、特定のネットワークインターフェイスへ。 eth0
、次のコマンドを使用します。
- iptables -A INPUT -i eth0 -s 203.0.113.51 -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接続を許可するには、送信元を指定します。 たとえば、全体を許可したい場合 203.0.113.0/24
サブネット、次のコマンドを実行します。
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
確立された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アドレスと宛先ポートを指定します。 たとえば、全体を許可したい場合 203.0.113.0/24
サーバーにrsyncできるようにするには、次のコマンドを実行します。
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
確立されたrsync接続の発信トラフィックを許可する2番目のコマンドは、次の場合にのみ必要です。 OUTPUT
ポリシーがに設定されていません ACCEPT
.
サービス:Webサーバー
ApacheやNginxなどのWebサーバーは、通常、ポート80と443でそれぞれHTTP接続とHTTPS接続の要求をリッスンします。 着信トラフィックのデフォルトポリシーがドロップまたは拒否に設定されている場合は、サーバーがそれらの要求に応答できるようにするルールを作成する必要があります。
すべての着信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接続を許可するには、送信元を指定します。 たとえば、全体を許可したい場合 203.0.113.0/24
サブネット、次のコマンドを実行します。
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
確立されたMySQL接続の発信トラフィックを許可する2番目のコマンドは、次の場合にのみ必要です。 OUTPUT
ポリシーがに設定されていません ACCEPT
.
MySQLに特定のネットワークインターフェイスを許可する
特定のネットワークインターフェイスへのMySQL接続を許可するには-プライベートネットワークインターフェイスがあるとします eth1
たとえば、次のコマンドを使用します。
- 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
確立されたMySQL接続の発信トラフィックを許可する2番目のコマンドは、次の場合にのみ必要です。 OUTPUT
ポリシーがに設定されていません ACCEPT
.
サービス:PostgreSQL
PostgreSQLはポート5432でクライアント接続をリッスンします。 PostgreSQLデータベースサーバーがリモートサーバー上のクライアントによって使用されている場合は、そのトラフィックを許可する必要があります。
特定のIPアドレスまたはサブネットからのPostgreSQL
特定のIPアドレスまたはサブネットからの着信PostgreSQL接続を許可するには、送信元を指定します。 たとえば、全体を許可したい場合 203.0.113.0/24
サブネット、次のコマンドを実行します。
- sudo iptables -A INPUT -p tcp -s 203.0.113.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
確立されたPostgreSQL接続の発信トラフィックを許可する2番目のコマンドは、次の場合にのみ必要です。 OUTPUT
ポリシーがに設定されていません ACCEPT
.
PostgreSQLが特定のネットワークインターフェイスに接続できるようにする
特定のネットワークインターフェースへのPostgreSQL接続を許可するには-プライベートネットワークインターフェースがあるとします eth1
たとえば、次のコマンドを使用します。
- 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
確立されたPostgreSQL接続の発信トラフィックを許可する2番目のコマンドは、次の場合にのみ必要です。 OUTPUT
ポリシーがに設定されていません ACCEPT
.
サービス:メール
SendmailやPostfixなどのメールサーバーは、メール配信に使用されているプロトコルに応じて、さまざまなポートでリッスンします。 メールサーバーを実行している場合は、使用しているプロトコルを特定し、適切な種類のトラフィックを許可します。 また、送信SMTPメールをブロックするルールを作成する方法も示します。
送信SMTPメールのブロック
サーバーが送信メールを送信してはならない場合は、そのような種類のトラフィックをブロックすることをお勧めします。 ポート25を使用する送信SMTPメールをブロックするには、次のコマンドを実行します。
- sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
これにより、iptablesは、ポート25のすべての発信トラフィックを拒否するように構成されます。 ポート25ではなくポート番号で別のサービスを拒否する必要がある場合は、そのポート番号を 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を許可する
サーバーがIMAP接続(ポート143)に応答できるようにするには、次のコマンドを実行します。
- 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を許可する
サーバーがIMAPS接続(ポート993)に応答できるようにするには、次のコマンドを実行します。
- 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を許可する
サーバーがPOP3接続(ポート110)に応答できるようにするには、次のコマンドを実行します。
- 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を許可する
サーバーがPOP3S接続(ポート995)に応答できるようにするには、次のコマンドを実行します。
- 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は非常に柔軟なツールであるため、ここで説明されていない場合は、特定のニーズに合わせてコマンドをさまざまなオプションと自由に組み合わせて組み合わせることができます。
ファイアウォールの設定方法を決定するためのヘルプが必要な場合は、次のチュートリアルを確認してください:サーバーを保護するための効果的なファイアウォールポリシーを選択する方法。