web-dev-qa-db-ja.com

異なる「送信者のMAC」でパケット(フレーム)を送信しますか?

私はちょうどNetwork +の本を勉強していました。そこでは、ビットのセットを表すためにブロックを使用してフレームの内容を説明しています。先に進むと、最初の「ブロック」は受信者のMACアドレスであると記載されています。その後のブロックは送信者のMACアドレスです。

フレームを送信する前に、フレームをインターセプトして送信者のMACをゼロにする(または実際のMACの代わりにランダムなものを書き込む)ことができるかどうか疑問に思っていました。

3
code_flow

イーサネット

OverEthernet–はい、イーサネットヘッダーを含むフレーム全体がオペレーティングシステムによって送信され、OSが使用する送信元MACアドレスを決定します。

  • 実際、仮想マシンシステム(VMwareやHyper-Vなど)はすでにこれを使用してVMを実際のLANに接続しています。1つのイーサネットカードに複数のVMが接続されている場合があり、各VMホストから独立した独自のMACアドレスを持っています。

  • Linux、FreeBSD、Windowsには、複数の物理イーサネットインターフェイスをリンクする「ブリッジ」を作成するオプションもあり、実際のイーサネットスイッチとまったく同じように機能します(VLANやRSTPを使用する場合でも)。

メソッド

ネットワークインターフェイスのMACアドレスを変更する(送信するすべてに新しいアドレスを使用するようにOSに指示する)か、個々のプログラムから「rawソケット」を使用して作成することができますTCP/IPスタックをバイパスして、好きなものを送信します。後者の場合は、libpcap、 Scapy 、Nemesisなどの既存のツールを使用します。

  • Linuxでは、ip linkは、次の再起動までMACアドレスを変更します。

    # ip link set eth0 down
    # ip link set eth0 addr ab:cd:ef:ab:cd:ef
    # ip link set eth0 up
    
  • または、scapyを使用して個々のパケットを送信します。

    >>> send(Ether(src="ab:cd:ef:ab:cd:ef", dst="ff:ff:ff:ff:ff:ff")/IP(src="1.2.3.4", dst="3.4.5.6")/UDP(dport=9)/b"hello")
    Sent 1 packets.
    
  • Linuxには、同じ物理イーサネットカード上に異なるMACを持つ仮想インターフェイスを作成するための「macvlan」機能もあります。

    # ip link add fred0 link eth0 type macvlan mode private
    

Wi-Fi

Wi-Fiはもう少し制限があります-あなたは個々のパケットを送信できません APは、それに関連付けられているすべてのステーションを追跡し、(AFAIK)「関連付けられたステーション」リストにないMACアドレスからのパケットを破棄するため、スプーフィングされたソースを使用します。

(これはステーションの観点からです。APは好きなことを行うことができます。結局のところ、有線デバイスに代わってパケットを送信することは彼らの仕事の一部です。)

ただし、ワイヤレスインターフェイスに別のMACアドレスを設定し、その新しいアドレスをすべて、APへの関連付け/認証から開始します。

ただし、イーサネットとは異なり、これを実行できるかどうかは、特定のワイヤレスハードウェアとドライバーによって異なります(たとえば、Atherosは通常これをサポートしますが、一部のRealtekカードはサポートしない場合があります)。 Linuxでは同じip link …コマンドは機能するはずです。

L2ブリッジング

とはいえ、Wi-Fiを使用してレイヤー2ブリッジングを実装する方法はいくつかあります(たとえば、建物全体を指向性無線リンクを介して接続する必要がある場合)。

(さて、これは今少しトピックから外れていますが、完全を期すために含まれています。)

元の送信元(パケットを生成したホスト)と送信機(パケットを送信したWi-Fi無線)の概念が異なるため、イーサネットよりも少し複雑です。同様に、受信者(パケットを受信したWi-Fi無線)と最終的な宛先(パケットを読み取り/消費するホスト)。

  • たとえば、コンピューターA(ラップトップなど)がWiFi経由でコンピューターBにパケットを送信する場合、次のようなヘッダーがあります。

    • from(元のソース):<コンピューターAのアドレス>
    • to(Wi-Fi無線受信):<Wi-Fiルーターのアドレス>
    • to(最終宛先):<コンピューターBのアドレス>

    通常のWi-Fiステーションが他のデバイスに代わってパケットを送信することは決してないという仮定の下で、「from」アドレスが1つしかないことに注意してください。これにより、パケットあたり6バイトが節約されます。

  • APからステーションへの逆です。「元の送信者」と「送信AP」の2つの「差出人」アドレスがありますが、「宛先」アドレスは1つだけです。

したがって、Wi-Fi経由で2つのイーサネットネットワークをブリッジする必要がある場合、「WDS」別名「4addr」モード、これにより、4つのアドレスすべて(2つの送信元と2つの宛先)がすべてのWi-Fiフレームとともに送信されます。これに対するサポートはさまざまです。 Linuxでは、iwを介してこれを行うことができます。

WDS/4addrモードは、両方の終わりで有効にする必要があることに注意してください。

L2 NAT

VirtualBox、Ubiquiti airMAX無線(WDSなしのステーションとして構成されている場合)、または同じ構成のOpenWRTなどの一部のシステムは、MACアドレス変換をサポートします。IPv4のように、ステーション自体のMACアドレス間で複数のクライアントをマスカレードしますNATですが、より低いレベルです。これは構成なしで機能し、より効率的かもしれません。ただし、DHCPサーバーのようなものがクライアントのMACアドレスの違いに依存している場合、問題が発生します。

(これは実際には私たちが始めたものの反対です-複数のMACを持つ1つのデバイスではなく、1つのMACの背後にある複数のデバイス-ここで停止しましょう。)

ブルートゥース

Bluetoothについてはよくわかりません。 AFAIK、ほとんどのアダプタでは、MACアドレスを変更したり、スプーフィングしたりすることはできません。これは、すべての通信で使用される唯一のアドレス指定方法であるためです。デバイスは、MACアドレスによって相互に認識し、MACアドレスに基づいてリンクキーを保存します...とにかく。私の地域ではありません。

7
user1686