client.py

client.py

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要求に応答しないと予想されます。

おすすめ記事