1

背景情報

サーバーとの通信を目的としたネットワーク対応の組み込みデバイスを開発しています。このサーバーは Linux を実行するため (ただし、開発には Windows ツールが必要です)、開発目的で Ubuntu Server 14.04 を使用して VM を実行しています。

トラブルシューティングのために、最も単純なテスト設定 (VM 上のサーバーにホストを接続して、TCP 接続が確立されていることを確認するだけ) に戻っているため、組み込みの側面はこの質問には重要ではありません。

ネットワークセットアップ

  • DD-WRT [v24-sp2 (03/25/13) std (SVN リビジョン 21061)] を実行する D-Link DIR-615、MAC フィルターによってホストと VM に割り当てられた静的 IP、DNS 機能が有効

  • 開発マシン (192.168.5.117、dev.test.lan)

  • Ubuntu VM (192.168.5.118, vm.test.lan) - ブリッジ接続を使用 (クライアントが VM への接続を開始するため、NAT は機能しません)

  • ルーターはどの種類の WAN にも接続されていません。有線接続のみで、Wi-Fi は無効になっています

実行された健全性チェック

  • VM からのホストへの ping が成功する (IP または dns 名を使用)

  • ホストから VM への ping が成功する (IP または dns 名を使用)

  • ホスト間の nc <-> VM (いずれかの側からリッスン/接続できます) [ポート 9050 でリッスン]

  • VM 内で、nc 経由で VM で実行されているサーバー アプリケーションに接続でき、接続が正常に確立されます [ポート 9050 へ]

  • ポート 9050 での着信/発信 TCP 接続用に Windows ファイアウォールが開かれている

問題分析

Wireshark を使用して、nc 健全性テスト (ホスト <-> VM) を実行すると、TCP 接続が正常に機能していることを確認できます。

VM でサーバー (Python で記述され、asyncio を使用) を実行し、ホストから nc 経由で接続しようとすると、サーバーは接続を認識しません (ただし、nc からサーバーへの接続が機能することはわかっています)。 VM内で正常にテストされたため)。

Wireshark から、ホストが SYN を VM に送信し、その後 VM が [RST, ACK] で応答することがわかります。ホストは、あきらめる前に送信を 2 回再試行します。

質問

  • ブリッジ接続は、VM に使用する適切な設定ですか?

  • RST がどこから来ているかを知る最良の方法は何ですか? (ルーター、VM の TCP/IP スタック、または Python の一部が原因ですか?)


更新: VMnc 192.168.5.118 9050内で試行したところ、ホストから試行した場合と同じ拒否された接続動作が観察されました。アダムの言ったことによると、私たちは近づいているようです. Adam の提案も試して、更新を投稿します。

4

1 に答える 1

1

RST パケットは OS によって送信され、ポートが閉じていることを示しています。ポートにバインドされていてリッスンしているプロセスはありません。その結果、接続しようとするクライアントはすぐにECONNREFUSED(接続が拒否されました) で失敗します。これは完全に正常な動作です。

Python サーバー プロセスのポートにどの程度正確にバインドしていますか? 正しいネットワーク インターフェイスにバインドしていますか? 誤ってループバック デバイス (localhostまたは127.0.0.1) のみにバインドした場合は、まさにその説明が表示されます。マシンからそれ自体へのローカル接続は問題なく成功しますが、外部ホストからの接続は失敗します。

Python では通常、アドレス部分として''orを使用'0.0.0.0'して、すべてのネットワーク インターフェイスにバインドすることを示します。これは C の定数と同じですINADDR_ANY:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))
于 2014-06-13T20:24:18.370 に答える