2017-07-05 13 views
1

私は、ソケット経由で受信した生データパケットのヘッダを解析する単純なpythonスクリプトを書いています。スクリプトはVM上で実行され、別のVMがパケットを生成して送信します(どちらのVMもLinuxを実行しています)。これは、パケットを送信する前にカスタムヘッダーを作成し、そのスクリプトの目的全体がソケットを介して完全に傷つかないパケットを受信し、その内容を確認する設定の一部です。ソケットで受信したパケットからVLANタグが剥奪されないようにするには?

最初のヘッダーは、DMACおよびSMACの場合はそれぞれ6バイト、VLAN関連フィールド(TPID、PCPおよびID)の場合は4バイト、Ethertypeの場合は2バイトの標準イーサネットヘッダーです。

私が遭遇している問題は、VLANフィールド(4バイト)がパケットを受信する前に(パケットの残りすべてが存在する)パケットから削除されてしまうことです。私は2つのVM間のネットワークパスに沿った仮想HWのさまざまな要素に精通していませんが、ストリッピングがそこで行われていると思われます。ここで

は、私はソケットを開くために使用する方法である:

def openSocketToInterface(nicInterface): 
    ETH_P_ALL = 3 # To receive all Ethernet protocols 
    socketToInterface = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 
     socket.htons(ETH_P_ALL)) 
    socketToInterface.bind((nicInterface, 0)) 
    subprocess.check_call('ifconfig %s promisc' % (nicInterface), 
     shell=True) 
    return socketToInterface 

は私が剥奪されることからVLANフィールドを防ぐことができます方法はありますか?

+0

パケットは、レイヤ2フレームのペイロードです。イーサネット(レイヤ2)情報は含まれません。フレームをそのままキャプチャしようとする場合は、トランク接続を使用してインターフェイス間をブリッジする必要があります。 –

答えて

0

vSwitchとvNICはタグ付けを使用しません。タグの目的は、ワイヤ上の物理的なフレームをマークすることです。仮想フレームはそれを必要とせず、vSwitchはそれらが属するポートグループを知っています。

すべてのVLAN(プロミスキャスモードが許可されている、VID 4095)でESXiにミラーポートグループを設定しても、どのフレームもタグ付けされません。

回避策は、複数のvNICを使用することです。または、物理NICをVM(PCIパススルーまたはDirectPath)にマッピングすることもできます。

関連する問題