-1

パケット内の何も変更せずに、インターフェイスに着信するパケットを同じインターフェイスに送り返すための最良の方法は何ですか。インターフェイスの1つに着信する実際のトラフィックにループバック効果を持たせたい。eth0

4

2 に答える 2

1

これは Python/Scapy で簡単に実現できると思います。何かのようなもの

sniff(iface="eth0", prn=lambda x: sendp(x, iface="eth0"))

するべきです。

于 2013-01-30T00:10:51.723 に答える
1

物理インターフェイスでこれを簡単に実行できるとは思いません。ただし、この目的のためにタップモジュールを使用しました。それは非常に簡単です。新しいタップ インターフェイスを作成すると、プログラムはデバイスから読み取ったすべてのものを書き戻します。私はこれを使用して独自のネットワーク プロトコルをテストしました。コードは非常に単純です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>

#include <linux/if_tun.h>

#define DEVNAME "gnlo0"

static int tun_alloc(char *dev)
{
    struct ifreq ifr;
    int fd, ret;

    if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
        perror("open");
        return -1;
    }

    memset(&ifr, 0, sizeof(ifr));

    ifr.ifr_flags = IFF_TAP;
    if (*dev)
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);

    ret = ioctl(fd, TUNSETIFF, (void *)&ifr);
    if (ret < 0) {
        close(fd);
        perror("ioctl TUNSETIFF");
        return ret;
    }
    strcpy(dev, ifr.ifr_name);
    return fd;
}

int main(int argc, char **argv)
{
    int fd = -1;
    int ret = 1;
    char dev[IFNAMSIZ];
    strncpy(dev, DEVNAME, IFNAMSIZ - 1);
    printf("opening %s\n", dev);

    fd = tun_alloc(dev);
    if (fd < 0)
        goto out;

    char buf[512];
    snprintf(buf, sizeof(buf) - 1,
             "ip addr flush dev %s; ip link set dev %s up", dev, dev);
    if (system(buf) < 0) {
        perror("system");
        goto out;
    }

    while (1) {
        unsigned char packet[65535];
        int len = read(fd, packet, sizeof(packet));
        if (len < 0) {
            perror("read");
            goto out;
        }
        printf("incoming packet [%d octets]\n", len);

        len = write(fd, packet, len);
        printf("fed back packet [%d octets]\n", len);
    }
    ret = 0;

out:
    if (fd >= 0)
        close(fd);
    return ret;
}
于 2013-01-29T17:25:02.880 に答える