我設置了兩個tun設備。被寫入到每個tun設備的數據是使用一個簡單的循環轉發通過UDP套接字到另一tun設備: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一個設備到另一個
ping -I tun1 10.0.0.1
我可以看到UDP數據包由tun0的UDP套接字接收,並且此數據包正確寫入到tun0。使用wireshark觀看tun0上的流量也表明數據包由tun0接收。但是,不會創建ping響應數據包。
我認爲這可能是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數據包並最終超時。再次,使用wireshark觀察tun0上的流量,表明TCP-SYN數據包已交付給tun0設備。
爲什麼這個數據包沒有被喚醒到socat TCP-LISTEN進程,所以它可以建立連接?