2025年 4月5日(土) 07:09 JST

iptables

  • 2011年11月29日(火) 14:12 JST
  • 投稿者:
  • 表示回数 528

 メモ

●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