RTX1000 が VPN で packet loss するわけがないじゃないか
id:blooper:20120208 の時点で RTX1000 を AWS の VPC と繋いだら packet loss が激しかったので職場でボヤいてみました。
つわけで MTU の最適値をめっけて設定するところからはじめるぜ。
折れない packet で MTU にうってつけの値を探すこと
ping の man 見るとこんな感じ
-s packetsize Specifies the number of data bytes to be sent. The default is 56, which translates into 64 ICMP data bytes when combined with the 8 bytes of ICMP header data. -M hint Select Path MTU Discovery strategy. hint may be either do (prohibit fragmentation, even local one), want (do PMTU discovery, fragment locally when packet size is large), or dont (do not set DF flag).
よーし、とーさん ping 打っちゃうぞー
$ ping -s 1472 -c 3 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 1472(1500) bytes of data. From 192.168.36.2 icmp_seq=1 Frag needed and DF set (mtu = 1454) From 192.168.36.2 icmp_seq=2 Frag needed and DF set (mtu = 1454) From 192.168.36.2 icmp_seq=3 Frag needed and DF set (mtu = 1454) --- 8.8.8.8 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2002ms
Ethernet つったら 1500 bytes だと思って 1500 bytes で ping 打ったのに届かないよ!! というわけでフレッツ光の場合には 1454 に設定しろって言われてるし config にもちゃんと
pp select 1 ppp lcp mru on 1454 ip pp mtu 1454
という設定をしていました。問題は tunnel の方だぜ。
$ ping -M do -s 1472 -c 3 169.254.252.1 PING 169.254.252.5 (169.254.252.1) 1472(1500) bytes of data. From 192.168.36.2 icmp_seq=1 Frag needed and DF set (mtu = 1280) From 192.168.36.2 icmp_seq=2 Frag needed and DF set (mtu = 1280) From 192.168.36.2 icmp_seq=3 Frag needed and DF set (mtu = 1280) --- 169.254.252.1 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2002ms
1280 にしろというオラクルを頂きました。こりゃ何でかっつーと「9.1.4 インタフェースの MTU の設定」にある通り tunnel の MTU がデフォルトで 1280 になってるから。じゃぁどんくらまでいけるのよ? ということでここでおもむろに
# tunnel select 1 # ip tunnel mtu 1454 # tunnel select 2 # ip tunnel mtu 1454
としてみる。
$ ping -s 1426 -c 3 169.254.252.1 PING 169.254.252.1 (169.254.252.1) 1426(1454) bytes of data. --- 169.254.252.1 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 2015ms
通らない、何も通らない。size を小さくしていってみると、
$ ping -s 1363 -c 3 169.254.252.1 PING 169.254.252.1 (169.254.252.1) 1363(1391) bytes of data. --- 169.254.252.1 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 1999ms $ ping -s 1362 -c 3 169.254.252.1 PING 169.254.252.1 (169.254.252.1) 1362(1390) bytes of data. 1370 bytes from 169.254.252.1: icmp_req=1 ttl=63 time=12.4 ms 1370 bytes from 169.254.252.1: icmp_req=2 ttl=63 time=13.1 ms 1370 bytes from 169.254.252.1: icmp_req=3 ttl=63 time=18.1 ms --- 169.254.252.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 12.404/14.583/18.183/2.567 ms
1390 bytes でキター。ってこれ id:j3tm0t0:20111108 で計算されてる値そのものですね。失礼しました。mss の設定も 1390 - 40 でいいのかなと思ったけど auto ってので多分同じことしてくれるんだろうと思って auto でお茶を濁すことに。
tunnel select 1 ip tunnel mtu 1390 ip tunnel tcp mss limit auto tunnel select 2 ip tunnel mtu 1390 ip tunnel tcp mss limit auto
よーしこれで! と思ったけど、packet loss はまだ無くならないのでした。
ログがあるならログを読め
んー、何かログに残ってないのかな、とおもって log 見てみました。
$ egrep 'IP Tunnel\[1\]' rtxlog.txt (略) 2012/02/11 02:08:35: IP Tunnel[1] Up 2012/02/11 02:09:05: IP Tunnel[1] Down 2012/02/11 02:09:10: IP Tunnel[1] Up 2012/02/11 02:09:27: IP Tunnel[1] Down 2012/02/11 02:09:31: IP Tunnel[1] Up 2012/02/11 02:10:01: IP Tunnel[1] Down 2012/02/11 02:10:06: IP Tunnel[1] Up 2012/02/11 02:10:36: IP Tunnel[1] Down 2012/02/11 02:10:41: IP Tunnel[1] Up 2012/02/11 02:11:11: IP Tunnel[1] Down 2012/02/11 02:11:16: IP Tunnel[1] Up 2012/02/11 02:11:46: IP Tunnel[1] Down (略)
なんだこれ、30 秒毎に綺麗に down してるぞ?? と思って設定ファイルを見直してみると
tunnel select 1 ipsec ike keepalive use 1 on heartbeat 10 3 tunnel select 2 ipsec ike keepalive use 2 on heartbeat 10 3
もしかして、これか? 何も良く分からず適当に設定して対応してない heartbeat で死活監視しようとしていたか!!
# tunnel select 1 # no ipsec ike keepalive use 1 # tunnel select 2 # no ipsec ike keepalive use 2
と設定無しにして ping 打ってみると
--- 169.254.252.1 ping statistics --- 60 packets transmitted, 60 received, 0% packet loss, time 59086ms rtt min/avg/max/mdev = 7.325/14.577/43.399/8.103 ms
パケロス無し! やぁ、めでたい。っていうかスゲー間抜けだった。死活監視は無いのも何なので
# tunnel select 1 # ipsec ike keepalive use 1 on icmp-echo 169.254.252.1 # tunnel select 2 # ipsec ike keepalive use 2 on icmp-echo 169.254.252.5
にしてみました。
改めて、どのくらいの速度で繋がるのか気になるところ
再度 iperf で up と down を、デフォルトの 10 秒のを 25 回試してみました。
パケロスしてたのに比べると随分改善した感じです、が、ちょっとダウンが不安定ですね。ちなみにパケロスしてたときのはこちら:
Down の max はパケロスしてたときの方がいけていますねぇ、これは、mss の影響なのか、CPU の利用率などの理由なのか、う〜ん。
iperf してる間 RTX1000 の CPU はほぼ 100% に張り付いていました。あっつあつっすな。
ちなみに設定はいまのところこんな感じ
console character ascii ip route default gateway pp 1 ip lan1 address 192.168.100.1/24 pp select 1 pp always-on on pppoe use lan2 pppoe auto disconnect off pp auth accept pap chap pp auth myname ID PASSWD ppp lcp mru on 1454 ppp ipcp ipaddress on ppp ipcp msext on ppp ccp type none ip pp mtu 1454 ip pp nat descriptor 1 pp enable 1 pp select 2 ip pp mtu 1454 tunnel select 1 ipsec tunnel 201 ipsec sa policy 201 1 esp aes-cbc sha-hmac ipsec ike always-on 1 on ipsec ike duration ipsec-sa 1 3600 ipsec ike encryption 1 aes-cbc ipsec ike group 1 modp1024 ipsec ike hash 1 sha ipsec ike keepalive use 1 on icmp-echo 169.254.252.1 10 3 ipsec ike local address 1 192.168.100.1 ipsec ike pfs 1 on ipsec ike pre-shared-key 1 * ipsec ike remote address 1 27.0.1.16 ip tunnel address 169.254.252.2/30 ip tunnel remote address 169.254.252.1 ip tunnel mtu 1390 ip tunnel tcp mss limit auto tunnel enable 1 tunnel select 2 ipsec tunnel 202 ipsec sa policy 202 2 esp aes-cbc sha-hmac ipsec ike always-on 2 on ipsec ike duration ipsec-sa 2 3600 ipsec ike encryption 2 aes-cbc ipsec ike group 2 modp1024 ipsec ike hash 2 sha ipsec ike keepalive use 2 on icmp-echo 169.254.252.5 10 3 ipsec ike local address 2 192.168.100.1 ipsec ike pfs 2 on ipsec ike pre-shared-key 2 * ipsec ike remote address 2 27.0.1.144 ip tunnel address 169.254.252.6/30 ip tunnel remote address 169.254.252.5 ip tunnel mtu 1390 ip tunnel tcp mss limit auto tunnel enable 2 nat descriptor type 1 masquerade nat descriptor address outer 1 ipcp nat descriptor address inner 1 192.168.100.1-192.168.100.254 nat descriptor masquerade static 1 1 192.168.100.1 udp 500 nat descriptor masquerade static 1 2 192.168.100.1 esp bgp use on bgp autonomous-system 65000 bgp neighbor 1 10124 169.254.252.1 hold-time=30 bgp neighbor 2 10124 169.254.252.5 hold-time=30 bgp import filter 1 equal 192.168.100.0/24 bgp import 10124 static filter 1 ipsec auto refresh on dhcp service server dhcp scope 1 192.168.100.128-192.168.100.254/24 dns server pp 1 dns private address spoof on schedule at 1 */* *:15 * ntpdate ntp.ring.gr.jp