25すべてのLinux管理者が知っておくべき便利なIPtableファイアウォールルール


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

ここで iptables が役に立ちます。 Iptablesは、システム管理者が一連の構成可能なテーブルルールを介して着信および発信トラフィックを管理できるようにするLinuxコマンドラインファイアウォールです。

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

iptablesのマニュアルによると、現在3種類のテーブルがあります。

    1. FILTER – this is the default table, which contains the built in chains for:
      1. INPUT  – packages destined for local sockets
      2. FORWARD – packets routed through the system
      3. OUTPUT – packets generated locally
      1. PREROUTING – used for altering a packet as soon as it’s received
      2. OUTPUT – used for altering locally generated packets
      3. POSTROUTING – used for altering packets as they are about to go out
      1. PREROUTING – for altering incoming connections
      2. OUTPUT – for altering locally generated  packets
      3. INPUT – for incoming packets
      4. POSTROUTING – for altering packets as they are about to go out
      5. FORWARD – for packets routed through the box

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

      1.Iptablesファイアウォールを開始/停止/再起動します

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

      ------------ On Cent/RHEL 7 and Fedora 22+ ------------
      # systemctl start iptables
      # systemctl stop iptables
      # systemctl restart iptables
      
      ------------ 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.マルチポートを使用してIPテーブルで複数のポートを許可する

      マルチポートを使用すると、一度に複数のポートを許可できます。以下に、着信接続と発信接続の両方に対するそのようなルールを示します。

      # 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アドレスが、WebサイトのWebポートに対して多すぎる接続を要求する場合があります。これにより多くの問題が発生する可能性があり、そのような問題を防ぐために、次のルールを使用できます。

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

      上記のコマンドは、着信接続を1分あたりから 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
      

      上記の例では、 を検索する実際のテーブルに変更し、 を検索する実際の文字列に変更する必要があります。

      次に例を示します。

      # 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
      

      このリストにさらにコマンドを追加する必要があると思われる場合は、下のコメントセクションに送信して、コマンドを共有してください。