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.ned
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 ソース ファイル内にあることです。モジュール性の高さの原因は、それを実装する正しい方法を探すのに苦労しています。また、ドキュメントの欠如はまったく役に立ちません。