通信が不安定な場合

[更新:2023年02月15日]

ご利用中のVPSでdnfでのパッケージアップデートやメール配送の遅延、失敗など、外部への通信が不安定な場合の確認方法を記載します。

該当する症状

  • 通信の遅延が頻発する

  • dnfなどの実行が成功したり失敗したりする

詳細内容

事象の発生要因として、コントロールパネル上で設定できるパケットフィルター機能により、一部通信が遮断されている可能性が高いと考えられます。 以下にその詳細を記載します。

パケットフィルター機能について

さくらのVPSで提供しているパケットフィルター機能は、お客様収容中のホストサーバーのコンピューティングリソースを公平にご利用いただけるように、「ステートレス」での機能提供をしております。
パケットフィルター自体の詳細に関しては パケットフィルター をご確認ください。

ステートフル/ステートレスとは

通信のステートフル/ステートレスとは、セッション状況の保持を行っているかいないか、という意味で用いられます。
全ての通信のセッション状況を保持するのが ステートフル
通信のセッション状況を保持しないのが ステートレス
以下にそれぞれのイメージ図を記載します。

ステートフル通信の場合

以下にステートフル通信のメリットとデメリットを記載します。

メリット
  • VPSから通信した戻りパケットが自動的に許可されるため、複雑なフィルター設定を行わなくても通信が可能

  • フィルタールールの設定内容を特に意識せず、エフェメラルポートの修正等の運用が可能

デメリット
  • 通信のセッション情報を保持するため、コンピューティングリソースを消費しやすい

  • 通信量が増加すればするほど、比例してリソース消費が激しくなる

  • ホストサーバーへの負荷が上昇し、VPSの収容数により性能の劣化が顕著になりやすい

ステートレス通信の場合

メリット
  • 通信のセッション情報を保持しないため、コンピューティングリソースの利用量が少ない

  • リソースの消費量が通信量に左右されにくい

  • ホストサーバーへの負荷がかかりにくいため、同一ホスト収容中の他VPSからの影響が出にくい

デメリット
  • VPSが発信した通信に対する応答もフィルターの評価対象になるため、直感的に分かりづらい

  • VPS内部にて、エフェメラルポート設定の変更を行った場合に想定しなかった通信影響が出る可能性がある(後述)

エフェメラルポートとは

上記ステートフル/レスの図における①、VPSが発信元となる通信において、発信元ポートとして利用されるポートのことを エフェメラルポート といいます。
多くのLinuxカーネルではTCP/UDPともに「 32768~60999 」が割り当てられているため、弊社パケットフィルター内でも事前に同じポート範囲を内部的に許可しています。
詳細は パケットフィルター 内の「 注意事項 」に記載されています。

またご利用VPS内部で、どのポートが発信元(エフェメラル)ポートとして利用されるかは、下記コマンドを実行することで確認が可能です。
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

通信に影響が及ぶ場合

以上の内容を前提とし、ご利用VPSの状態を下記のように設定した場合、通信への影響が発生します。
  • ご利用VPSに対してパケットフィルター機能を設定している(カスタムポートでの許可等は未設定)

  • エフェメラルポートの利用範囲を変更した、もしくはご利用中OSのカーネルでのデフォルト値が異なっており 「 32768~60999 」 のポートレンジに収まっていない

この様に、エフェメラルポートの設定範囲とパケットフィルターの許可範囲にズレが発生するため、戻り通信が届かずに一部の通信が不安定になる事象が発生します。
全ての通信ができなくなるわけではなく、発信元ポートが32768~60999の通信は問題なく成功するため、問題の特定に時間がかかってしまうのが難点といえます。

確認方法

通信が不安定になっていると感じられる場合は、以下に記載した内容について確認をしてください。

1. 疎通対象のIPアドレスに対してpingを実行してみる

疎通対象のホスト名を利用してpingを実行する場合、ホスト名の名前解決を実行するためDNSキャッシュサーバーへの問合せが発生します。
名前解決の通信が起因となって通信劣化が発生しているのか切り分けが必要となるため、pingを実行する際はIPアドレスを指定します。

IPアドレスへのpingを実行してパケットロスや通信の遅延が発生する場合は、ご利用中のVPSかホストサーバー等のNW環境に起因する問題である可能性があります。
発生しない場合はパケットフィルターに起因する問題である可能性があります。

2. パケットフィルターを無効にしてみる

上記ping確認で疎通対象(IPアドレス指定)への品質劣化が見られない場合、切り分けのためパケットフィルターを無効化してください。
パケットフィルターの無効化は パケットフィルター 内の「 パケットフィルターの無効化 」を参照してください。

パケットフィルターを無効にして状況が改善する場合は、エフェメラルポートの範囲差分によって事象が発生している可能性が高いと考えられます。
引き続きパケットフィルター機能をご利用される場合は、下記のようにポートレンジの修正を実施してください。
# cat /proc/sys/net/ipv4/ip_local_port_range   ← 確認
# echo 32768 60999 >/proc/sys/net/ipv4/ip_local_port_range ← ポートレンジの修正

3. tcpdumpを取得してみる

問題の特定に当たって、通信の内容をパケットのやり取りのレベルから確認する必要が出てくる場合もあります。
上記の1及び2の方法をtcpdumpを取得しつつ実行するなど、詳細を確認する際にご利用ください。
※tcpdumpの利用方法は、 特定のポート(サービス)への通信ができない場合 内の 「 事前準備 」等で説明しています。