第4のbe...、テーブル
今fedora 20な鯖で色々遊ぼうとしていて、
[fc20] == SIT == [R1] --- [R2]
見たいな感じにトンネル張ってfc20の中のdockerに曲げようとしたりしていた。
R1からの疎通に関しては問題なく出来ていたのだが、R2からテストしてみたところ全く通らなかった。
戻り経路は入れてなくて、とりあえずdockerだったり、そこら辺のインターフェイスにパケットが出現することを期待していた。
ところがtcpdumpで各所を眺めてみていたが、トンネルifには出現するが、他のところには一切出てこなかった。
fc20ではfirewalldが動いたが、トンネルもdockerもfirewalldのどのzoneにも属していなかったので直接(v6で遊んでたので)ip6tablesを眺めることにした。
まずは思いつくところとして、FORWARDとINPUTチェインの先頭にLOGを仕込んでみたが現れず。
それよりもっと前の段階だとどこだろうと、有名な
この図を眺めてnatテーブルやmangleテーブルのPREROUTINGに仕込んでみるがかすりもしなかった。
mangleテーブルですらパケットの切れ端が見えず、どこで落ちているか全く見当がつかなかった。
第4のテーブルとRPF
いよいよわからなくなってしまったが、netfilterのflowの図を知ったのは結構前だと思いだし、もしかしたら更新とかされているのでは?と、もう少しflowを探してみたところ、こんなのを発見。
rawテーブル...だと...?!?
今までnetfilterはテーブルが3つあると教えられて来たし、テーブルは3つだと説明している所が殆どで、第4のテーブルの出現には衝撃を受けた。
早速rawテーブルのPREROUTINGを眺めてみると、
# ip6tables -t raw -vL Chain PREROUTING (policy ACCEPT 3857 packets, 650K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT ipv6-icmp any any anywhere anywhere ipv6-icmp router-advertisement 236 12108 DROP all any any anywhere anywhere rpfilter invert 3861 650K PREROUTING_direct all any any anywhere anywhere Chain OUTPUT (policy ACCEPT 1890 packets, 838K bytes) pkts bytes target prot opt in out source destination 1895 839K OUTPUT_direct all any any anywhere anywhere Chain OUTPUT_direct (1 references) pkts bytes target prot opt in out source destination Chain PREROUTING_direct (1 references) pkts bytes target prot opt in out source destination
なんか書いてある...
入力パケットのしょっぱなに通るPREROUTINGの2行目を見ると、rpfilterの文字が。
rawテーブルのこと知らなくてもRPFと言われたら分かった。
試しにPREROUTINGをwatchしながらR1からパケットを投げてみると案の定このポリシーのカウンタが増えていった。
ということでRPFなので経路を入れると普通に通った。
# ip -6 r avia dev
ちなみにmain以外のルーティングテーブルに入れてもRPFを通るようになる。
まとめ
- rawテーブルの存在
- firewalldは*tablesを手で書いていた時代よりも今のご時世に合ったルールを書いている
- マルチホームするときはパケットを見つけるのに苦労する