インターリンクのマイIPで、EC2にSSH接続できなくなったので、MTUを調整した

インターリンクのマイIPでVPN接続すると、SSH接続できなくなりました。ネットワークのMTU値を調整したところ、SSH接続できるようになりました。

マイIPはどこでも固定IP環境を実現します | インターリンク【公式】
マイIPは、固定IPアドレスが使えるVPNサービスです。固定IPアドレスが提供されないプロバイダーやネットワーク環境からでも、グローバル固定IPアドレスが利用できます。月額1,100円~。すぐに使えていつでも解約できる!最大2ヶ月の無料体験...

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ポートの許可IPVPN接続期待する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」で検索すると、次の記事が見つかりました。

ssh できなかったので MTU を調整
サーバーに ssh しようとしたらうまく接続できなかったので調べてみました。 環境 Server/Client Ubuntu Version ssh サーバー側 Ubuntu 14.04 Server ssh クライア...

この記事を参考に、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 foreverCode 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 foreverCode 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 0msCode 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 foreverCode language: Bash (bash)

今回はipコマンドでMTU設定しました。従来のifconfigコマンドでもMTU設定できます。

$ sudo ifconfig ppp0 mtu 1350Code language: Bash (bash)

vpn_on.sh

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

シェルスクリプトを作ったら?

VPN設定は、デスクトップの設定>ネットワークで、"MyIP PPTP" という名前で登録しました。VPNパスワードも保存してあります。このVPNパスワードの保存先がわかりませんでした。

そこで、nmcliコマンドにVPNパスワードを渡すために、あらたにVPNパスワードファイルを作成します。VPNパスワードが「1234abcd」なら、次のように記述します。

vpn.secrets.password:1234abcdCode 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 1350Code 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_myipCode language: Bash (bash)

参考URL

Red Hat Enterprise Linux の ip コマンドチートシート - Red Hat Customer Portal
ip コマンドは、以前の net-tools コマンドの多くに代わる強力なツールです。システム管理者が、アドレス、リンク状況、ルーティングテーブル、そして隣接するオブジェクトを変更し、システムのネットワークコンポーネントを管理する際にこのツ...

ipコマンドチートシートpdf

タイトルとURLをコピーしました