読者です 読者をやめる 読者になる 読者になる

AS2500の最果てで

AS2500のどっかのNOCのまとまらないまとめ

第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を仕込んでみたが現れず。
それよりもっと前の段階だとどこだろうと、有名な
http://img.blog.163.com/photo/w7xb4d2DXKWO1lyAGZ9htg==/4007922193384375894.jpg
この図を眺めてnatテーブルやmangleテーブルのPREROUTINGに仕込んでみるがかすりもしなかった。
mangleテーブルですらパケットの切れ端が見えず、どこで落ちているか全く見当がつかなかった。

第4のテーブルとRPF

いよいよわからなくなってしまったが、netfilterのflowの図を知ったのは結構前だと思いだし、もしかしたら更新とかされているのでは?と、もう少しflowを探してみたところ、こんなのを発見。
http://jengelh.medozas.de/images/nf-packet-flow.png

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 a  via  dev 

ちなみにmain以外のルーティングテーブルに入れてもRPFを通るようになる。

まとめ
  • rawテーブルの存在
    • firewalldは*tablesを手で書いていた時代よりも今のご時世に合ったルールを書いている
    • マルチホームするときはパケットを見つけるのに苦労する