一般的な問題: 接続の片側または両側でPath Maximum Transmission Unit Discovery (PMTUD)が機能していない可能性があります。これが接続の両側で機能していないと、双方が送信しようとしているパケットが接続に対して大きすぎるかどうかを判断して、それに応じた調整をすることができません。最大転送単位(MTU)およびPMTUDの概要は、MTUの概要およびPMTUDの概要を参照してください。
標準のインターネットMTUサイズは、1500バイトです。これは、大半のホーム・ネットワークや多くの企業ネットワーク(およびそのWi-Fiネットワーク)にも該当します。Oracle Cloud Infrastructureのデータ・センターなど、一部のデータ・センターのMTUは、それより大きい場合があります。すべてのOCIコンピュート・インスタンスで、デフォルトで9000のMTUが使用されます。Oracle Linux 8ホストでは、ip address showコマンドを使用して、そのホストのネットワーク接続のMTUを表示できます(または、Red Hat Linuxではip linkを使用します)。たとえば、Oracle Linux 8インスタンスからの出力を次に示します(MTUは赤色のイタリックで強調表示されています)。
コピー
ip address show <interface-x>
<interface-x>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
link/ether 01:00:5E:90:10:10 brd ff:ff:ff:ff:ff:ff
...
比較のために、企業ネットワークに接続されたOracle Linux 8ホストからの出力を次に示します:
コピー
ip address show <interface-y>
<interface-y>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 01:00:5E:90:10:20 brd ff:ff:ff:ff:ff:ff
...
2つのサーバーが(たとえば、SSHを使用して)通信を試行すると、双方は3方向のハンドシェイク中にMSSを約8960にすることに合意します。最初のSSH接続設定時の最大パケット・サイズは通常1380バイト未満なので、最初のSSH接続は成功する可能性があります。片側が2つのエンドポイント間の最小リンクより大きいサイズのパケットを送信しようとしたときに、Path MTU Discovery (PMTUD)が重要になります。
PMTUDの概要 🔗
Path MTU Discoveryは、RFC 1191およびRFC 8899 で定義されています。これは、通信する2つの各ホストに対して、送信するパケット内にDon't Fragmentフラグを設定するように要求することにより機能します。一方のホストから送信されたパケットがルーターに到達したが、そのエグレス(アウトバウンド)インタフェースのMTUがパケット長よりも小さい場合、ルーターはそのパケットをドロップします。また、ルーターは、ICMPタイプ3コード4のメッセージをホストに返します。このメッセージは、「Destination Unreachable, Fragmentation Needed and Don't Fragment Was Set」という内容です(RFC 792で定義されています)。これは、ルーターがホストに対して、「大きすぎるパケットを断片化しないようにそちらから指示されましたが、このパケットは大きすぎるのでこちらからは送信しません。」と伝えているということです。また、ルーターは、そのエグレス・インタフェースを介して許可される最大サイズ・パケットをホストに通知します。送信側のホストは、メッセージに示されたルーターよりも小さい値になるように、そのアウトバウンド・パケットのサイズを調整します。
ping 192.168.6.130 -M do -s 8000
PING 192.168.0.130 (192.168.0.130) 8000(8028) bytes of data.
From 192.0.2.2 icmp_seq=1 Frag needed and DF set
(mtu = 1358)
-M pmtudisc_opt
Select Path MTU Discovery strategy. pmtudisc_option 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 -M do -s 1500 192.168.6.130
PING 192.168.0.130 (192.168.0.130) 1500(1528) bytes of data.
From 10.0.0.2 icmp_seq=1
Frag needed and DF set (mtu = 1358)
良い: PMTUDが機能している 🔗
結果に「From x.x.x.x icmp_seq=1 Frag needed and DF set (mtu = xxxx)」という行が含まれる場合、トンネルのその側のPMTUDは機能しています。ICMPメッセージのソース・アドレスは、トラフィックを送信しようとしているトンネルのパブリックIPアドレスです(たとえば、前出のUbuntuの例では203.0.113.13)。