機能
   パケットフィルタリング
   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: "

#################################################
######## 否定、LOGFilter 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 ##