Index ソフト・ハード Linuxタスク | iptables |
機能 パケットフィルタリング IPフィルタリング ステート機構 マッチ チェーン ジャンプとターゲット ターゲット コマンド コマンドオプション PFフレームワーク 構成 PFフレームワーク 3組込み型テーブル nat テーブル mangle テーブル filter テーブル ターゲット conntrackエントリ モジュール 動作 ルーティング一般 PFフレームワーク カーネル内工程図 INPUT OUTPUT FORWARD コネクション追跡 TCPステート処理 用語 ルール設定 スクリプトの構造 サンプルNW サンプルスクリプト |
機能 ・Linuxマシンをファイアウォールとして使用 ・サーバーマシンでファイアウォールを実現 パケットフィルタリング ・Linuxカーネル2.4からは、Netfilterフレームワークを採用 ・カーネル内でネットワークスタックへのネットワークパケットの、進入、退出、通過、を制御するプロセス ダイナミックパケットフィルタリング ・特定のパケットのフィルタ通過を覚えておき、それに応答するパケットに対するルールを設定 ・ネットワーク層に作用する。 IPヘッダ、TCPヘッダ ステートフルパケットインスペクションはアプリケーション層へも作用し、 APの通信内容(データ)まで監視する。IPフィルタリング ・iptablesは、IPフィルタの実装定義に厳格ではなく、前後の層の情報でもフィルタリングが行える。 ・宛先/送信元ネットワークアドレス変換、ステートマッチが行える。 コネクション追跡 (connection tracking)IPヘッダ、TCPヘッダ シーケンスナンバーやポートナンバー等で、パケットの身元を調べて記憶 同一のストリームに属しているかどうかを判断 ストリームを追いかけること行わない。 データ同士をくっつけることはしない。 CPU時間の短縮 ストリーム、ファイル、ページの中身を検査する場合は、プロキシテクノロジが適している。ステート機構 (state machine) ・1024から上のポートを全部開け放つ必要はなく、ステート機構を使い、返答のトラフィックのみ開く。 ・コネクション追跡(connection tracking)メカニズムのひとつ コネクション追跡はカーネル内部のconntrackフレームワークが行う。 特定の接続における状態(state)をNetfilterのフレームワークに伝える。 (この機能をもつファイヤーウォールを、ステートフル(stateful)ファイヤーウォールと呼ぶ。)・全てのセッションを常に監視 ・ステートを判断する。 ・追跡済みの接続(tracked connections)との関連性に応じた4つのステート(State) NEW ある特定のコネクションの中でconntrackモジュールが初めて検出したパケット TCPコネクションのSYNパケット ユーザ空間でのステート機構はTCPパケットに記載されたTCPフラグ(SYN等)を見ない。 コネクションはタイムアウトしているが接続自体はクローズされていない局面で有用 ESTABLISHED 既に双方向のトラフィックが検出されている。 それからさらにパケットがやりとりされても、マッチの判定は変わらない。 一方のホストがパケットを送信し、別のホストから返答が来れば、ESTABLISHED NEWステートにある接続は、返答パケットを受け取っればESTABLISHEDステートになる。 送ったパケットが送信先に返答のICMPメッセージを発生させた場合、ICMP応答もESTABLISHED ユーザ空間でのステート機構はTCPパケットに記載されたTCPフラグ(SYN等)を見ない。 コネクションはタイムアウトしているが接続自体はクローズされていない局面で有用 RELATED あるコネクションが、既にESTABLISHEDな別のコネクションに関係している場合、RELATED 接続がRELATEDになるには、既にESTABLISHEDと判定済みの別の接続が必要 ESTABLISHEDコネクションが、自分の主接続の他にもコネクションを発生させる。 conntrackモジュールにRELATEDと認められれば、この新たに発生した接続がRELATED FTP-dataコネクションはFTPコントロールポートにRELATED IRCで開かれるDCCコネクション ファイヤーウォール越しのICMP回答、FTP転送、DCC を成立させるのに利用 正しく解釈するには特別なヘルパーモジュールが必要 ユーザ空間でのステート機構はTCPパケットに記載されたTCPフラグ(SYN等)を見ない。 コネクションはタイムアウトしているが接続自体はクローズされていない局面で有用 INVALID パケットが判定できないか、他のどのステートにも当てはまらない場合 システムがメモリーを使い果たした場合 どの既知の接続にも関連しないICMPエラーメッセージを受け取った場合 全部DROPが妥当・内部ステートタイムアウト NONE 30 分 ESTABLISHED 5 日 SYN_SENT 2 分 SYN_RECV 60 秒 FIN_WAIT 2 分 TIME_WAIT 2 分 CLOSE 10 秒 CLOSE_WAIT 12 時間 LAST_ACK 30 秒 LISTEN 2 分・コネクション追跡テーブルの接続保持可能数 カーネル2.x ip-sysctlによって設定 デフォルト値はマシンの実装メモリ量と関係 128MB:8192エントリが上限 256MB:16376エントリが上限 値の確認と設定 1 /proc/sys/net/ipv4/ip_conntrack_max 値の確認と設定 2 ip_conntrackモジュールのロード時に、hashsizeオプションを与える。 通常、ip_conntrack_maxの値はハッシュサイズの 8 倍 # modprobe ip_conntrack hashsize=4096 # cat /proc/sys/net/ipv4/ip_conntrack_max 32768マッチ (Match):一致条件 ・単一の一致又は、1つルールを1個のマッチとし、それに指定してある全ての条件に一致 ・汎用的なマッチ:プロトコル、マッチ拡張に依存しない、パラメータを必要としない。 -p, --protocol -s, --src, --source -d, --dst, --destination -i, --in-interface eth+イーサネットデバイス -i ! eth0 eth0を除いたすべてのインターフェースにマッチ -o, --out-interface -f, --fragment フラグメンテーションされたパケットの2番目や3番目のパケットのマッチ・暗黙的なマッチ(implicit match) TCPマッチ --sport, --source-port 後ろにサービス名かポートナンバー サービス名は /etc/services ファイルに載っていなければならない。 --dport, --destination-port --tcp-flags --syn --tcp-option UDPマッチ --sport, --source-port --dport, --destination-port ICMPマッチ --icmp-type・明示的なマッチ (explicit match): -m、--match オプションでロードする AH/ESPマッチ カーネル 2.6 AHマッチオプション --ahspi ESPマッチオプション --espspi Conntrackマッチオプション カーネル 2.6 --ctstate --ctproto --ctorigsrc --ctorigdst --ctreplsrc --ctrepldst --ctstatus --ctexpire DSCPマッチオプション カーネル 2.6 --dscp --dscp-class ECNマッチオプション --ecn --ecn-tcp-ece --ecn-ip-ect Helperマッチオプション --helper IP rangeマッチオプション --src-range --dst-range Lengthマッチオプション --length Limitマッチオプション --limit --limit-burst MAC(Ethernet Media Access Control)マッチオプション 明示的に -m mac オプションを指定 --mac-source 例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 PREROUTING、FORWARD、INPUTチェーンでのみ有効 Markマッチオプション --mark Multiportマッチオプション --source-port 例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 --destination-port --port Ownerマッチオプション --uid-owner --gid-owner --pid-owner --sid-owner Packet typeマッチオプション --pkttype Recentマッチオプション --name --set --rcheck --update --remove --seconds --hitcount --rttl --rsource --rdest Stateマッチオプション (ステート機構) --state 例 iptables -A INPUT -m state --state RELATED,ESTABLISHED TCPMSSマッチオプション --mss TOSマッチオプション --tos TTLマッチ --ttl Uncleanマッチチェーンチェーン (Chain) ・パケットの種類を識別するカテゴリ ・各チェーンには特有の役割、適用範囲がある。 ・デフォルトで存在するチェーン(Builtin Chain) INPUT このホスト宛てのパケットを処理 OUTPUT このホストで生成され出力されるパケットを処理 FORWARD 転送されるパケットを処理 PREROUTING どのNICから出力されるか未だ決まっていないパケットを処理 POSTROUTING どのNICから出力されるか決まってるパケットを処理ジャンプとターゲット ・ルールの条件部に合致するパケットを、どう扱うかを指示 ・指定方法は同じ ・ジャンプ(Jump)の場合、ジャンプ先のチェーンが同じテーブル内に存在している必要がある。 ルールの条件に一致したら、パケットは指定した次のチェーンに送られる。ターゲット(Target) ・ルールの持つ条件が全て満たされた場合に、パケットに対して起こすアクション ・ACCEPTターゲット ・CLASSIFYターゲット ・DNATターゲット 動作 IPアドレスの範囲を指定することも可能 DNATメカニズムはその中からIPアドレスをランダムに選ぶ 一種の負荷分散 (load balancing) が可能・DROPターゲット ・DSCPターゲット ・ECNターゲット ・LOGターゲット ・MARKターゲット mangleテーブルでのみ有効なターゲット・MASQUERADEターゲット SNATと比べると処理にかかる負荷が少し大きい・NETMAPターゲット Linuxカーネル2.5と2.6で機能・REDIRECTターゲット パケット破棄後、送信元にICMPエラーメッセージを送信 タイムアウトを待たなくてもよい。 (基本的にDROP使用:クラック対策)・SNATターゲット ファイヤーウォールがパケットのSNATと逆SNAT処理を自動的にやってくれる。・TOS(Type Of Service)ターゲット mangleテーブルでのみ有効なターゲット インターネットへと出ていくパケットに TOS を設定するのは御法度(TCP/IP)・TTLターゲット mangleテーブルでのみ有効なターゲットコマンド -A, --append チェーンの最後尾にルールを追加 -D, --delete ひとつのルールをチェーンから削除 -E, --rename-chain 第1引数の名前を持つチェーンを、第2引数の名前に改名する。 -F, --flush 指定したチェーンからすべてのルールをフラッシングする。 -R, --replace 指定した行にある既存のルールを置き換える。 -I, --insert チェーンの中途にルールを挿入する。 -L, --list 指定したチェーンのすべてのエントリをリストアップする。 -N, --new-chain 指定したテーブルに指定した名称の新しいチェーンを作成する。 -P, --policy 或るチェーンに対してのデフォルトターゲットつまりポリシーを設定する。 -X, --delete-chain 指定したチェーンをテーブルから削除する。 -Z, --zero 指定したチェーンまたは全チェーンにおける、全カウンタをゼロに戻す。コマンドオプションと利用対象コマンド -c, --set-counters 何らかの形でルールを作成や変更する場合に用いる。 --insert, --append, --replace --line-numbers 出力に行番号を表示 --list --modprobe カーネルに対して、モジュールの探索が必要になった時に、使うべきモジュール指定 すべて -n, --numeric 値を数字で表示するよう iptables に指示 --list -v, --verbose 出力を冗長 (verbose) にする。 --list, --append, --insert, --delete, --replace -x, --exact 数字を展開して見せる。 --listコマンド構成 netfilterパケットフィルタリング・フレームワーク ・netfilter ・ip_tables ・connection tracking(ip_conntrack、nf_conntrack) ・NAT subsystem 3組込み型テーブル(規則一覧) ・iptablesは、rulesetsの定義のための一般的なテーブル構造 ・IPテーブルの中の各々の規則 いくつかの分類するもの(iptables matches)と、1つの関係する行動(iptables target)から成る。・各テーブルは、組込み型のチェーン(Builtinチェーン)のグループを持つ ・各チェーンは、ネットフィルタによってパケット上で実行されるアクションに相当 3natテーブル ・ネットワークアドレス変換 (Network Address Translation) に使用 ・NATされたパケットは、ルールに従ってIPアドレスが変更 ・このテーブルに行き当たるのは、ストリームの最初のパケットだけ ・後続のパケットは全て、先頭パケットの執った行動に倣う。 ・(ストリームの残りのパケットは、自動的にNAT又は、Masquerade) ・Builtinチェーン PREROUTING チェーン ファイヤーウォールに入ってすぐにパケットを変換する。 OUTPUT チェーン ローカルで発生したパケットをルーティング判断以前に変換する。 POSTROUTING チェーン パケットがファイヤーウォールを離れる直前に変換する。mangle テーブル ・主にパケットの改変に使用 ・(TTL、TOS、MARK等の変更) ・Builtinチェーン PREROUTING パケットを、ファイヤーウォールへの進入直後、且つルーティング判断前の時点で改変する。 POSTROUTING OUTPUT ローカルで発生したパケットをルーティング判断の後で改変する。 INPUT パケットがローカルへ誘導された後で、且つデータがユーザ空間アプリケーションに会う前に改変する。 FORWARD ルーティングの第一判断の後、且つ最終ルーティング判断の前にパケットを改変する。filter テーブル ・Builtinチェーン FORWARD 発生源がローカルでなく、宛先もローカルでないパケットに対して使用する。 INPUT ローカルホストを宛先とするすべてのパケットに使用する。 OUTPUT ローカルで発生したパケットすべてに使用する。conntrack エントリ ・ip_conntrackモジュールをロード ・/proc/net/ip_conntrack(動作時に確認) 動作 TCP/IP宛先誘導型ルーティングの一般的動作(destination driven routing) ・パケット生成 ・パケットの宛先アドレスを見て、ホスト自身の保持しているルーティングテーブルと照合 ・宛先アドレスがローカルな場合、パケットは直接、ハードウェアMACアドレスを用いて送られる。 ・宛先がゲートウェイの向こう側の場合、パケットはゲートウェイのMACアドレスへと送られる。 ・ゲートウェイはパケットのIPヘッダを読み、パケットの宛先アドレスを知る。 ・パケットの宛先アドレスを見て、ホスト自身の保持しているルーティングテーブルと照合 ・宛先アドレスがローカルな場合、パケットは直接、ハードウェアMACアドレスを用いて送られる。 ・宛先がゲートウェイの向こう側の場合、パケットは次のゲートウェイへ送られる。 宛先のアドレスの属するネットワークに到達するまで繰り返されるパケットフィルタリング・フレームワーク動作 ・ネットワークスタック内の動作 Linux 2.4.x、2.6.xシリーズのLinuxカーネルの内のフックのセット カーネルモジュールはネットワークスタックでコールバック機能を登録するのを許可 登録済コールバック機能は、それぞれのフックを横断するパケットのために呼び戻さる。カーネル内の工程図 ファイヤーウォールに入ったパケットが目的の(ローカル上の)アプリケーションに辿り着くまで ・ハードウェアに行き当たり、カーネルの持つデバイスドライバ に渡る。 通信ケーブル上 インターフェースに入る。・パケットの改変(mangle)処理(例、TOS変更)、コネクション追跡が活動 (mangleのPREROUTINGチェーン) table mangle Chain PREROUTING・主にDNATに使用する(このチェーンはバイパスされる場合もある:フィルタリング処理禁止) (natのPREROUTINGチェーン) table nat Chain INPUT・ルーティング判断(ローカルホスト宛か、フォワードされるならどこへ) ・ルーティング後で且つ、マシン上の実際のプロセスに送られる前のパケット改変に使用 (mangleのINPUTチェーン) table mangle Chain INPUT・ローカルホスト宛のパケットに対してフィルタリングを行う。 (filterのINPUTチェーン) table filter Chain INPUT・ローカルプロセス/アプリケーション ローカルホストを送信元とするパケット ・ローカルプロセス/アプリケーション パケット生成・ルーティング判断(使用する送信元アドレス、出口のインターフェース等の情報収集) パケットの宛先アドレスを見て、ホスト自身の保持しているルーティングテーブルと照合・パケットを改変(フィルタリング処理はしない)、発生パケットに対し、コネクション追跡が活動 table mangle Chain OUTPUT・NAT table nat Chain OUTPUT・ルーティング判断(ルーティング方針が、mangleとnatで変更された可能性があるため) ・パケットをフィルタリング table filter Chain OUTPUT・パケット改変をしたい場合に使用(ホストを離れる前鰍ツ、ルーティング判断がなされた後) table mangle Chain POSTROUTING・SNAT (副作用を避けるため、フィルタリングを行わない) table nat Chain POSTROUTING・カーネルの持つデバイスドライバからハードウェアへ インターフェースから出ていく 通信ケーブル上ファイヤーウォールに入ったパケットが別のホストに送られるまで ・ハードウェアに行き当たり、カーネルの持つデバイスドライバに渡る。 通信ケーブル上 インターフェースに入る・パケットの改変(mangle)処理(例、TOS変更)、コネクション追跡が活動 ・(mangleのPREROUTINGチェーン) table mangle Chain PREROUTING・主にDNATに使用する(このチェーンはバイパスされる場合もある。:フィルタリング処理禁止) ・(natのPREROUTINGチェーン) table nat Chain PREROUTING・ルーティング判断(ローカルホスト宛か、フォワードされるならどこへ) ・ルーティング判断後で且つ、パケットが送出される直前の最終ルーティング判断の前パケット改変に使用 ・(mangleのFORWARDチェーン) table mangle Chain FORWARD・フォワードされたパケットに対してフィルタリングを行う。 ・(filterのFORWARDチェーン) table filter Chain FORWARD・ルーティング判断後、まだパケットがマシン上にある、特殊なタイプのパケット改変処理をしたい場合 table mangle Chain POSTROUTING・SNAT、フィルタリングに使ってはならない。(IPマスカレードを含む) table nat Chain POSTROUTING・カーネルの持つデバイスドライバからハードウェアへ インターフェースから出ていく。 通信ケーブル上コネクション追跡 ・コネクション追跡はすべてPREROUTINGチェーンで行われる。 ステートの再検出などすべての処理・(パケットがローカルで発生したものである場合はOUTPUTチェーンで行う。) ローカルからストリームの開始となるパケットを送出した場合 OUTPUTチェーンで、このストリームはNEWステートと判定 このパケットに対して返答が返ってくれば、PREROUTINGチェーンでステートがESTABLISHEDに変わる。TCPステート処理 ・TCPコネクション(リンク) ・カーネルの内部では、TCP コネクションに特有のいくつものステートが存在する。 それらのステートはユーザ空間では利用できない。・ユーザから見た時、コネクション追跡が示すコードは、TCPコネクションの手続きを文字通りには反映してない。 ・(コネクション追跡機構は、コネクションの確立過程をひとまとめにNEWと判断しない。) まずひとつのパケット(SYNパケット)を検出すると、コネクション追跡はこの接続をNEWと判定 返答パケット(SYN/ACK)を検出するとESTABLISHEDと判定用語 ・Accept (許可) パケット受入・Drop/Deny (破棄/拒否) ・Policy (ポリシー) チェーンのポリシー どのルールにもマッチしなかったパケットを処すデフォルトのアクションをファイヤーウォールに指示 ドキュメント上の根底に流れるセキュリティ方針・Reject (拒絶) パケットが破棄されたことを送信者に返答 反転機能(送信先に送る)はない。 DoS攻撃に対してはメリット・Rule (ルール) 1つ以上のターゲットを持つ、1項目以上の一致条件(Match)の集まり・Ruleset (ルールセット) 1個以上のルールから成る一塊の総体、IPフィルタはこの「ルールセット」をロードして動作・カーネル空間 カーネルの外でないところで起こるあらゆる事象 ルールセットに新たなルールを加える。 $iptables -A FORWARD -p tcp -j ACCEPT・コネクション TCP接続では、3ウェイハンドシェイクを踏んで接続を確立・コネクションタイプ ・ステート パケットがどの状態にあるかを示す。・ストリーム 関係のあるパケットをやりとりする接続・データグラム ・データストリーム ・デフラグメンテーション デフラグメンテーションはconntrack(リンク)に組み込まれて自動的に行われる。・パケット ネットワーク伝送の最小単位 ひとつのヘッダとデータ部から成る。 IP パケット:データグラム TCP パケット:セグメント・フラグメンテーション ・ユーザ空間 カーネルの外で起きるあらゆる事象 $iptables -hルール設定 スクリプトの構造 ・Configuration スクリプト全体で使用する設定オプションの記述 Internet インターネット接続に関連する設定オプション DMZ DMZゾーンの設定オプション LAN ファイヤーウォールの背後にあるLANの設定オプション Localhost ローカルホストの設定オプション DHCP DHCP特有の設定オプション PPPoE PPPoE接続を使用する場合の設定オプション iptables iptablesバイナリの在処を示す。 Other どの項目にも当てはまらない、Configurationゥ体のサブセクション・Module loading モジュールのリストを管理 Required modules 必要なモジュール Non-required modules 通常の操作では必要のないモジュール・proc configuration procファイルシステムに必要な設定 Required proc configuration スクリプトが機能するために必要なprocの全設定項目 Non-required proc configuration 使用してみれば有用なproc設定項目・rules set up ルールをテーブル毎に分ける。 ルールセットの中で出てくるチェーン名毎に並べる。 チェーンとその中のルールの順番は、「iptables -L」コマンドで出力される順番 Filter table Set policies システムチェーンすべてのデフォルトポリシーをセット 各チェーンのポリシーはDROPに設定 それぞれのチェーンの中で、受け入れるサービスやストリームをACCEPTにする。 Create user specified chains 当テーブル内で使っていくユーザ定義チェーンを作成 Create content in user specified chains チェーンの中のルールも全部組み立てる INPUT chain INPUTチェーンのルール作成 FORWARD chain FORWARD チェーンのルール作成 OUTPUT chain OUTPUT チェーンのルール作成 nat table nat テーブルの処理 Set policies デフォルトポリシーをすべてセット、ACCEPTにしない理由は見あたらない。 Create user specified chains いらない理由が見つからない。 Create content in user specified chains いらない理由が見つからない。 PREROUTING chain 必要に応じてDNATを行う。 POSTROUTING chain SNATターゲット又は、MASQUERADEターゲットを使用 OUTPUT chain このチェーンを使う正当な理由が見つからない。 mangle table 全般的に、このテーブルをまったく使わない。 Set policies デフォルトポリシーの設定、設定しない。 Create user specified chains 扱うデータがないなら不要 Create content in user specified chains このテーブルにユーザ定義チェーンがある時 PREROUTING chain 扱うデータがないなら不要 INPUT chain 扱うデータがないなら不要 FORWARD chain 扱うデータがないなら不要 OUTPUT chain 扱うデータがないなら不要 POSTROUTING chain 扱うデータがないなら不要サンプルネットワーク構成(ファイアウォールBOXに3枚のNIC) ・eth0 インターネット IPエイリアス設定により、複数のグローバルアドレスを持つ。 (1つのグローバルアドレスを共有する場合も同様) ファイヤーウォールに複数のIPアドレスでパケットを聞ける処置をする。 1対1のNATを設定する、又は サブネットワークを作り、ファイヤーウォールに内部/外部用IPを与える。 読み取られるIP ネットワークアドレス ブロードキャスト用・eth1 非武装地帯(DMZ:De-Militalized Zone) ・eth2 信頼する内部ネットワーク(Trusted Internal Network) サンプルスクリプト(IPは適宜) #! /bin/sh # ################################################# # 1 Configuration options (シンボルの定義) ################################################# # 1.1 Internet Configuration INT_NIC="eth0" INT1_IP="194.236.50.152" INT2_IP="194.236.50.153" INT3_IP="194.236.50.154" # 1.1.1 DHCP # 1.1.2 PPPoE ################################################# # 1.2 LAN Configuration LAN_NIC="eth1" LAN_IP="192.168.0.1" ################################################# # 1.3 DMZ Configuration DMZ_NIC="eth2" DMZ_IP="192.168.1.1" DMZ_HTTP_IP="192.168.1.2" DMZ_DNS_IP="192.168.1.3" DMZ_SMTP_IP="192.168.1.4" DMZ_POP3_IP="192.168.1.5" DMZ_SSH_IP="192.168.1.6" ################################################# # 1.4 Localhost Configuration LO_IFACE="lo" LO_IP="127.0.0.1" ################################################# # 1.5 IPTables Configuration IPTABLES="/sbin/iptables" ################################################# # 1.6 Other Configuration # (IP Address for Maintenance) MAINT_IP1="192.168.0.10" # (Port) MULT_PORT="80,25,110,53,22" # FTP_PORT="" ################################################# # 2 Module loading ################################################# # Needed to initially load modules /sbin/depmod -a ################################################# # 2.1 Required modules (PKGはスタティックにカーネルにコンパイル) #/sbin/modprobe ip_tables #/sbin/modprobe ip_conntrack #/sbin/modprobe iptable_filter #/sbin/modprobe iptable_mangle #/sbin/modprobe iptable_nat #/sbin/modprobe ipt_LOG #/sbin/modprobe ipt_limit #/sbin/modprobe ipt_state # 2.2 Non-Required modules (自動的にロードされない必要なモジュール) #/sbin/modprobe ipt_owner #/sbin/modprobe ipt_REJECT #/sbin/modprobe ipt_MASQUERADE #/sbin/modprobe ip_conntrack_ftp # FTP ステートフルインスペクション #/sbin/modprobe ip_conntrack_irc #/sbin/modprobe ip_nat_ftp # FTP NAT #/sbin/modprobe ip_nat_irc ################################################# # 3 /proc set up ################################################# # 3.1 Required proc configuration # (ホストをルーターとして機能させる) echo "1" > /proc/sys/net/ipv4/ip_forward # 3.2 Non-Required proc configuration #echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter #echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp #echo "1" > /proc/sys/net/ipv4/ip_dynaddr ################################################# # (既存のルールを全て削除) $IPTABLES -F -t filter $IPTABLES -F -t nat $IPTABLES -F -t mangle $IPTABLES -X ################################################# # 4.1 Filter table ################################################# # 4.1.1 Set policies (又は、最後に「-A」で追加、その前にログを出す) $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP ################################################# # 4.1.2 Create userspecified chains # Create chain for bad tcp packets $IPTABLES -N bad_tcp_packets # Create separate chains for ICMP, TCP and UDP to traverse $IPTABLES -N allowed $IPTABLES -N icmp_packets # 4.1.3 Create content in userspecified chains # bad_tcp_packets chain $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:" $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP # allowed chain $IPTABLES -A allowed -p TCP --syn -j ACCEPT $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A allowed -p TCP -j DROP # TCP rules # ICMP rules # Changed rules totally $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT ################################################# # 4.1.4 INPUT chain # Bad TCP packets we don't want $IPTABLES -A INPUT -p tcp -j bad_tcp_packets # Packets from the Internet to this box $IPTABLES -A INPUT -p ICMP -i $INT_NIC -j icmp_packets # Packets from LAN, DMZ or LOCALHOST # From DMZ Interface to DMZ firewall IP $IPTABLES -A INPUT -p ALL -i $DMZ_NIC -d $DMZ_IP -j ACCEPT # From LAN Interface to LAN firewall IP $IPTABLES -A INPUT -p ALL -i $LAN_NIC -d $LAN_IP -j ACCEPT # From Localhost interface to Localhost IP's (For localhost) $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INT1_IP -j ACCEPT # Special rule for DHCP requests from LAN, which are not caught properly otherwise $IPTABLES -A INPUT -p UDP -i $LAN_NIC --dport 67 --sport 68 -j ACCEPT # All established and related packets incoming from the internet to the firewall $IPTABLES -A INPUT -p ALL -d $INT1_IP -m state --state ESTABLISHED,RELATED -j ACCEPT # Win,CL,UDPブロードキャスト無視 #$IPTABLES -A INPUT -p UDP -i $INT_NIC -d $INET_BROADCAST --destination-port 137:139 -j DROP # If we get DHCP requests from the Outside of our network, our logs will be swamped as well. This rule will block them from getting logged. #$IPTABLES -A INPUT -p UDP -i $INT_NIC -d 255.255.255.255 --destination-port 67:68 -j DROP # If you have a Microsoft Network on the outside of your firewall, you may also get flooded by Multicasts. We drop them so we do not get flooded by logs #$IPTABLES -A INPUT -i $INT_NIC -d 224.0.0.0/8 -j DROP # Log weird packets that don't match the above $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: " ######## For IP spoofing #$IPTABLES -A INPUT -s 192.168.0.0/16 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -A INPUT -s 192.168.0.0/16 -i $INT_NIC -j DROP #$IPTABLES -A INPUT -s 172.16.0.0/12 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -A INPUT -s 172.16.0.0/12 -i $INT_NIC -j DROP #$IPTABLES -A INPUT -s 127.0.0.0/8 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -A INPUT -s 127.0.0.0/8 -i $INT_NIC -j DROP #$IPTABLES -A INPUT -d 192.168.0.0/16 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -A INPUT -d 192.168.0.0/16 -i $INT_NIC -j DROP ################################################# # 4.1.5 FORWARD chain # Bad TCP packets we don't want $IPTABLES -A FORWARD -p tcp -j bad_tcp_packets # DMZ section # General rules $IPTABLES -A FORWARD -i $DMZ_NIC -o $INT_NIC -j ACCEPT $IPTABLES -A FORWARD -i $INT_NIC -o $DMZ_NIC -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i $LAN_NIC -o $DMZ_NIC -j ACCEPT $IPTABLES -A FORWARD -i $DMZ_NIC -o $LAN_NIC -m state --state ESTABLISHED,RELATED -j ACCEPT # HTTP server $IPTABLES -A FORWARD -p TCP -i $INT_NIC -o $DMZ_NIC -d $DMZ_HTTP_IP --dport 80 -j allowed $IPTABLES -A FORWARD -p ICMP -i $INT_NIC -o $DMZ_NIC -d $DMZ_HTTP_IP -j icmp_packets # DNS server $IPTABLES -A FORWARD -p TCP -i $INT_NIC -o $DMZ_NIC -d $DMZ_DNS_IP --dport 53 -j allowed $IPTABLES -A FORWARD -p UDP -i $INT_NIC -o $DMZ_NIC -d $DMZ_DNS_IP --dport 53 -j ACCEPT $IPTABLES -A FORWARD -p ICMP -i $INT_NIC -o $DMZ_NIC -d $DMZ_DNS_IP -j icmp_packets # SMTP server # POP3 server # SSH server # LAN section $IPTABLES -A FORWARD -i $LAN_NIC -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Log weird packets that don't match the above $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: " ################################################# # 4.1.6 OUTPUT chain # Bad TCP packets we don't want. $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets # Special OUTPUT rules to decide which IP's to allow (For localhost) $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT $IPTABLES -A OUTPUT -p ALL -s $INT1_IP -j ACCEPT # Log weird packets that don't match the above. $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: " ################################################# ######## 否定、LOG (Filter table Set policies の代わり) #$IPTABLES -A INPUT -j LOG --log-prefix "IN-Deny! " #$IPTABLES -A INPUT -j DROP #$IPTABLES -A OUTPUT -j LOG --log-prefix "OUT-Deny! " #$IPTABLES -A OUTPUT -j DROP #$IPTABLES -A FORWARD -j LOG --log-prefix "FOR-Deny! " #$IPTABLES -A FORWARD -j DROP ################################################# # 4.2 nat table # 4.2.1 Set policies # 4.2.2 Create user specified chains # 4.2.3 Create content in user specified chains ################################################# # 4.2.4 PREROUTING chain $IPTABLES -t nat -A PREROUTING -p TCP -i $INT_NIC -d $INT1_IP --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP $IPTABLES -t nat -A PREROUTING -p TCP -i $INT_NIC -d $INT2_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP $IPTABLES -t nat -A PREROUTING -p UDP -i $INT_NIC -d $INT2_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP $IPTABLES -t nat -A PREROUTING -p TCP -i $INT_NIC -d $INT2_IP --dport 25 -j DNAT --to-destination $DMZ_SMTP_IP $IPTABLES -t nat -A PREROUTING -p TCP -i $INT_NIC -d $INT2_IP --dport 110 -j DNAT --to-destination $DMZ_POP3_IP $IPTABLES -t nat -A PREROUTING -p TCP -i $INT_NIC -d $INT3_IP --dport 22 -j DNAT --to-destination $DMZ_SSH_IP ######## For IP spoofing #$IPTABLES -t nat -A PREROUTING -s 192.168.0.0/16 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -t nat -A PREROUTING -s 192.168.0.0/16 -i $INT_NIC -j DROP #$IPTABLES -t nat -A PREROUTING -s 172.16.0.0/12 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -t nat -A PREROUTING -s 172.16.0.0/12 -i $INT_NIC -j DROP #$IPTABLES -t nat -A PREROUTING -s 127.0.0.0/8 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -t nat -A PREROUTING -s 127.0.0.0/8 -i $INT_NIC -j DROP #$IPTABLES -t nat -A PREROUTING -d 192.168.0.0/16 -i $INT_NIC -j LOG --log-prefix "IP Spoofing " #$IPTABLES -t nat -A PREROUTING -d 192.168.0.0/16 -i $INT_NIC -j DROP ################################################# # 4.2.5 POSTROUTING chain # Enable simple IP Forwarding and Network Address Translation $IPTABLES -t nat -A POSTROUTING -o $INT_NIC -j SNAT --to-source $INT1_IP #バージョン確認 ################################################# # 4.2.6 OUTPUT chain ################################################# # 4.3 mangle table # 4.3.1 Set policies # 4.3.2 Create user specified chains # 4.3.3 Create content in user specified chains # 4.3.4 PREROUTING chain # 4.3.5 INPUT chain # 4.3.6 FORWARD chain # 4.3.7 OUTPUT chain # 4.3.8 POSTROUTING chain ## End of file ## |
All Rights Reserved. Copyright (C) ITCL |