Contributed by: akira on 2011年11月29日(火) 14:12 JST
Last modified on
メモ
●iptablesの設定あれこれ
【基本操作】
・チェイン(因に下記はフィルタされる順番)
PREROUTING:ルーティング前
FORWARD:ルーティングするパケット処理
INPUT : ルーティング後にローカルに向かう
OUTPUT:ローカルからの送信
POSTROUTING:パケットがシステムから出る最後に処理
・ターゲット
-j:ターゲットの指定。ジャンプの意味。1つしか指定できない
ACCEPT:許可(組みこみ)
DROP:破棄(組みこみ)
LOG:ログ収集(拡張)、ファシリティkernelでsyslogに渡される
REJECT:許可しない(拡張)
・チェイン操作
-F:全てのルールをフラッシュ
-L:表示
-X:カスタムチェインの削除
-A:追加
-I:挿入(iptables -I INPUT 3 ルール....)
-D:削除(iptables -D OUTPUT 3)
・基本マッチ
-o:発信インタフェース(FORWARD,OUTPUT,POSTROUTINGで適用)
-i:着信インタフェース(FORWARD,INPUT,PREROUTINGで適用)
-p:プロトコル
-s:ソースIP
-d:ディスティネーションIP
・拡張マッチ
-m:マッチ拡張の呼出し(tcp,udp,stateを指定し各プロトコルの拡張マッチ呼出し)
-p:プロトコル
--sport:ソースポート
--dport:デスティネーションポート
--tcp-flags:TCPフラグ
--syn:SYN接続
使用例)iptables -A INPUT -m tcp -p tcp --syn -j DROP
【流れ】
+-----------------+ +---------+ +-----------------+ +------------------+ ppp,eth ---> | PREROUTING(nat) | ---> | Routing | ---> | FORWARD(filter) | ---> | POSTROUTING(nat) | ---> ppp,eth +-----------------+ +---------+ +-----------------+ +------------------+ ↓ ↑ +---------------+ +----------------+ | INPUT(filter) | | OUTPUT(filter) | +---------------+ +----------------+ ↓ ↑ +---------------------------------------------------------+ | proccess | +---------------------------------------------------------+【デフォルトポリシーの設定】
・初期化
#iptables -F : 全てのチェインをフラッシュ
#iptables -X : カスタムチェインを削除(組みこみチェインは対象外)
#for chain in INPUT FORWARD OUTPUT; do iptables -P $chain DROP;done : 全てのポリシー初期化
【許可しないパケットを全てロギング】
・iptablesではターゲットは1つしか指定できないので、新たにテーブル作成
これで”-j LOGDROP”でログしてからドロップ
・LOGターゲットだけ唯一、評価された後、終了せず次のチェインに戻る
#iptables -N logdrop
#iptables -A logdrop -j LOG
#iptables -A logdrop -j DROP
・以下のルールを最後に追加すれば、明示的に拒否していないパケットもログ
(先頭に書くと全部拒否してしまうよ)
#iptables -A INPUT -j logdrop
#iptables -A OUTPUT -j logdrop
【ループバック通信の許可】
・ループバックの許可(DROPの指定は当然loインタフェースに適用される)
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
【ステートフルインスペクション】
・確立された接続許可
#iptables -A INPUT -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT
・公開サービスへの許可
#iptables -A INPUT -m state --state NEW -p tcp --dport 25 -i eth0 -j ACCEPT
・送信パケットの許可
#iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -o eth0 -j ACCEPT
【NATの設定】
●あて先NAT:フィルタで指定したアドレスが使用され、PREROUTING(ルーティング前)
:チェインで設定される。
・あて先を1つのIPに変換
#iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.0.1
・IPの範囲を指定して変換
#iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.0.1-192.168.0.20
・ポートリダイレクト
#iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.1:8080
●送信元NAT:SNAT、MASQUERADEで、フィルタで指定したアドレスが使用されない
:POSTROUTING(ルーティング後)で設定される
:ローカル LAN 上で利用されていないアドレスに SNAT マッピングするなら
:(例えば、192.168.0.0/24 ネットワーク上で、空き IP アドレスである
:192.168.0.20 にマッピングする)、NAT ボックスは、自分自身のアドレスに対する
:ARP リクエストに加え、そのマッピングしたアドレスに対する ARP リクエストにも
:レスポンスを返す必要が出てきます。これを行うには、以下の例のように IP alias
:を作成するのが最も簡単な方法です。(ホスト自身のIPへの変換時は不要)
# ip address add 1.2.3.99 dev eth0
・マスカレードの設定
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
・特定の送信元ポートにマップ
#iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.0.1:3000
・特定IPへの変更
#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.1
・IPの範囲を指定して変換
#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.1-192.168.0.20
・ポートの範囲を指定して変換
#iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 192.168.0.1:1-1023
【通常のインプットフィルタ】
・IDENTサービスはREJECTしタイムアウトによる遅延を避ける
#iptables -A INPUT -p tcp -m tcp --dport 113 -i eth0 -j REJECT --reject-with tcp-reset
・特別なサーバからのサービス許可(NTP)
#iptables -A INPUT -s 192.168.0.1 -p udp -m udp --dport 123 -i eth0 -j ACCEPT
・外部からの接続要求以外を許可
#iptables -A INPUT -m tcp -p tcp ! --syn -j ACCEPT
・ping-flood拒否(一行目で通常のリクエスト許可、それ以外のリクエストつまり異常なリクエスト拒否)
#iptables -A INPUT -s 0/0 -d 192.168.0.1 -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 2 -i eth0 -j ACCEPT
#iptables -A INPUT -s 0/0 -d 192.168.0.1 -p icmp --icmp-type 8 -i eth0 -j DROP
【ポートリダイレクト】
・Squidを透過的に動かす例(下記2つは同じ挙動)
#iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j REDIRECT --to-port 3128
#iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.1:3128
【その後の操作】
・ポリシーの保存(iptables-saveは保存形式で出力されるので下記の様にリダイレクトする)
# iptables-save > /etc/sysconfig/iptables
・起動の設定(次回以降は/etc/sysconfig/iptablesを参照する)
# /etc/rc.d/ini.d/iptables start
# chkconfig --level 2345 iptables on