0

RREQ パケット (MANET シミュレートされたネットワーク経由で受信) をイーサネット インターフェイス経由で転送しようとして困っています。私が探しているのは、(ワイヤレスインターフェイスから受信した)上記のパケットを、イーサネット経由で直接接続されている別のホストに送信する方法です。

ホスト A のワイヤレス インターフェイスからパケットを受信するとします。ホスト A には、ホスト B に直接接続されたイーサネット インターフェイスもあり、そのパケットをイーサネット インターフェイス経由で転送して、ホスト B がそのイーサネット インターフェイス経由でこのパケットを受信できるようにします。

そのためにどの関数を使用すればよいかわかりません。

私が取り組んでいるプロジェクトは大きなものなので、質問に答えるためにコードが必要になったらすぐにコードを含めます。

編集:

したがって、最終的な目標は MANET ネットワークにワームホール攻撃を実装することです。簡単に言うと、ワームホール攻撃には、高速接続、つまりイーサネットを介して直接接続された 2 つの攻撃者 (ATTACKER_A と ATTACKER_B) が関与します。ATTACKER_A の近隣が RREQ を送信し、ATTACKER_A がそれを受信するとすぐに、RREQ をネットワークで単にブロードキャストする代わりに、イーサネットを介して ATTACKER_B に転送します。ATTACKER_B が RREQ を受信すると、無線で RREQ を近隣に転送し、AODV manet ネットワークの通常のノードとして機能します。

その結果、ATTACKER_A の近隣は、ATTACKER_B の近くにあるホストがそれ自身の近隣の一部であると考えるようにだまされ、ネットワークの 2 つの離れた部分の間にワームホールが作成されます。

実際、理論はそれほど複雑ではありません。

これがネットワークスキーマです ワームホール スキーマ

これが SimpleWormhole.ned です。

package nesg.netattacks.simulations.SimpleAttackScenarios.SimpleWormholeAttackScenario;

import inet.networklayer.autorouting.ipv4.IPv4NetworkConfigurator;
import inet.world.radio.ChannelControl;

import ned.DatarateChannel;

import nesg.netattacks.nodes.NA_AttackerAdhocHost;
import nesg.netattacks.nodes.NA_AdhocHost;

network SimpleWormhole
{
    @display("bgb=600,477,grey75");
    int test_ivo;

    types:
        channel ethline extends DatarateChannel
        {
            delay = 50ns;
            datarate = 100Mbps;
        }

    submodules:
        nodeA: NA_AdhocHost {
            @display("p=79,310");
        }
        nodeB: NA_AdhocHost {
            @display("p=240,366");
        }
        nodeC: NA_AdhocHost {
            @display("p=380,120");
        }
        nodeD: NA_AdhocHost {
            @display("p=518,159");
        }
        nodeE: NA_AdhocHost {
            @display("p=240,186");
        }
        nodeF: NA_AdhocHost {
            @display("p=380,286");
        } 
        attackerA: NA_AttackerAdhocHost {
            @display("p=165,310");
        }

        attackerB: NA_AttackerAdhocHost {
            @display("p=450,159");
        }
        configurator: IPv4NetworkConfigurator {
            @display("p=80,20");
        }
        channelControl: ChannelControl {
            @display("p=80,70;i=misc/sun");
        }

    connections:
        attackerA.ethg++ <--> eth_ivo: ethline <--> attackerB.ethg++;
}

NA_ATTACKERADHOCHOST は、他の ned ファイルから連続して継承する ned ファイルです。継承チェーンを振り返ると、最初の ned ファイルは、イーサネット ゲートに関連する部分を含む NA_NODEBASE であることがわかりました。

NA_NODEBASE.n​​ed

package nesg.netattacks.nodes;

import inet.util.PcapRecorder;
import inet.networklayer.ipv4.RoutingTable;
import inet.networklayer.common.InterfaceTable;
import inet.mobility.IMobility;
import inet.linklayer.IWirelessNic;
import inet.linklayer.IWiredNic;
import inet.linklayer.IExternalNic;
import inet.base.NotificationBoard;
import inet.nodes.inet.NetworkLayer;

import nesg.netattacks.hackedmodules.networklayer.NA_NetworkLayer;

module NA_NodeBase
{
    parameters:
        @display("bgb=611,448");
        @node;
        @labels(node,ethernet-node,wireless-node);
        int numExtInterfaces = default(0);
        int numRadios = default(0);               // the number of radios in the router. by default no wireless
        int numPcapRecorders = default(0); // no of PcapRecorders.
        string mobilityType = default("StationaryMobility");
        string routingFile = default("");
        bool IPForward = default(true);
    gates:
        input radioIn[numRadios] @directIn;
        inout pppg[] @labels(PPPFrame-conn);
        inout ethg[] @labels(EtherFrame-conn);
    submodules:
        notificationBoard: NotificationBoard {
            parameters:
                @display("p=53,194");
        }

        // optional mobility module. Required only if wireless cards are present
        mobility: <mobilityType> like IMobility if mobilityType != "" && numRadios > 0 {
            parameters:
                @display("p=53,121");
        }

        //# Hacked module replacing the normal NetworkLayer INET module for attack purposes.
        networkLayer: NA_NetworkLayer {
            parameters:
                @display("p=329,287;q=queue");
        }

        routingTable: RoutingTable {
            parameters:
                @display("p=53,287");
                IPForward = IPForward;
                routingFile = routingFile;
        }

        // linklayer
        interfaceTable: InterfaceTable {
            parameters:
                @display("p=53,386");
        }

        pcapRecorder[numPcapRecorders]: PcapRecorder {
            @display("p=159,259");
        }

        wlan[numRadios]: <default("Ieee80211Nic")> like IWirelessNic {
            parameters:
                @display("p=159,386;q=queue");
        }
        eth[sizeof(ethg)]: <default("EthernetInterface")> like IWiredNic {
            parameters:
                @display("p=282,386,row,90;q=txQueue");
        }
        ppp[sizeof(pppg)]: <default("PPPInterface")> like IWiredNic {
            parameters:
                @display("p=407,386,row,90;q=txQueue");
        }
        ext[numExtInterfaces]: <default("ExtInterface")> like IExternalNic {
            parameters:
                @display("p=547,386,row,90;q=txQueue;i=block/ifcard");
        }

    connections allowunconnected:
        // connections to network outside
        for i=0..sizeof(radioIn)-1 {
            radioIn[i] --> wlan[i].radioIn;
            wlan[i].upperLayerOut --> networkLayer.ifIn++;
            wlan[i].upperLayerIn <-- networkLayer.ifOut++;
        }

        for i=0..sizeof(ethg)-1 {
            ethg[i] <--> eth[i].phys;
            eth[i].upperLayerOut --> networkLayer.ifIn++;
            eth[i].upperLayerIn <-- networkLayer.ifOut++;
        }

        for i=0..sizeof(pppg)-1 {
            pppg[i] <--> ppp[i].phys;
            ppp[i].upperLayerOut --> networkLayer.ifIn++;
            ppp[i].upperLayerIn <-- networkLayer.ifOut++;
        }

        for i=0..numExtInterfaces-1 {
            ext[i].upperLayerOut --> networkLayer.ifIn++;
            ext[i].upperLayerIn <-- networkLayer.ifOut++;
        }
}

最後に、攻撃者は AODV プロトコルの実装を使用します。これを機能させるには、コードを編集する必要があります。コードは INET フレームワークから取得されます。

ワームホールの動作を実装するために編集する必要がある貴重な関数を見つけるために、すべての aodv コードを検索したところ、おそらくこの関数の一部をここで変更する必要があることがわかりました。

NA_AODV_rreq.cc

void NS_CLASS rreq_process(RREQ * rreq, int rreqlen, struct in_addr ip_src,
                           struct in_addr ip_dst, int ip_ttl,
                           unsigned int ifindex)
{

    -- some code here -- 

    // BEGIN NA_WORMHOLE
    // if wormhole is active print it
    if (wormholeAttackIsActive) {
        LOG << "\n sending rreq forward to other attacker \n";
        //send(rreq, "ethg$o");
        if (!ev.isDisabled())
                ev.printf("ip_src=%s rreq_orig=%s rreq_dest=%s\n",ip_to_str(ip_src),
                          ip_to_str(rreq_orig), ip_to_str(rreq_dest));
        LOG << "\n\nsent\n\n";
        LOG << ip_ttl;
        //return;
    }
    // END NA_WORMHOLE 

ご覧のとおり、本当の問題はすべてのコードが AODV ソース ファイル内にあることです。モジュール性の高さの原因は、それを実装する正しい方法を探すのに苦労しています。また、ドキュメントの欠如はまったく役に立ちません。

4

1 に答える 1

1

このsend()関数は、メッセージの送信に使用されます。詳細については、OMNeT++ のマニュアル ページを参照してください。

この関数を使用するにはsend()、少なくとも 2 つのパラメーターが必要です。

  1. 送信したいメッセージ。
  2. 送信するインターフェイスの名前。

あなたの場合、メッセージは RREQ パケットであり、インターフェイスはホスト A のイーサネット インターフェイスです。RREQ パケットが手元にあるため、イーサネット インターフェイス名を特定するだけで済みます。そのために.nedは、シミュレートしているネットワークのファイルを確認する必要があります。

.nedファイルには、以下に示す形式の宣言が含まれます。

network Network_Name
{
    parameters:
        ...
    submodules:
        ...
    connections:
        ...
}

これはほんの一例です。ただし、シミュレーション モデルによっては、.nedファイルにさらに複雑な宣言が含まれている場合があります。ただし、 で宣言されている内容に注目する必要がありますconnections:

通常、connections:あなたの下には次のような宣言があります。

Host_A.portX <--> Host_B.portY;

portX探しているインターフェイス名は次のとおりです。繰り返しますが、これは単純な例であり、下の宣言にconnections:はそれ以上のものが含まれる場合があります。したがって、自分で判断できない場合は、ネットワークのファイルのconnections:セクションをここにアップロードする必要があります。.ned

それができたらsend()、このように使用できます。

send(RREQ, "portX")

ホスト A のファイルで がorゲートportXとして宣言されていることを確認してください。それ以外の場合は機能しません。がゲート使用として宣言されている場合、これは の出力インターフェースを使用することを指定します。inoutout.nedsend()portXinoutportX$osend()send()portX

于 2015-03-17T04:42:36.540 に答える