web-dev-qa-db-ja.com

Linuxマシンでは、icmp以外のパケットは通過しませんが、Windowsでは正しく通過します。

Proxmoxにクラスターがあります。クラスターには、vmが構成されたルーター(pfsense)があります。私たちのネットには、WindowsとLinuxのマシンがあります。

問題があります。Windowsマシンはインターネットにアクセスできますが、Linuxマシンはインターネットにアクセスできません。

すべてのLinuxマシンは同じように動作し、要求を送信して応答を待ちますが、応答は返されません。 wget、ssh、nslookupで外部サーバー(8.8.8.8の例)にチェックインし、pingを実行しました。 pingを除いて、すべてが機能するわけではありません。 ICMPパケットは正しく送信されるため、TCPの問題を提案します。しかし、すべてのWindowsマシンで、すべてが正しく機能します。

LinuxやWindows用の特別なフィルタールールを作成していませんでした。

私は頭を骨折しましたが、この問題を解決することができませんでした。

ベースライン:

Our External IP:    XX.XXX.XX.XX
External Server IP:   Y.YYY.Y.YYY   (which was used to test)

それで、私は2つのテストを行いました。

テスト1. Linuxマシンからのwget:

ルーターからキャプチャされたパケット:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 GET / HTTP/1.1
      2 21.798340 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       74 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128
      3 21.850793 Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       74 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024
      4 21.850849 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522
      5 21.850868 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 GET / HTTP/1.1
      6 22.101939 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      7 22.605999 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      8 23.613997 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      9 25.629983 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
     10 28.931894 Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       78 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110
     11 28.932001 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 [TCP Previous segment not captured] 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610
     12 29.661996 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
     13 31.360021 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1

外部サーバーからキャプチャされたパケット:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       76 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128
      2 0.000059  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       76 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024
      3 0.059242  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       68 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522
      4 0.059247  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 GET / HTTP/1.1
      5 0.303398  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      6 0.809767  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      7 1.815634  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      8 3.836576  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      9 7.088059  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       80 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110
     10 7.134903  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       68 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610
     11 7.864582  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
     12 9.564772  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1

テスト2. Windowsマシンからのwget:

ルーターからキャプチャされたパケット:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
      2 0.053994  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024
      3 0.054129  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
      4 0.054450  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     150 GET / HTTP/1.0
      5 0.110034  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0
      6 0.113011  Y.YYY.Y.YYY        XX.XXX.XX.XX       HTTP     931 HTTP/1.1 200 OK  (text/html)
      7 0.115990  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0

外部サーバーからキャプチャされたパケット:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
      2 0.053994  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024
      3 0.054129  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
      4 0.054450  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     150 GET / HTTP/1.0
      5 0.110034  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0
      6 0.113011  Y.YYY.Y.YYY        XX.XXX.XX.XX       HTTP     931 HTTP/1.1 200 OK  (text/html)
      7 0.115990  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0    

助けてください、何かアイデアはありますか?

4
kvaps

私は過去に同様の問題を見てきました。チェックサムのオフロードの問題が原因であることが判明しました。仮想化ゲストOSは、仮想化ホストにチェックサムをオフロードします。仮想化ホストは、物理ネットワークインターフェイスにチェックサムをオフロードすることになっています。

しかし、最終的にチェックサムは計算されず、パケットは有効なチェックサムなしでネットワーク経由で送信されました。接続の受信側で、無効なチェックサムがあるためにパケットがドロップされます。

仮想化ホストとゲストの両方で、次の名前のいずれかを持つオプションを探して、それらをオフにすることができます。

  • UDPチェックサムオフロード
  • TCPチェックサムオフロード
  • UDPフラグメンテーションオフロード
  • TCPセグメンテーションオフロード
1
kasperd

数か月の作業の後、Windowsマシンのネットワークカードドライバーをvirtioに変換したところ、Windowsマシンでも問題が発生しました。それは十分に真実です、問題は個人的な非互換性pfSense(またはfreebsd)そしてvirtio)に関連しているようです-ドライバーまたはproxmoxの他のコンポーネント。

この時点で、私はこの問題を回避することにしました:

  1. インターネットに直接接続され、ルーターに構成されたProxmoxクラスター。
  2. Proxmoxとpfsenseの間に別の新しいサブネットを作成しました
  3. サーバーごとに、この新しいサブネットに2番目のネットワークアダプターを作成し、各プロキシモックスでデフォルトゲートウェイとして構成しました。
  4. Proxmox-clusterで、一部のポートをこのサーバーに転送し、すべての外部トラフィックをpfsenseに転送する必要があるルールを作成しました。

その結果、次のようになりました:

  • 私のネットワーク上のすべてのクライアントコンピューターは、pfSenseを介してインターネットにアクセスし、pfsenseのサービス(プロキシサーバー、ロギングなど)を使用できます
  • Proxmoxクラスター上のすべてのサーバーは、proxmoxクラスターを介して直接インターネットにアクセスできます
  • 素晴らしいボーナスとして、pfSenseがダウンしている場合でも、SSH経由でProxmoxクラスターにアクセスできます

皆さん、ありがとうございました!

1
kvaps

興味深い問題。ファイアウォールの問題のようには見えません。そうでない場合、最初の3ウェイTCPハンドシェイクは機能しません。また、TCP再送信にもかかわらず、機能しません。パケットが非常に小さく、両端にパケットが表示されているため、MTUの問題のようです。実際には、WebサーバーがGET要求に応答していないようです。

DNSルックアップはUDPを使用するため、これもまた別のことです。 SSHを試しているパケットキャプチャで何がわかりますか?また、外部サーバーのポート80にtelnetで接続し、手動のGETリクエストを発行した場合はどうなりますか。

telnet y.y.y.y 80
GET / HTTP/1.1
Host: y.y.y.y
<line feed>

HTTP1.0および1.1について上記を試してください。 LinuxとWindowsのパケットキャップのGETリクエストの違いに気づきました。問題ではありませんが、試す価値はあります。

1
user217726

残念ながら、まだコメントできません:-(
私が理解している限り、ルーターを通過し、ターゲットサーバーとの間で送受信されるパケットを確認しました。動作に問題のあるLinuxホストでtcpdumpまたはwiresharkを試し、実際にホストに到着/離脱するものを確認しましたか?
テストするもう1つのことは、テストのためだけにLinuxホストの1つでiptablesを完全に無効にすることかもしれません。ホストに特別なファイアウォールルールを設定していなくても、デフォルトのルールが正しく動作しない可能性があります。

0
Dennis