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

vpn 接続時に SSH2_MSG_KEXINIT でハングするときの対処

openvpn pritunl
  • pritunl v1.18.902.26
  • Tunnelblick 3.5.7 (vpn client)

pritunl をつかってVPN環境が構築した。

モバイル回線だと特に不便なくVPN接続できていたのだが、有線にしたところssh が繋がらない状態になった。

% ssh app-001.cameong.local
:
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1
debug1: match: OpenSSH_6.6.1 pat OpenSSH*
debug1: SSH2_MSG_KEXINIT sent

どうやらMTUの設定値関係してそう。

MTU = 1454

この PPPoE では Ethernet の MTU = 1500 の世界の中に、 RFC2516 的には 6 バイトの PPPoE へッダと 2 バイトの ppp へッダを加える。このため、 1500 - ( 6 + 2 ) = 1492 バイトまでのパケットしか通れないことになる。つまり MTU = 1492 にする。 しかし NTT 東日本の場合、更に内部のネットワークの事情で 「MTU = 1454 にしておけば、必ずどこでも通る」ということになっているらしい。 これらの数字は、 通常の Ethernet の通信に使われる 1500より小さくなるので、問題が起きる。と言える。

MTU @ki.nu

たしかに mtu 1500 になっている。

// ifconfig
:
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.0.5.2 --> 10.0.5.2 netmask 0xffffff00

tunnelblick の設定にMTUの変更( link-mtu) を加える

   verb 2
   mute 3 
   push-peer-info
   ping 10
   ping-restart 60
   hand-window 70
   server-poll-timeout 4
   reneg-sec 2592000
   sndbuf 100000
   rcvbuf 100000
   remote-cert-tls server
+ link-mtu 1454
   comp-lzo no
   auth-user-pass
   key-direction 1

確認

% ifconfig 
:
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1384
        inet 10.0.5.2 --> 10.0.5.2 netmask 0xffffff00

mtu 1454より小さくなってるけど。

この設定で、ssh 接続可能になりました。

気になる謎

  • VPN接続なしの場合、en0 から接続してるのだが、en0 のmtu が1500 でも繋がるのなぜ。
  • link-mtu 1545 なのに実際は1384 になってるのなぜ。

詳しい方、教えてください!

追記

  • mtu 1454 だと時間がたったら、再度sshできなくなる。
  • mtu 1400 でトライ