トップ 最新 追記

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


01/20/2013 ふむ [長年日記]

tDiary 3741日目

[Linux][メモ] CentOS 6 (2.6.32) の IPsec がなんかへんな件

gretap+ipsec, ipgre+ipsec, ipip+ipsec で同様に,スループットが異様に悪いという現象にぶち当たったので色々調査していたのだけれど,ワークアラウンドは見つけたのでメモっておく. はっきりとした原因はまだつかめていないけれど.

この「悪い」というのがどういうことかというと,後述する試験環境では素のトンネリングで 100M/s くらいなのだけれど,ipsec をかました瞬間に 15M/s 以下になり,その後どんどん遅くなっていき,500K/s くらいにまでなったりするというもの.とにかく安定しないのが特徴.

結論を先に書くと,ipsec をかますときはトンネルインタフェースに local を指定しておかないといけない. 指定しないと,動くけどスループットが異様に悪い.いっそ動かなければここまで悩むことはなかったのだけれど...

ちなみに 2.6.33 を乗せた Fedora Core 13 では local 指定がなくても遅くなったりはしない. CentOS 6 に無理矢理 FC13 の 2.6.33 をインストールして動かすと local 指定がなくても遅くならないので,2.6.32 に何かあると見てほぼ間違いない.

確認に使った環境は以下の通り. 家に物理マシンが 1 台しかないので全部 VM で. ipgre は構成的に ipip と同じなので割愛.

gretap:
gretap
ipip:
ipip

gretap の方はこんな感じで作る.対向側は remote/local を逆転させるだけなので割愛.

// racoon 設定.テスト用に軽そうなやつで
# vi /etc/racoon/racoon.conf
path pre_shared_key "/etc/racoon/psk.txt";

remote 10.0.0.102 {
       exchange_mode main;
       proposal {
               encryption_algorithm  aes;
               hash_algorithm        md5;
               authentication_method pre_shared_key;
               dh_group              2;
       }
}

sainfo anonymous {
       lifetime                 time 1 hour;
       encryption_algorithm     null_enc;
       authentication_algorithm hmac_md5;
       compression_algorithm    deflate;
}

// 事前共有鍵.何でもいい
# vi /etc/racoon/psk.txt
10.0.0.102 testpsk

// 色々モジュールロード
# modprobe aes
# modprobe esp4
# modprobe af_key
# modprobe ipcomp
# modprobe crypto_null
# modprobe xfrm4_mode_transport

// racoon スタート
# service racoon start

// ブリッジ作る
# brctl addbr br0
# ip link set br0 up

// veth 作ってブリッジに参加
# ip link add name veth0 type veth peer name veth1
# ip addr add 1.1.1.1/24 dev veth0
# ip link set veth0 mtu 1300
# ip link set veth0 up
# ip link set veth1 up
# brctl addif br0 veth1

// gretap 作ってブリッジに参加
# modprobe ip_gre
# ip link add name gre1 type gretap remote 10.0.0.102
# ip link set gre1 up
# brctl addif br0 gre1

// SPD 設定.ESP Transport Mode で
# cat <<'EOL' | setkey -c
flush;
spdflush;
spdadd 10.0.0.101 10.0.0.102 gre -P out ipsec esp/transport//require;
spdadd 10.0.0.102 10.0.0.101 gre -P in  ipsec esp/transport//require;
EOL

ipip の場合は下記.racoon 周りは gretap と一緒なのでその辺は割愛.

// ipip 作る
# modprobe ipip
# ip tunnel add name tnl1 mode ipip remote 10.0.0.102
# ip addr add 1.1.1.1/24 peer 1.1.1.2 dev tnl1
# ip link set tnl1 mtu 1300
# ip link set tnl1 up

// SPD 設定.ESP Transport Mode で
# cat <<'EOL' | setkey -c
flush;
spdflush;
spdadd 10.0.0.101 10.0.0.102 ipencap -P out ipsec esp/transport//require;
spdadd 10.0.0.102 10.0.0.101 ipencap -P in  ipsec esp/transport//require;
EOL

上記はスループットが悪くなるもの. これを回避するには,トンネルインタフェース作成のところを以下のように変更する.

// gretap の場合
# ip link add name gre1 type gretap local 10.0.0.101 remote 10.0.0.102

// ipip の場合
# ip tunnel add name tnl1 mode ipip local 10.0.0.101 remote 10.0.0.102

最初に書いた通り,違いは local のあるなしのみ. この状態だと 35M/s くらいで安定した.

この local のあるなしが一体どんな差を生むのかということでコードを流し読みしてみたんだけれど,イマイチよく分からなかった... 結局のところはルーティングテーブルを引く時にソースアドレスを指定するか否かなんだけど,ルーティングテーブルのキャッシュのキーが変わるくらいにしか見えず,xfrm に渡るものは結局ソースアドレスを補完したものなので差がよくわからず. xfrm ってこのキャッシュを使って何かしたりするのかしら...

追記

CentOS 5 (2.6.18) でも試してみた (ipgre と ipip のみ) けどこの現象は起きなかった.やっぱ CentOS 6 (2.6.32) なんかおかしい.