ウェブサイト検索

Linux管理者が知っておくべき25の役立つIPテーブルファイアウォールルール


ネットワークトラフィックの管理は、システム管理者が対処しなければならない最も難しい仕事の一つです。彼は、システムとユーザーの両方の要求を満たしながら、攻撃に対してシステムが脆弱にならないように、受信接続と送信接続の両方のためにファイアウォールを構成しなければなりません。

ここで iptables の出番です。 iptables は、システム管理者が設定可能なテーブルルールを通じて、受信および送信トラフィックを管理できるLinuxのコマンドラインファイアウォールです。

Iptables は、組み込みまたはユーザー定義のルールのセットを含むチェーンを持つテーブルのセットを使用します。それのおかげで、システム管理者は自分のシステムのネットワークトラフィックを適切にフィルタリングできます。

iptablesマニュアルによれば、現在3種類のテーブルがあります:

    1. FILTER - これはデフォルトのテーブルであり、次のような組み込みチェーンを含んでいます:

      1. 入力  – ローカルソケット用に送信されるパッケージ
      2. 前方 – システムを通じてルーティングされたパケット
      3. 出力 - ローカルで生成されたパケット
    2. NAT – 新しい接続を作成しようとするパケットを参照するテーブルです。以下の組み込みがあります:

      1. PREROUTING – パケットが受信されるとすぐに変更するために使用されます
      2. 出力 – ローカルで生成されたパケットを変更するために使用されます
      3. POSTROUTING – パケットが外に出る直前に変更するために使用されます
    3. MANGLE – このテーブルはパケットを変更するために使用されます。カーネルバージョン2.4まで、このテーブルは2つのチェーンのみを持っていましたが、現在は5つになっています:

      1. PREROUTING – 受信接続を変更するため
      2. 出力 – ローカル生成パケットを変更するため
      3. 入力 – 受信パケット用
      4. POSTROUTING – パケットが出て行く直前に変更するためのもの
      5. 転送 – ボックスを通過したパケットのために

この記事では、iptablesを通じてLinuxボックスのファイアウォールを管理するのに役立つ便利なコマンドをいくつか紹介します。この文章の目的のために、私はより簡単なコマンドから始め、最後にはより複雑なものに進んでいきます。

1. Iptablesファイアウォールの開始/停止/再起動

最初に、異なるLinuxディストリビューションでiptablesサービスを管理する方法を知っておく必要があります。これはかなり簡単です:

SystemDベースのLinuxディストリビューションについて

------------ On Cent/RHEL 7 and Fedora 22+ ------------
systemctl start iptables
systemctl stop iptables
systemctl restart iptables

SysVinit ベースの Linux ディストリビューションについて

------------ On Cent/RHEL 6/5 and Fedora ------------
/etc/init.d/iptables start 
/etc/init.d/iptables stop
/etc/init.d/iptables restart

2. すべてのIPtablesファイアウォールルールを確認する

既存のルールを確認したい場合は、以下のコマンドを使用してください:

# iptables -L -n -v

これは以下のような出力を返すべきです:

Chain INPUT (policy ACCEPT 1129K packets, 415M bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT all -- * lxcbr0 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT all -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 354K packets, 185M bytes)
 pkts bytes target prot opt in out source destination

特定のテーブルのルールを確認したい場合は、-t オプションの後に確認したいテーブルを指定できます。たとえば、NAT テーブルのルールを確認するには、次のようにします:

# iptables -t nat -L -v -n

3. IPtablesファイアウォールで特定のIPアドレスをブロックする

特定のIPアドレスから異常または悪用と思われる活動を見つけた場合は、以下のルールを使用してそのIPアドレスをブロックできます:

# iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

ここで「xxx.xxx.xxx.xxx」を実際のIPアドレスに変更する必要があります。このコマンドを実行する際には非常に注意してください。自分のIPアドレスをブロックしてしまう可能性があります。-Aオプションは、選択したチェーンの最後にルールを追加します。

特定のIPアドレスからのTCPトラフィックのみをブロックしたい場合は、プロトコルを指定する-pオプションを使用できます。その場合、コマンドは次のようになります:

# iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP

4. IPtablesファイアウォールでIPアドレスを解除する

特定のIPアドレスからのリクエストをブロックしないことに決めた場合、以下のコマンドでブロックルールを削除できます:

# iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP

-D オプションは、選択されたチェーンから1つ以上のルールを削除します。より長いオプションを使用したい場合は、--delete を使用できます。

5. IPtablesファイアウォールで特定のポートをブロックする

時々、特定のポートでの受信または送信の接続をブロックしたい場合があります。これは良いセキュリティ措置であり、ファイアウォールを設定する際にはそのことについてよく考えるべきです。

特定のポートでの送信接続をブロックするには、次のようにします:

# iptables -A OUTPUT -p tcp --dport xxx -j DROP

受信接続を許可するには、次を使用します:

# iptables -A INPUT -p tcp --dport xxx -j ACCEPT

両方の例において、"xxx"を許可したい実際のポートに置き換えてください。TCPの代わりにUDPトラフィックをブロックしたい場合は、上記のiptablesルールの"tcp"を"udp"に単純に変更してください。

6. マルチポートを使用してIPtablesで複数のポートを許可する

複数のポートを同時に許可することができます。multiportを使用することで、以下に入出力接続のためのそのようなルールを見つけることができます:

# iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT

7. IPtablesで特定のポートに特定のネットワーク範囲を許可する

特定のポートで特定のネットワークへの接続を制限したいかもしれません。たとえば、ポート22からネットワーク192.168.100.0/24への外向き接続を許可したいとします。

このコマンドで実行できます:

# iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT

8. IPtablesファイアウォールでFacebookをブロックする

一部の雇用主は従業員に対してFacebookへのアクセスを制限したいと考えています。以下はFacebookへのトラフィックをブロックする方法の例です。

注意: もしあなたがシステム管理者でこれらのルールを適用する必要がある場合、あなたの同僚があなたと話さなくなるかもしれないことを覚えておいてください :)

まず、Facebookが使用しているIPアドレスを見つけてください:

# host facebook.com 
facebook.com has address 66.220.156.68
# whois 66.220.156.68 | grep CIDR
CIDR: 66.220.144.0/20

そのFacebookネットワークを次のようにブロックできます:

# iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP

Facebookが使用するIPアドレスの範囲は、あなたの国によって異なる場合があることを念頭に置いてください。

9. IPtablesでポートフォワーディングを設定する

時々、あるサービスのトラフィックを別のポートに転送したい場合があります。次のコマンドを使用してこれを達成できます:

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525

上記のコマンドは、ネットワークインターフェースeth0上のすべての受信トラフィックをポート25からポート2525に転送します。必要に応じてポートを変更することができます。

10. IPtablesを使用してApacheポートでのネットワークフラッドをブロックする

時々、IPアドレスがあなたのウェブサイトのウェブポートに対して過剰な接続リクエストを行うことがあります。これにより、いくつかの問題が発生する可能性があり、そのような問題を防ぐために、以下のルールを使用することができます。

# iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

上記のコマンドは、受信接続を毎分100に制限し、バースト制限を200に設定します。制限とバースト制限は、ご自身の特定の要件に応じて編集できます。

11. IPtablesで着信Ping要求をブロックする

一部のシステム管理者は、セキュリティ上の懸念から、受信するpingリクエストをブロックすることを好みます。脅威はそれほど大きくはありませんが、そのようなリクエストをブロックする方法を知っておくのは良いことです。:

# iptables -A INPUT -p icmp -i eth0 -j DROP

12. ループバックアクセスを許可する

ループバックアクセス(127.0.0.1 からのアクセス)は重要であり、常に有効にしておくべきです:

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

13. IPtablesでドロップされたネットワークパケットのログを保持する

eth0でドロップされたパケットをログに記録したい場合は、次のコマンドを使用できます:

# iptables -A INPUT -i eth0 -j LOG --log-prefix "IPtables dropped packets:"

"--log-prefix"の後の値をお好みのものに変更できます。メッセージは/var/log/messagesに記録され、次のように検索できます:

# grep "IPtables dropped packets:" /var/log/messages

14. IPtablesで特定のMACアドレスへのアクセスをブロックする

特定のMACアドレスからのシステムへのアクセスをブロックするには、以下の方法を使用できます:

# iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

もちろん、"00:00:00:00:00:00" をブロックしたい実際のMACアドレスに変更する必要があります。

15. IPアドレスごとの同時接続数を制限する

特定のポートで単一のIPアドレスから同時に接続が多く確立されるのを防ぎたい場合は、以下のコマンドを使用できます:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

上記のコマンドは、クライアントごとに最大3つの接続を許可します。当然ですが、ポート番号を変更して異なるサービスに合わせることができます。また、--connlimit-aboveもあなたの要件に合わせて変更する必要があります。

16. IPtablesルール内を検索

iptables ルールを定義したら、時々検索したり、変更したりする必要があります。ルール内を検索する簡単な方法は、次のようにすることです。

# iptables -L $table -v -n | grep $string

上記の例では、検索したい実際のテーブルで$tableを変更し、探している実際の文字列で$stringを変更する必要があります。

ここに一例があります:

# iptables -L INPUT -v -n | grep 192.168.0.100

17. 新しいIPTablesチェーンを定義する

iptablesを使用すると、自分のチェーンを定義し、その中にカスタムルールを保存できます。チェーンを定義するには、次のようにします:

# iptables -N custom-filter

これで新しいフィルターがあるか確認できます:

# iptables -L
サンプル出力
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain custom-filter (0 references)
target prot opt source destination

18. IPTablesファイアウォールチェーンまたはルールをフラッシュする

ファイアウォールチェーンをフラッシュしたい場合は、次のように使用できます:

# iptables -F

特定のテーブルからチェーンをフラッシュするには、次のようにします:

# iptables -t nat -F

実際にフラッシュしたいチェーンのテーブルである"nat"を変更できます。

19. IPtablesのルールをファイルに保存する

ファイアウォールのルールを保存したい場合は、iptables-save コマンドを使用できます。次のコマンドを使用して、ルールをファイルに保存して格納できます。

# iptables-save > ~/iptables.rules

ファイルをどこに保存し、どのように名前を付けるかはあなた次第です。

20. ファイルからIPtablesルールを復元する

iptablesルールのリストを復元したい場合は、iptables-restoreを使用できます。コマンドは次のようになります:

# iptables-restore < ~/iptables.rules

もちろん、あなたのルールファイルへのパスは異なる場合があります。

21. PCI準拠のためのIPtablesルールの設定

一部のシステム管理者は、サーバーをPCI準拠に設定する必要があるかもしれません。さまざまなPCI準拠のベンダーによって多くの要件がありますが、いくつかの共通の要件もあります。

多くのケースでは、複数のIPアドレスが必要になります。サイトのIPアドレスには以下のルールを適用する必要があります。以下のルールを使用する際は特に注意し、何をしているのか確信がある場合にのみ使用してください。

# iptables -I INPUT -d SITE -p tcp -m multiport --dports 21,25,110,143,465,587,993,995 -j DROP

cPanelや類似のコントロールパネルを使用している場合は、そのポートもブロックする必要があるかもしれません。以下に例を示します:

# iptables -I in_sg -d DEDI_IP -p tcp -m multiport --dports  2082,2083,2095,2096,2525,2086,2087 -j DROP

注意: PCIベンダーの要件を満たしているか確認するために、レポートを注意深く確認し、必要なルールを適用してください。場合によっては、特定のポートでUDPトラフィックをブロックする必要があるかもしれません。

22. 確立された関連接続を許可する

ネットワークトラフィックは受信と送信で分かれているので、確立された関連受信トラフィックを許可する必要があります。受信接続には次のようにしてください:

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

外出用:

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

23. IPtablesで無効なパケットをドロップする

無効なネットワークパケットがある可能性があります。これらのパケットをログに記録することを好む人もいれば、ドロップすることを好む人もいます。無効なパケットをドロップするには、次のようにします:

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

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

いくつかのシステムには、複数のネットワークインターフェースが存在する場合があります。そのネットワークインターフェースへのアクセスを制限するか、特定のIPアドレスからの接続をブロックすることができます。

例えば:

# iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP

“xxx.xxx.xxx.xxx” をブロックしたい実際のIPアドレス(またはネットワーク)に変更してください。

25. IPTablesを使用して送信メールを無効にする

もしあなたのシステムがメールを送信してはいけない場合は、SMTPポートの外向きポートをブロックすることができます。例えば、次のように使うことができます:

# iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT

結論

Iptablesは、簡単に活用できる強力なファイアウォールです。すべてのシステム管理者がiptablesの基本を少なくとも学ぶことは重要です。iptablesおよびそのオプションに関する詳細な情報を見つけたい場合は、そのマニュアルを読むことを強くお勧めします。

# man iptables

もしこのリストにもっとコマンドを追加すべきだと思うなら、以下のコメントセクションに提出して私たちと共有してください。

関連記事: