インターリンクのマイIPでVPN接続すると、SSH接続できなくなりました。ネットワークのMTU値を調整したところ、SSH接続できるようになりました。
VPNオンにするとSSH接続できない
筆者は、インターリンクのマイIPでVPN接続してから、EC2にSSH接続しています。あるときから、SSH接続できなくなりました。UbuntuでもMacOS XでもSSH接続できません。

まじか⤵
試しに、EC2のセキュリティグループで、インバウンドのSSHポートの許可IPを任意の場所にしました。VPNオン/VPNオフに関係なくSSH接続できるはずですが、VPNオンのときは、SSH接続できません。
VPNオフにすると、SSH接続できました。EC2のセキュリティグループの設定や、秘密鍵ファイルには問題ないようです。

ひと安心ね
EC2のセキュリティグループで、インバウンドのSSHポートの許可IPは、元の値に戻しました。
状況をまとめると、VPNオンのときに問題があるようです。
SSHポートの許可IP | VPN接続 | 期待するSSH接続 | SSH接続の結果 | コメント |
---|---|---|---|---|
指定あり | VPNオン | できる | できない | 問題あり |
指定あり | VPNオフ | できない | できない | 正常 |
任意の場所 | VPNオン | できる | できない | 問題あり |
任意の場所 | VPNオフ | できる | できる | 正常 |
次に、ssh に -vオプション(詳細モード)をつけて接続してみました。
Verbose mode. Causes ssh to print debugging messages about its progress. This is helpful in debugging connection, authentication, and configuration problems. Multiple -v options increase the verbosity. The maximum is 3.
(Google翻訳)
冗長モード。 sshに進行状況に関するデバッグメッセージを出力させます。これは、接続、認証、および構成の問題のデバッグに役立ちます。複数の-vオプションを指定すると、詳細度が上がります。最大は3です。
VPNオフのときは、Connectingの行を表示して止まりました。つまり、ポート22へ接続できずに止まっています。EC2のセキュリティグループによって拒否されているためで、設定どおりの結果です。
$ ssh -v -F /home/xxx/.ssh/xxx.config xxx
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /home/xxx/.ssh/xxx.config
debug1: /home/xxx/.ssh/xxx.config line 1: Applying options for xxx
debug1: Connecting to xx.xx.xx.xx [xx.xx.xx.xx] port 22.
(ここで止まる)
Code language: Bash (bash)
VPNオンにしてSSH接続しました。Connection established.を表示しているので、ポート22へ接続は成功しています。EC2のセキュリティグループによって許可されているので、ここまでは設定どおりの結果です。
しかし、expecting SSH2_MSG_KEX_ECDH_REPLYの行を表示したまま進みません。
$ ssh -v -F /home/xxx/.ssh/xxx.config xxx
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /home/xxx/.ssh/xxx.config
debug1: /home/xxx/.ssh/xxx.config line 1: Applying options for xxx
debug1: Connecting to xx.xx.xx.xx [xx.xx.xx.xx] port 22.
debug1: Connection established.
(省略)
ebug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
(ここで止まる)
Code language: Bash (bash)
Ubuntu 18.04
MTUを1350に調整した
「expecting SSH2_MSG_KEX_ECDH_REPLY」で検索すると、次の記事が見つかりました。
この記事を参考に、VPN接続時のMTUを調整しました。
VPNオンにして、VPN接続のMTU値を調べます。ppp0 の詳細に link/ppp とあるので、これがVPN接続です。MTUは1400でした。
$ ip a
...
30: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 3
link/ppp
inet xx.xx.xx.xx peer xx.xx.xx.xx/32 scope global ppp0
valid_lft forever preferred_lft forever
Code language: Bash (bash)
MTUを1000にしてみると、SSH接続できました。
$ sudo ip link set ppp0 mtu 1000
$ ip a
...
30: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1000 qdisc fq_codel state UNKNOWN group default qlen 3
link/ppp
inet xx.xx.xx.xx peer xx.xx.xx.xx/32 scope global ppp0
valid_lft forever preferred_lft forever
Code language: Bash (bash)

MTUの値はいくつにすればいいのかな?
MTUを1400に戻して、pingのデータサイズを1100、1200、1300〜1330を試しました。
データサイズ=1323は、返ってきませんでしたが、
$ ping -c 1 -M do -s 1323 google.com
PING google.com (216.58.220.142) 1323(1351) bytes of data.
--- google.com ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Code language: Bash (bash)
データサイズ=1322は、成功しました。
$ ping -c 1 -M do -s 1322 google.com
PING google.com (216.58.220.142) 1322(1350) bytes of data.
76 bytes from syd09s01-in-f142.1e100.net (216.58.220.142): icmp_seq=1 ttl=55 (truncated)
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 10.984/10.984/10.984/0.000 ms
Code language: Bash (bash)
データサイズ 1322 + オーバーヘッド 28 = パケットサイズ 1350 なので、MTUを1350にしてみました。SSH接続できたので、MTUは1350にしました。
$ sudo ip link set ppp0 mtu 1350
$ ip a
...
30: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1350 qdisc fq_codel state UNKNOWN group default qlen 3
link/ppp
inet xx.xx.xx.xx peer xx.xx.xx.xx/32 scope global ppp0
valid_lft forever preferred_lft forever
Code language: Bash (bash)
今回はipコマンドでMTU設定しました。従来のifconfigコマンドでもMTU設定できます。
$ sudo ifconfig ppp0 mtu 1350
Code language: Bash (bash)
vpn_on.sh

VPN接続のたびに、MTU設定するのは面倒だな〜

シェルスクリプトを作ったら?
VPN設定は、デスクトップの設定>ネットワークで、"MyIP PPTP" という名前で登録しました。VPNパスワードも保存してあります。このVPNパスワードの保存先がわかりませんでした。
そこで、nmcliコマンドにVPNパスワードを渡すために、あらたにVPNパスワードファイルを作成します。VPNパスワードが「1234abcd」なら、次のように記述します。
vpn.secrets.password:1234abcd
Code language: CSS (css)
VPNオンして、MTU値を設定する、vpn_on.sh を作成しました。
#!/bin/bash
set -u
set -e
sudo nmcli con up id "MyIP PPTP" passwd-file ~/.ssh/myip_vpn.txt
sudo ip link set ppp0 mtu 1350
Code language: Bash (bash)
chmod +x しておきます。
$ chmod +x vpn_on.sh
ターミナルから起動します。
$ ./vpn_on.sh
[sudo] xxxx のパスワード:
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/30)
Code language: JavaScript (javascript)
筆者は、~/bin をPATHに追加しているので、~/bin/vpn_on.sh の位置に作りました。先頭の ./ をつけずにどこからでも、vpn_on.sh で起動できます。
$ vpn_on.sh
[sudo] xxxx のパスワード:
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/30)
Code language: JavaScript (javascript)
macOS (Mac OS X 10.15.4)
そういえば、macOSでの解決方法を調べていなかったと思い出し、VPN接続して、ssh -v してみると、port 22に接続するところで、止まっていました。
確認くんでIPアドレスを調べると、通常のプロバイダ接続のIPアドレスのままです。VPN接続できていないようです。
システム環境設定>ネットワークで、いったん「Interlink MyIP」を削除してから、あらためて、VPN接続を新規作成しました。
VPN接続した後、MTU設定することなく、問題なくSSH接続できました。
ifconfigを見ると、ppp0のmtuは1200でした。試しに mtuを1500にしてみましたが、1200でも1500でも、問題なくSSH接続できました。
参考までに、ターミナルでVPN接続するには、scutilコマンドを使います。接続開始のときは、--secretオプションでMy IPのシークレット「123」を指定します。
$ scutil --nc start interlink_myip --secret=123
$ scutil --nc stop interlink_myip
Code language: Bash (bash)
参考URL
