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を手で書いていた時代よりも今のご時世に合ったルールを書いている
    • マルチホームするときはパケットを見つけるのに苦労する

Docker内でTUN/TAPを使うときのメモ

Dockerコンテナ内でTUN/TAP IFを使う用途が出て最初上手くいかなかったのでその時のメモ。

使ったベースのイメージは公式(?)の fedora:20

/dev/net/tun が無い
$ docker run -ti fedora:20 bash
bash-4.2# ip tuntap add tun0 mode tun
open: No such file or directory
bash-4.2#

まず最初に躓くのはこれ。まぁちょっとググったら分かるんだけど、何が"No such file or directory"なのか教えてくれないのでわかりづらい。
最近の環境だと大体しょっぱなからdevfs周りは整備されているから気づきづらいかもしれない

bash-4.2# mkdir -p /dev/net
bash-4.2# mknod /dev/net/tun c 10 200
bash-4.2# chmod 666 /dev/net/tun

マジックナンバーはまぁkernel内部の話だから仕方ないのかなと思う。

rootでip tuntapしても怒られる
bash-4.2# ip tuntap add tun0 mode tun
ioctl(TUNSETIFF): Operation not permitted
bash-4.2#

ホストでSecureOS関連は動いていないので(ゴメンナサイイシカワサン)rootでも蹴られたのは解決までちょっとかかった。
docker runは実行時に--privilegedというオプションを渡せて、これで特権が必要なアクセスができるようになる。

$ docker run --help                                            [14-08-31 23:00]

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

(((snip)))

                               (use 'docker port' to see the actual mapping)
  --privileged=false         Give extended privileges to this container
  --restart=""               Restart policy to apply when a container exits (no, 
ということで

--privileged付きで実行して、mknodすればいいことがわかったので、

$ docker run --privileged -ti fedora:20 bash
bash-4.2# mkdir -p /dev/net
bash-4.2# mknod /dev/net/tun c 10 200
mknod: '/dev/net/tun': File exists
bash-4.2# ls -l /dev/net/tun 
crw-rw-rw- 1 root root 10, 200 Aug 31 14:04 /dev/net/tun
bash-4.2#

どうやら--privilegedが付いていると/dev/net/tunは作られるようだ...

結論
  • 基本的に--privilegedを付けてrunすればいい
  • ただ、Dockerfile内とかで/dev/net/tunが存在している必要がある場合はmknodするしかない
    • ところで、docker buildには--privilegedがないけど途中で必要なときどうすればいいんだろう

Cisco c2811に1GBのメモリを乗せてみると...

いろいろあってDDR ECC 512MBなDIMMを複数枚手に入れたので、自宅にあったc2811に挿してみた。

ちなみにサポートされているメモリの最大サイズは768MB*1で、c2811はスロットが2本あるので手元で最大1GBにできることになる。

PCとかは最大~GBとか書いてあっても挿せば公称最大より増やせたりするけど、ルータはどうなんだろうと思って挿してみた。

This platform does not support 1 GB Memory
Total Memory is Restricted to 768 MB

c2811 platform with 786432 Kbytes of main memory
Main memory is configured to 64 bit mode with ECC enabled

なるほど、プログラム上の問題なのかハード的な問題なのかは知らないけど768MBにしっかり丸められるらしい。

CentOS 7リリースに寄せて

Ubuntuのリリースがあっても、GCCのリリースがあっても取り立ててトラフィックは増えないのに、CentOSのリリースがあるだけでとんでもないことになっている。
以前から日本のCentOS依存度が桁違いに高いと実しやかに囁かれていたが、事実であったことが証明されたようだ。

とりあえず、現在のftp.tsukubaの状態はこんな感じ

http://gyazo.flast.jp/img/a229af4a53b4c4c4dd73c29c3924e4db.png

これはworkerの数で、赤がactiveにトラフィックを吐いている奴ら。
平時は左側の方の大体20~30ぐらいなんだけど、ピーク時には10倍ぐらいのworkerが仕事してた。

http://gyazo.flast.jp/img/8596e1ca76f6fc8df8a9893173fd91fd.png

トラフィックはこっちで、対外線は1GbEなので、8割方埋まった感じ。
トラフィックが多い事自体はさほど問題ではないんだけど、かといってユーザが増えるとGbEが埋まってしまうのでそれ以上サービスできないというのがつらい。


あと、CentOSでmirrorを固定するのはどうなんだろうっていう。
まぁ、こういう時のためにミラーってあるんじゃないの?っていうのは十分わかるんだけど、fastestmirrorがあったりするところはそういうところを使って欲しいかなっていうのが感じる。

逆に、mirrorを指定しないといけないUbuntuみたいなのはちゃんと設定して欲しいし(jp.ubuntuなんかいつもhitoさんがヒィヒィ言ってる気がする...)。

jaistは緊急にクールダウンしてるし、iijとかはスッカスカって言ってるし、うちんとこは上に書いたようにまぁ出そうと思えば未だ出る。naraはまだsyncできていないって言ってた。

twitterで割とそういう情報今はとれるから、リリースノートと一緒にそういう人たちを眺めていると、まずそもそも自分が幸せになれると思う。

(rikenはちょっとわからないし、kddilabも中の人は知らない...)


まぁつまり、もうすこし、自分が使っているものに興味を持ってもいいんじゃないかなって思った。

-- 1:38追記

もう少し長いレンジで普段のトラフィックを眺めるとこんな感じ。異常なのがまぁなんとなくわかってもらえると思う

http://gyazo.flast.jp/img/8e64b416154b49d2a56a15c24f1995c0.png

OSPF+VRFで困ってること

いろいろあって、vrfしてるところでospfを喋りたくなって

vrf definition vrf1
 description vrf1
 !
 address-family ipv4
 exit-address-family
!
interface Loopback0
 vrf forwarding vrf1
 ip address 203.0.113.72 255.255.255.255
 ip ospf 72 area 192.0.2.0
!
interface FastEthernet0/0
 vrf forwarding vrf1
 ip address 192.0.2.253 255.255.255.0
 ip ospf 72 area 192.0.2.0
!
router ospf 72 vrf vrf1
 router-id 203.0.113.72
 log-adjacency-changes
!

みたいな事した時に、

cisco2.osaka#sh ip os
 Routing Process "ospf 72" with ID 203.0.113.72
...
 Connected to MPLS VPN Superbackbone, VRF vrf1

ってなってしまって、area 0がMPLS Super-Backbone扱いになってしまう。そのせいで、本来のarea 0から流れてくるLSAがなんか無視される。
LSDB眺めるとType5 LSAとして記録されてるけどribには乗らない。

MPLSを喋りたいわけではないので困った。

VyOSでOSPFv3を喋るときに注意しないといけないこと

VyOS 1.0.3で起こった

OSPFはMTUを揃えないといけないのは周知の事実だけど、VyOSはなんというか全体的にv6を特別扱いしてて、別オプション見て下さいm9m9m9ということが多くて、今回もそういうのにハマったという話。

対向が光Pなところにあるので、mtuが結構削られてしまうし、デフォルトだとそういうことしてくれないのでやるしかない。

例えば

 address 192.0.2.0/30
 address 2001:db8::/126
 description tu-1.cisco1.osaka.flast.jp
 encapsulation gre
 ip {
     ospf {
         network point-to-point
     }
 }
 ipv6 {
     ospfv3 {
     }
 }
 local-ip 203.0.113.1
 mtu 1414
 multicast enable
 remote-ip 203.0.113.2
[edit interfaces tunnel tun0]

みたいな感じでやると、v4のOSPFはふつうにMTU 1414で喋ってくれるけど、v6の方は確か1476とかでしゃべり始める

ciscoはv4とv6でそれぞれmtu設定できるし、そういう感じだろうと思ってたけどv6自体は1414で動いてるっぽい。

で、OSPFv3は専用のオプションがあって、

 ipv6 {
     ospfv3 {
         ifmtu 1414
     }
 }

こうする。

うーん、、

AS64623 on IHANet

私的な話ですが、自宅のルータ達がIHANetでAS64623として経路広告をはじめました。

経路交換しましょうという方いれば是非ご連絡下さい!
Twitterでも、コメントでも、as64623 _at_ flast.jp でも大丈夫です。