実際に使える例ではないけれど、例えば wlan0 を dummy 0 にミラーするのであれば
root になって長いコマンド。wlan0 からの出ていく方は
disc prio を wlan0 の最初 (root) として 10 という ID 割り当て。# tc qdisc add dev wlan0 root handle 10: prio # tc filter add dev wlan0 parent 10: prio 10 \ > protocol all u32 match u32 0 0 flowid 10:1 \ > action mirred egress mirror dev dummy0
その 10 を親として 10番という順番で u32 すべてマッチのフィルタを追加。
結果は 10:1 に流すけど 10:1 という qdisc はないのでデフォルト何もせず。
アクションとして dummy0 にミラーを送出。確認は
wlan0 に入ってくる方は# tc qdisc ls dev wlan0 qdisc prio 10: root refcnt 5 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 # tc filter ls dev wlan0 handle 10: filter parent 10: protocol all pref 10 u32 filter parent 10: protocol all pref 10 u32 fh 800: ht divisor 1 filter parent 10: protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 10:1 match 00000000/00000000 at 0 action order 1: mirred (Egress Mirror to device dummy0) pipe index 1 ref 1 bind 1
こちら ingress は ID が ffff と決まっている他は、入ってくる方と同じ。確認は# tc qdisc add dev wlan0 ingress # tc filter add dev wlan0 parent ffff: prio 10 \ > protocol all u32 match u32 0 0 flowid ffff:1 \ > action mirred egress mirror dev dummy0
これで wlan0 を promisc モードにして dummy0 で tcpdump# tc qdisc ls dev wlan0 ingress qdisc prio 10: root refcnt 5 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc ingress ffff: parent ffff:fff1 ---------------- # tc filter ls dev wlan0 handle ffff: filter protocol all pref 10 u32 filter protocol all pref 10 u32 fh 800: ht divisor 1 filter protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid ffff:1 match 00000000/00000000 at 0 action order 1: mirred (Egress Mirror to device dummy0) pipe index 2 ref 1 bind 1
とか。ドキュメントとして iproute-doc にも含まれていないのでソースを# ip link set wlan0 promisc on # tcpdump -nevxi dummy0
とかapt-get source iproute
とかで持ってきた $SRC/doc/actions/mirred-usage を参照。iproute 全般はで、以下その mirred-usage の抜粋意訳、中途訳git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git
普通のイーサネットスイッチでのミラーやリダイレクトの違いは u32 フィ ルタ (classifier) でミラーするフローを選択できること。 mirred アクションの使い方: mirred <DIRECTION> <ACTION> [index INDEX] <dev DEVICENAME> DIRECTION := ingreee か egress ACTION := mirror か redirect INDEX は特定のポリシ ID DEVICENAME はデバイス名 ACTION - mirror はコピーを指定されたデバイスに送る ACTION - redirect はパケットを横取りして指定されたデバイスに送る (なのでローカルプロセスには渡らない) * 禁止事項 A. ループさせない eth0 を eth1 にリダイレクト。更に eth1 を eth0 にリダイレクトなど B. IFB デバイスから別の IFB デバイスにリダイレクトしない ホストはクラッシュしないけどパケット全てが drop される A は再帰によるデバイスキューのロック輻輳。 B は送信ロック (の輻輳?) ---- サンプル 1. eth0 に入ってくるパケットを eth1 にミラー # tc qdisc add dev eth0 ingress # tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 \ > match u32 0 0 flowid 1:2 action mirred egress mirror dev eth1 mirror を redirect に変えるとコピーせずオリジナルパケットを eth1 に送出する 2. lo から eth0 に横取り lo の ingress に届く全てのパケットを eth0 にリダイレクト # tc qdisc add dev lo ingress # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \ > match u32 0 0 flowid 1:2 action mirred egress redirect dev eth0 この設定をしたホストで ping -c 127.0.0.1 としても失敗する。 eth0 の先に接続したホストで tcpdump してみると... XXX このフィルタ内 redirect を mirror に置き換えて # tc filter add dev lo parent ffff: protocol ip u32 \ > match u32 0 0 flowid 1:2 action mirred egress mirror dev eth0 とすると tc 設定をしたホストと、この eth0 の先にある両方のホスト で、パケットを見ることができる。つまりは ping が成功する 3. もうちょっとイカしたサンプル lo の ingress にて 10個の内 1個のパケットがランダムに別ホストへ --- eth0 へ --- 送る (ランダムは netrand generator を使う) XXX: action drop --- 少し違う気がする... # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \ > match u32 0 0 flowid 1:2 \ > action drop random determ ok 10 > action mirred egress mirror dev eth0 4. 10.0.0.9 から来て eth0 に出ていくパケット (ローカルの IP か forwarding するか) が 100Kbps を超えると eth1 にリダイレクト # tc qdisc add dev eth0 handle 1:0 root prio # tc filter add dev eth0 parent 1:0 protocol ip prio 6 u32 \ > match ip src 10.0.0.9/32 flowid 1:16 \ > action police rate 100kbit burst 90 ok \ > action mirred egress mirror dev eth1 5. もっと面白いサンプルとしてフローを (デフォルト全て drop する) dummy デバイスにミラーして tcpdump 192.168.200.200/32 からのパケットをポリシングして、この送出が 100Kbps を超えてほしくないとか # tc qdisc add dev eth0 handle 1:0 root prio # tc filter add dev eth0 pareht 1: protocol ip prio 10 u32 \ > match ip src 192.168.200.200/32 flowid 1:2 \ > action police rate 100kbit burst 90 drop eth0 で tcpdump を実行すると 192.168.200.200/32 からのパケット送 出がドロップされようと、されまいと全て見ることができる (tcpdump は egress される全てのパケットを見せるから)。ルールを少しだけ拡張 して make out したパケットを見るためには # tc qdisc add dev eth0 handler 1:0 root prio # tc filter add dev eth0 parent 1: protocol ip prio 10 u32 \ > match ip src 192.168.200.200/32 flowid 1:2 \ > action police rate 100kbit burst 90 drop \ > action mirred egress mirror dev dummy0 dummy0 で tcpdump を動かして、make out されたパケットだけを見る # tcpdump -n -i dummy0 -x -e -t mirror を redirect に置き換えると、これらパケットは XXX 一切 make out できなくなる
0 件のコメント:
コメントを投稿