Webサーバー構築の基礎 > iptablesとは? Linuxには、「netfilter」「iptables」というファイアウォールの仕組みが備わっている。 iptablesとは? †
ISO参照モデルのレイヤー3(L3、IPパケット)を対象にして動作する。 参考書 †#html{{ 参考リンク †
用語 †iptablesには、用語・概念がいろいろ出てくるが、意味を押さえておかないと、チンプンカンプンになる。>< テーブル †「テーブル」は、パケットフィルタリングなどのルールを保持する空間です。
チェイン †「チェイン」は、パケットを取り扱う方法を記述したルールのリストです。
各テーブルに用意されているチェインがあります。
ルール †「ルール」は、パケットを取り扱う方法の定義です。 ターゲット †「ターゲット」は、ルールの条件にマッチしたパケットの処理方法です。
ユーザー定義チェイン †デフォルトで用意されている5つのチェインの他に、新しいチェインをユーザーが定義することもできます。 ユーザー定義チェインは、ターゲットとして指定できます。 パケットの評価 †iptablesによるパケットフィルタリングが動作しているサーバーでは、NICを通過するパケットは、
そして、
チェインによっては、複数のテーブルで同じ名前のチェインが定義されている場合がありますが、そのすべてが順に評価されます。 ルールの考え方 †設定されたルールを評価する方式は、ファイアウォールソフトによって様々です。 ふるい落とし方式 †いったんすべてのルールを評価する方式です。 選抜方式 †この方法は、最初にマッチしたルールに出会った時点でルールを評価します。 iptablesの使い方 †iptablesコマンドのルール書式について、まとめ。 iptables [-t <table-name>] <command> <chain-name> <parameter-1> <option-1> <parameter-n> <option-n> iptables [テーブル] コマンド [チェイン] [パラメーター(オプション)] [ターゲット] という書式のルールを書き連ねていくことで、様々なパケットフィルタリングを設定できます。 テーブルの指定 †テーブルは、「-t」オプションで指定します。 -t テーブル名
コマンドの指定 †コマンドによって、チェインを指定して、チェインを操作します。 (参考)管理者必見! ネットワーク・コマンド集 - iptablesコマンド:ITpro http://itpro.nikkeibp.co.jp/article/COLUMN/20070327/266505/
主に、
パラメーター(条件)の指定 †パラメーターの指定によって、IPパケットにフィルタリング処理を適用する条件を指定できます。 プロトコルの指定 †条件として、プロトコルを指定する場合、「-p」(または「--protocol」)オプションを使います。
インターフェースの指定 †条件として、インターフェース(LANカード、NIC)を指定する場合、
※インターフェース名には、「eth*」の他に、「ppp*」「tap*」等があります。 マッチングモジュールの指定 †条件として、マッチングモジュールを指定する場合、「-m」(または「--match」)オプションを使います。
(例) --limit 5/hour → 1時間に5回だけ照合。 回数と時間を指定しない場合は、デフォルト値の 3/hour が使用される。
指定できる状態は、
これらの接続状態を複数組み合わせて使用するには、-m state --state INVALID,NEWのようにカンマで区切ります。
ターゲットの指定 †ターゲットは、「-j」(または「--jump」)オプションで指定します。 -j ターゲット名
使用例 †
フィルタリングルールの保存 †iptablesのルールセットファイル †iptablesのルールセットは、 /etc/sysconfig/iptables というファイルに記述して、保存します。 起動スクリプト /etc/init.d/iptables を実行すると、 サービスの開始/停止/再起動 †
iptables設定の確認方法 †
iptablesの文法に間違いがあれば、エラーメッセージが出ます。 サンプル †パケットフィルタリングの例1 †(参考)iptablesの設定 http://www.nina.jp/server/redhat/iptables/iptables.html # /etc/sysconfig/iptables ### テーブル ### *テーブル名 # パケットフィルタリングでは、filterテーブルを使用 *filter # filterテーブル、パケットのフィルタリングを実施 ### チェーンの定義 ### :チェーン名 デフォルトポリシー [パケットカウント:バイトカウント] # INPUT/FORWARD/OUTPUチェーンのいずれかひとつのみ使用する # デフォルトポリシーをACCEPTにすると明示されないパケットは通過され、DROPにすると明示されないパケットは破棄される :INPUT ACCEPT [0:0] # INPUTチェーン、送信先がローカルホストのパケットに適用される :FORWARD ACCEPT [0:0] # FORWARDチェーン、ローカルホストを経由するパケットに適用される :OUTPUT ACCEPT [0:0] # OUTPUTチェーン、送信元がローカルホストのパケットに適用 :RH-Firewall-1-INPUT - [0:0] # ユーザ定義チェーン ### ルール # 基本は、-A チェーン名 マッチング条件 -j ターゲット # -A チェーン名 : チェーンに新たなルールを追加 # -j(--jump) ターゲット : 条件したパケットをどうするか指定 # ターゲットには、ACCEPT(許可)/DROP(破棄)/REJECT(拒否)ユーザ定義チェーンなどなどを指定 # # マッチング条件の一部 # 頭に"!"をつけると、notという意味 # -i(--in-interface) 受信インタフェース : filterテーブルでは、INPUT/FORWARDチェーンで使用可能 # -o(--out-interface) 送信インタフェース : filterテーブルでは、OUTPUT/FORWARDチェーンで使用可能 # -p(--protocol) プロトコルまたはプロトコル番号 : 指定できるプロトコルは、tcp/udp/icmp/all # -s(--source、--src) 送信元アドレス : "192.168.0.1"、"192.168.0.0/24"、"192.168.0.0/255.255.255.0"のように指定 # -d(--destination、--dst) 送信先アドレス : "192.168.0.1"、"192.168.0.0/24"、"192.168.0.0/255.255.255.0"のように指定 # # 以下は拡張されたマッチングの一部 # 頭に"!"をつけると、notという意味 # -m tcp --sport(--source-port) TCP送信元ポート : "-p tcp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m tcp --dport(--destination-port) TCP送信先ポート : "-p tcp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m udp --sport(--source-port) UDP送信元ポート : "-p udp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m udp --dport(--destination-port) UDP送信先ポート : "-p udp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m state --state 接続状態 : 接続状態には、NEW(新規)/ESTABLISHED(接続中)/RELATED(既存の接続に関係?)/INVALID(その他)を指定 # --icmp-type ICMPタイプ : "-p icmp"のとき使用可能、指定できるICMPタイプは"iptables -p icmp -h"で確認 -A INPUT -j RH-Firewall-1-INPUT # ローカルホスト宛のパケットは、ユーザ定義チェーン"RH-Firewall-1-INPUT"でチェック -A FORWARD -j RH-Firewall-1-INPUT # ローカルホスト経由のパケットは、ユーザ定義チェーン"RH-Firewall-1-INPUT"でチェック -A RH-Firewall-1-INPUT -i lo -j ACCEPT # 受信インタフェースが"lo"(ループバック)ならば、通信を許可 -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT # プロトコルが"icmp"ならば、通信を許可 -A RH-Firewall-1-INPUT -p 50 -j ACCEPT # プロトコル番号が"50"(ESP)ならば、通信を許可 -A RH-Firewall-1-INPUT -p 51 -j ACCEPT # プロトコル番号が"51"(AH)ならば、通信を許可 -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT # プロトコルが"udp"かつ送信先ポートが"5353"(Multicast DNS)かつ送信先アドレスが"224.0.0.251"ならば、通信を許可 -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT # プロトコルが"udp"かつ送信先ポートが"631"(Internet Printing Protocol)ならば、通信を許可 -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 接続状態が"ESTABLISHED"または"RELATED"ならば、通信を許可 # これがないと通信ができない! -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT # 接続状態が"NEW"かつプロトコルが"tcp"かつ送信先ポートが"22"ならば、通信を許可 # SSHサーバへの接続要求パケット -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT # 接続状態が"NEW"かつプロトコルが"tcp"かつ送信先ポートが"80"ならば、通信を許可 # HTTPサーバへの接続要求パケット -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT # 接続状態が"NEW"かつプロトコルが"tcp"かつ送信先ポートが"21"ならば、通信を許可 # FTPサーバへの接続要求パケット -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT # 接続状態が"NEW"かつプロトコルが"tcp"かつ送信先ポートが"25"ならば、通信を許可 # SMTPサーバへの接続要求パケット -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited # ここまでのチェックでひっかからなかったパケットは、ICMPパケット"host-prohibited"を返して接続拒否 ### COMMIT COMMIT # 以上を登録 パケットフィルタリングの例2 †(参考)僕が考えた最強のサーバ設定 - とあるプログラマの日記 @s025236 http://d.hatena.ne.jp/s025236/20120307/p1
###################################################################### # makoto@2ch.to *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] ###################################################################### # ループバック/ICMP/確立済みの接続 -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A INPUT -p ipv6 -j ACCEPT -A OUTPUT -p ipv6 -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A OUTPUT -p ipv6-icmp -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ###################################################################### # OUTPUT -A OUTPUT -m state --state NEW -p tcp --dport ssh -j ACCEPT -A OUTPUT -m state --state NEW -p tcp --dport smtp -j ACCEPT -A OUTPUT -m state --state NEW -p tcp --dport domain -j ACCEPT -A OUTPUT -m state --state NEW -p udp --dport domain -j ACCEPT -A OUTPUT -m state --state NEW -p tcp --dport http -j ACCEPT -A OUTPUT -m state --state NEW -p udp --dport ntp -j ACCEPT -A OUTPUT -m state --state NEW -p tcp --dport https -j ACCEPT -A OUTPUT -m state --state NEW -p tcp --dport mysql -j ACCEPT #↓memcached #-A OUTPUT -m state --state NEW -p tcp --dport 11211 -j ACCEPT ###################################################################### # 公開ポート 必要なこだけコメントを外すこと #-A INPUT -m state --state NEW -p tcp --dport smtp -j ACCEPT #-A INPUT -m state --state NEW -p tcp --dport domain -j ACCEPT #-A INPUT -m state --state NEW -p udp --dport domain -j ACCEPT -A INPUT -m state --state NEW -p tcp --dport http -j ACCEPT #-A INPUT -m state --state NEW -p tcp --dport https -j ACCEPT #↓可能ならSAFTYを利用する #-A INPUT -m state --state NEW -p tcp --dport ssh -j ACCEPT ###################################################################### # 信頼できるIP -N SAFETY -A SAFETY -m state --state NEW -p tcp --dport ssh -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport smtp -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport http -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport https -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport mysql -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport 11211 -j ACCEPT -A SAFETY -m state --state NEW -p tcp --dport postgres -j ACCEPT -A INPUT -s 自分ちの固定IP -j SAFETY COMMIT ループバックインターフェース †lo → loopback
パケットの種類 †パケットの遷移状態には、「NEW」「ESTABLISHED」「RELATED」「INVALID」の4種類があります。
|