Не может получить превышенный ICMP пакет TTL для пакета UDP с небольшим TTL в виртуальной машине

Я написал программу, которая использует сырой сокет для отправки пакетов UDP с TTL=1, когда я запускаю эту программу на своем локальном хосте, я могу получать пакеты ICMP. но когда я запускаю его на узле Planetlab, он не может получать пакеты ICMP.

На узле planetlab каждый узел совместно используется многими пользователями, и каждому пользователю выделяется только виртуальный срез. Поэтому, как правило, только если у вас есть процесс, связанный с конкретным портом, вы можете получать пакеты с этого порта, в противном случае случайные пакеты не могут быть доставлены системой на ваш слайс.

Но я скачал исходный код traceroute и запустил его на узле planetlab, он может принимать пакеты ICMP TTL с превышением.

То есть: я использую tcpdump для захвата ICMP-пакетов на узле Planetlab. когда я запускаю свою программу для отправки пакета UDP с TTL=1, tcpdump не может перехватить пакет ICMP, но когда я использую traceroute для отправки пакета UDP с TTL=1, tcpdump может перехватить пакет ICMP.

Каковы потенциальные причины этой разницы?

Спасибо!

некоторые из моих исходников:

if ((sendfd = socket(PF_INET, SOCK_RAW, IPPROTO_UDP)) < 0) {
    perror("Failed in creating socket\n");
    exit(1);
}   

    if ((recvfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
            perror("Failed in creating socket\n");
            exit(1);
    }



memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_port = htons(src_port);

if ((bind(sendfd, (struct sockaddr *)& local_addr, sizeof(local_addr))) < 0) {
    perror("Failed in binding socket\n");
    exit(1);
}


if (setsockopt(sendfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
    perror("Failed in setsockopt!\n");
    exit(1);
}


    if ((bind(recvfd, (struct sockaddr *)& local_addr, sizeof(local_addr))) < 0) {
            perror("Failed in binding socket\n");
            exit(1);
    }


    if (setsockopt(recvfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
            perror("Failed in setsockopt!\n");
            exit(1);
    }


memset(&dst_addr, 0, sizeof(dst_addr));
dst_addr.sin_family = AF_INET;
dst_addr.sin_addr.s_addr = inet_addr(dst_ip);
dst_addr.sin_port = htons(dst_port);


    nr_bytes = sendto(sendfd, UDPpacket, pkt_len, 0, (struct sockaddr *)&dst_addr, sizeof(dst_addr));

    nr_bytes = recvfrom(recvfd, buf, 2000, 0, (struct sockaddr *)&dst_addr, &len);

0 ответов

Другие вопросы по тегам