
Ubuntu 14を使う
私は2つのインターフェースを持つLinuxマシンを持っています:eth1:172.16.20.1 ppp0:192.168.0.2
ppp0は、PPPインターフェイス(192.168.0.1)とWANインターフェイス(172.16.20.2)を使用してデバイスに接続されます。デバイスが172.16.20.1に到達できることを確認できます。
私が経験している問題は、同じコンピュータでPythonを使用してパケットを送信することです。
client.py
import socket
cl = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cl.sendto("Hello", ("172.16.20.1", 5005))
server.py
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.bind(("", 5005))
while True:
data, addr = srv.recvfrom(2048)
print("Message: ", data)
スクリプトはうまく機能しますが、Wiresharkのeth1からのパケットを見ることはできません(loインターフェイスでキャプチャすることを選択した場合にのみ表示されます)。私は、オペレーティングシステムがパケットがローカルインターフェイスの1つであることを検出し、生成された192.168.0.2ソケットを介してパケットを送信しないと仮定します。
これが発生しないように、次のルールを追加すると、次のようになります。
sudo ip route del table local 172.16.20.1 dev eth1
sudo ip route add table local 172.16.20.1 dev ppp0
sudo ip route flush cache
何が起こるかは次のとおりです。
- Wiresharkでは、パケットがeth1に到着し、送信元アドレスがWANアドレス(172.16.20.2)であることを確認できるようになりました。
- プログラムを再起動した後、server.pyの出力は表示されません。
ppp0 インターフェイスを無視し、2 つの ethx インターフェイスを使用します。 2つの別々のコンピュータ(クライアントとサーバー)でルールを適用せずにこのプログラムを実行しようとすると、Wiresharkのeth1に到着したパケットとserver.pyの出力を表示できます。 2つの別々のコンピュータでプログラムを実行し、上記の規則をppp0接続に適用しようとすると(削除しない)、server.pyの出力は表示されなくなりますが、到着したデータはまだ表示されます。ワイヤーシャークバッグ。 TCP / IPプロトコルスタックはよくわかりませんが、リンク層はもはやアプリケーション層に渡されないようです。
答え1
リンク層がアプリケーション層に渡されなくなったようです。
リンクレイヤーは問題になりません。構成の影響を受けません。これはネットワーク層(IP)に関するものです。
このlocal
テーブルは、パケットがローカルに配信できるかどうかを判断するカーネルの方法です。 IP アドレスを削除すると、パケットはルーティングまたはドロップされます。
MACアドレスが他のシステムのARPキャッシュにあるので、これはうまくいくようです。ローカルテーブルにアドレスがない場合、受信システムはARP要求に応答しないと予想されます。
答え2
受信したパケットに正しいUDPとIP4チェックサムがあることを確認してください。 Wiresharkでチェックサム計算を有効にし、キャプチャを確認します。
答え3
私の場合、最初はローカルトラフィックを表示してキャプチャできませんでした。
調査の結果、根本的な原因はネットワークトラフィックを捕捉したことです。ネットワークインタフェースエラー。たとえば、ネットワークインターフェイスのトラフィックを
キャプチャします。eth0
loopback
ネットワークインターフェイストラフィックではありません
したがって、ローカルネットワークトラフィックを表示してキャプチャするには、利用可能なすべてのネットワークインターフェイスのトラフィックをキャプチャまたは選択する必要がloopback
あります。any