Я установил два устройства tun. Данные, которые записываются на каждое tun-устройство, пересылаются через UDP-сокет на другое tun-устройство с помощью простого цикла:
// the tuntap device is created using these flags
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
[...]
fd_set fd_list;
FD_ZERO(&fd_list);
FD_SET(fd1, &fd_list); // fd1 is the tun device
FD_SET(fd2, &fd_list); // fd2 is the udp socket
int fds[] = {fd1, fd2};
while(select(max(fd1, fd2)+1, &fd_list, NULL, NULL, NULL) > -1) {
for(i = 0; i < 2; ++i)
if(FD_ISSET(fds[i], &fd_list)) {
nread = read(fds[i], buf, sizeof(buf));
assert(nread > 0);
ret = write(fds[(i+1)%2], buf, nread);
if(ret == -1)
perror("write():");
}
}
После настройки интерфейсов с помощью
ifconfig tun0 10.0.0.1
ifconfig tun1 10.0.0.2
Я отправляю пинг с одного устройства на другое
ping -I tun1 10.0.0.1
Я вижу, что пакет IPv4 получен сокетом UDP для tun0, и этот пакет правильно записан в tun0. Также наблюдение за трафиком на tun0 с помощью wireshark показывает, что пакет получен tun0. Однако ответный пакет проверки связи не создается.
Я думал, что это может быть особый случай для пакетов ICMP, но когда я использую
socat -d -d -d - TCP-LISTEN:2000,so-bindtodevice=tun0 &
sleep 1
echo 2 | socat -d -d -d - TCP:10.0.0.1:2000,so-bindtodevice=tun1
снова не устанавливается соединение. процесс подключения (второй вызов socat) продолжает запускать только пакеты TCP-SYN и в конечном итоге истекает. Опять же, наблюдение за трафиком на tun0 с помощью wireshark показывает, что пакет TCP-SYN доставлен на устройство tun0.
Почему этот пакет не передается процессу socat TCP-LISTEN, чтобы он мог установить соединение??