CでTAPインターフェースにパケットを書き込む方法を知っている人はいますか? それとも他の言語ですか?
自分でイーサネット データグラムを作成しましたが、それを特定のタップ インターフェイスに書き込みたいと考えています。
ありがとう!:)
TAPについて: http://en.wikipedia.org/wiki/TUN/TAP
CでTAPインターフェースにパケットを書き込む方法を知っている人はいますか? それとも他の言語ですか?
自分でイーサネット データグラムを作成しましたが、それを特定のタップ インターフェイスに書き込みたいと考えています。
ありがとう!:)
TAPについて: http://en.wikipedia.org/wiki/TUN/TAP
ip tuntap add
( を使用して)既に TAP インターフェイスを作成していると仮定すると、 Packet Socketを使用してそれにデータを書き込むことができます (詳細については、試してみman 7 packet
てください)。
まず、 を使用int sockfd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
してパケット ソケットを作成します。
2 番目のステップは、TAP インターフェイスのインターフェイス インデックス( )を見つけることです。ifindex
コマンドip link
を実行して、各行の先頭にある数字を書き留めてください。例えば、
[nav@blumarine Test02]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: p12p1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
link/ether 00:26:b9:24:82:16 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT qlen 1000
link/ether c4:17:fe:8c:f7:c8 brd ff:ff:ff:ff:ff:ff
の ifindex はlo
1 になり、 の ifindex はeth0
3 になります。
3 番目のステップは、 APIsockaddr_ll
に渡す構造を入力することです。sendto()
この構造体は、パケットの宛先アドレスに関する情報を保持するために使用されます。正確に次のように入力します。
struct sockaddr_ll SendSockAddr;
SendSockAddr.sll_family = AF_PACKET;
SendSockAddr.sll_halen = ETH_ALEN;
SendSockAddr.sll_ifindex = ifindex; // The number we just found earlier..
SendSockAddr.sll_protocol = htons(ETH_P_ALL);
SendSockAddr.sll_hatype = 0;
SendSockAddr.sll_pkttype = 0;
最後に、 を使用sendto()
してパケットを送信します。man 3 sendto
の詳細情報sendto()
とman 7 packet
洞察を得るために使用しstruct sockaddr_ll
ます。
幸運を :)