CentOS6.Xでは、ネットワークのファイアーウォールとしてiptablesを使用しています。iptablesの概要、フィルタリング設定の方法をまとめました。
※参考サイト
HowTOs-CentOS Wiki IPTables
※目次をクリックすると目次の下部にコンテンツが表示されます。
1)Netfilterとiptables
・Linuxカーネルは、Netfilterと呼ばれる強力なネットワークサブシステムを特長としている。
・Netfilterは、NATおよびIPマスカレードのサービスのほかにも、ステートフルまたはステートレスのパケットフィルタリング機能を提供する。
また、Netfilterには、高ルーティングや接続状態の高度な管理のためにIPヘッダー情報を分割(マングル: mangle)する機能もある。
Netfilterはiptablesを使って制御される。
2)iptablesの概要
・Netfilterの強力な機能と柔軟性は、iptablesを使って実行される。
・このコマンドラインツールは、その前身であるipchains(Linuxカーネル2.4以上でNetfilter/iptablesに置き換えられる)の構文と似ている。
・iptablesは、Netfilterを使用してネットワークの接続、検査および処理などを強化する。
・iptablesは、高度なロギング、プレルーティングとポストルーティングの動作、ネットワークアドレス変換およびポート転送機能すべてをオールインワンの1つのコマンドラインインターフェースで実現する。
3)iptablesのフォールバックファイル
・デフォルトの設定が適用できない場合、iptablesのフォールバックのファイアウォール設定を提供する。
/etc/sysconfig/iptablesにあるファイアウォールルールの適用が失敗した場合、フォールバックファイルが存在していればそのファイルが適用される。
このフォールバックファイルの名前は/etc/sysconfig/iptables.fallbackとなり、/etc/sysconfig/iptablesと同じファイル形式になる。
4)iptablesサービスの有効化
ファイアウォールのルールは、iptablesサービスが実行されている場合にのみ有効で、サービスを手動で開始するには、以下のコマンドをrootユーザーとして実行する。
# service iptables restart
iptablesがシステムのブート時に自動起動されるようにするには、以下のコマンドを使用する。
# chkconfig –level 345 iptables on
# rpm -q iptables iptables-1.4.7-9.el6.x86_64
2)iptablesのモジュールがロードされているか確認
# lsmod | grep ip_tables ip_tables 17831 1 iptable_filter
3)現在設定されているルールを表示
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED DROP icmp -- anywhere anywhere icmp timestamp-request ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp timestamp-reply
1)3つのチェイン
・INPUT
そのホスト宛に入ってくるすべてのパケット
・OUTPUT
そのホストが発信元で生成されるすべてのパケット
・FORWARD
送信元、送信先ではなく、そのホストを経由して通り過ぎるすべてのパケット
2)iptablesの処理動作
・各ルールはそれぞれのチェインのリストに追加されます。
例えば、tcp22番ポート(ssh)に入ってくるパケットを許可するルールを追加する場合は、INPUTチェインにそのルールが追加されます。
・送受信されるパケットはリストの先頭から順番にルールに従ってチェックされます。ルールにマッチするとアクション(許可、拒否)が実行されます。
・ひとたびルールがマッチするとアクションは実行され、パケットはそのルールの結果に従って処理され、チェイン内ではそれ以上は処理されません。
・チェイン内のルールにマッチせずにリストの下端に達した場合は、そのチェインのデフォルトアクション(許可、拒否)によって処理されます。
これはデフォルトポリシーとして参照され、パケットをACCEPT(許可)するかDROP(拒否)するかで定義されています。
・デフォルトポリシーと各ルールの設定方法には下記方法があります。
①デフォルトポリシーをDROPとし、信頼できるパケットや必要なパケットのみをACCEPTするようにしてルールを追加します。
外部からのパケットは信頼できないパケットもありますのでINPUTチェインの設定に使われます。
②デフォルトポリシーをACCEPTとし、不要なパケットや設定が必要な項目のみDROPします。
自ホストからのパケットは基本的には信頼できるのでOUTPUTチェインの設定に使われます。
3)iptablesコマンドの概要
〇構文
iptables [オプション] [パラメータ]
〇主なオプション
・-A
指定したチェーンの終わりにルールを追加
・-P
指定したチェーンについてデフォルトのポリシーを設定する。
・-F
チェイン(省略した場合はすべて)のルールを削除する。
・-L
チェイン(省略した場合はすべて)のルールを一覧表示する。
〇主なパラメータ
・-i
eth0やppp0などの着信ネットワークインターフェースを指定。
・-j
パケットが特定の規則に一致した場合に、指定されたターゲット(ACCEPT、DROPなど)にジャンプするよう指定。
・–state
ESTABLISHED、INVALID、NEW、RELATEDの接続状態についてパケットを照合する。
・-p
プロトコル(tcp, udp, icmp, allなど)を指定する。
・–dport
パケットの送信先ポートを指定する。
・-s
送信元のアドレスを指定する。
注)SSHでリモート接続している状態で以下の設定作業を行う場合は、自分自身の接続が締め出されてしまう可能性があるので注意が必要です。
現状のルールを消去する前に、インプットパケットを許可するデフォルトポリシーと追加してから行うようにします。
以下に実行例を示します。
(実行例)
# iptables -P INPUT ACCEPT # iptables -F # iptables -A INPUT -i lo -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT # iptables -L -v Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
●上記設定例の各コマンドの説明
①iptables -P INPUT ACCEPT
リモート接続している場合、現状のルールを消去すると自分自身が締め出されてしまう(自宅の端末から接続しているサーバーへ送ったパケットが拒否されてしまう)可能性があるので、インプットパケットを許可するデフォルトポリシーを設定します。
②iptables -F
現状のルールを消去して、きれいな状態から設定を追加します。
③iptables -A INPUT -i lo -j ACCEPT
“-i(interface)”スイッチで”lo(localhost)”を指定しています。ローカルホスト向けのインプットパケットを許可します。
これは、多くのアプリでローカルホストアダプターと接続できる事を想定していて、使用されているためです。
④iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
“-m”スイッチで”state”モジュールを指定しています。”state”モジュールは、パケットのステートを調べて判断します。
ESTABLISHEDとRELATEDのステートは、すでに接続が確立しているパケットと関連するパケットなので許可します。
⑤iptables -A INPUT -p tcp –dport 22 -j ACCEPT
ssh(ポート番号がデフォルトの22の場合)接続を許可します。
⑥iptables -P INPUT DROP
インプットパケットのデフォルトポリシーをDROPにします。明示的に許可する設定がないパケットはデフォルトポリシーによってDROPされます。
⑦iptables -P FORWARD DROP
ルーターとして使用しない場合は、パケットを転送する必要がないのでデフォルトポリシーをDROPにします。
⑧iptables -P OUTPUT ACCEPT
自マシンから出て行くパケットは、基本的には信頼できるのでデフォルトポリシーを許可にします。
⑨iptables -L -v
ルールのリストを表示し、正しく設定されているか確認します。
正しく設定されていたら、下記コマンドで設定を保存します。これによってマシンをリブートしても保存したルールが自動でロードされます。
# service iptables save
このコマンドを実行すると設定内容が/etc/sysconfig/iptablesに保存されます。
ネットワークインタフェースに対してルールを設定する場合の設定例です。
・ローカルホスト(127.0.0.1)に入っていくるパケットを許可
iptables -A INPUT -i lo -j ACCEPT
・eth0とeth1の二つのインタフェースがあって、eth0がインターネット用のネットワークでeth1が内部LAN用の場合で、内部LANからのすべてのINPUTを許可する場合
iptables -A INPUT -i eth1 -j ACCEPT
2)特定のIPアドレスに対してルールを設定
送信元のIPアドレスを特定して接続の許可を設定できます。
①特定のIPアドレスのみを許可する場合
例)
iptables -A INPUT -s 192.168.0.4 -j ACCEPT
②特定のネットワークアドレスのみを許可する場合
・プレフィックス表示(/24など)で指定
例)
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
・サブネットマスクで指定
例)
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
③IPアドレスとともにMACアドレスも指定する場合
インターネットからのアクセスに対しては使用できませんが、LANからのアクセスで、IPアドレスは偽装される恐れがあるため、端末固有に割り振られているMACアドレスも共に指定したい場合です。
例)
iptables -A INPUT -s 192.168.0.4 -m mac –mac-source 00:50:8D:FD:E6:32 -j ACCEPT
3)ポート、プロトコルを指定してルールを設定
特定のポート、プロトコルへのパケットに対してルールを設定します。
①特定のポートへのパケットを許可
例)tcpの6881番ポートへのアクセスを許可する場合
iptables -A INPUT -p tcp –dport 6881 -j ACCEPT
②あるポート範囲へのパケットを許可
例)tcp6881から6890番ポートへのアクセスを許可する場合
iptables -A INPUT -p tcp –dport 6881:6890 -j ACCEPT
4)SSHの設定例