Я пытаюсь прочитать кадры с устройства крана по ссылке, которая начинается с двунаправленного (поэтому кэш ARP является звуком), но затем переходит в однонаправленный. Записи ARP истекают и выпадают. Я попытался включить прокси ARP (/proc/sys/net/ipv4/conf/XXX/proxy_arp
) на устройстве ethX
, устройстве tap0
и мосте br0
. Несмотря ни на что, моя программа перестает получать пакеты UDP. Он видит запросы ARP до тех пор, пока я не включу proxy_arp
на br0
Запуск tcpdump
с прокси-сервером ARP на br0
Я вижу запрос ARP и отвечаю. Я также вижу пакет UDP в tcpdump
, но моя программа ничего не видит.
Я пропускаю какие-либо другие флаги конфигурации?
Вот мой быстрый взлом, тестирование с использованием netcat
и UDP
#include <sys/types.h>
#include <unistd.h>
#include <net/if.h>
#include <linux/if_ether.h>
#include <linux/if_tun.h>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
int main(int argc, char ** argv)
{
int fd = 0;
struct ifreq ifr = ifreq();
// When a character array is initialized with a string literal that is too short, the remainder of the array is zero-initialized.
char devname[IFNAMSIZ] = "tap0";
fd = open("/dev/net/tap", O_RDWR);
if (fd < 0)
{
printf("ERROR Opening tap device\n");
return (1);
}
memset(&ifr, 0, sizeof(ifr));
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
*
* IFF_NO_PI - Do not provide packet information
*/
ifr.ifr_ifru.ifru_flags = IFF_TAP | IFF_NO_PI;
if(strcmp(devname, ""))
{
snprintf(ifr.ifr_ifrn.ifrn_name, sizeof(ifr.ifr_ifrn.ifrn_name), "%s", devname);
}
if(ioctl(fd, TUNSETIFF, &ifr) >= 0)
{
// Create bridge
system("brctl addbr br0");
system("brctl addif br0 eth2");
system("brctl addif br0 tap0");
system("ifconfig tap0 up");
system("ifconfig br0 up");
while(1)
{
printf("Reading...\n");
char buffer[1500];
ssize_t count = read(fd, &buffer, sizeof(buffer));
if(count > 0)
{
printf("Read %d bytes\n", count);
uint8_t* char_buffer = reinterpret_cast<uint8_t *>(&buffer);
for(unsigned int byte = 0 ; byte < count; byte++)
{
printf("%2X ", char_buffer[byte]);
}
printf("\n");
}
else if(count < 0)
{
break;
}
}
}
}