tun device:服务器进程未收到消息

时间:2013-10-02 12:23:37

标签: sockets udp tun

我设置了两个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

ping -I tun1 10.0.0.1

我可以看到UDP套接字为tun0接收了IPv4数据包,并且该数据包被正确写入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进程,所以它可以建立连接?

1 个答案:

答案 0 :(得分:0)

看起来这是路由错误。 当我在两台不同的机器上运行程序时,数据包分别通过每台机器上的tun0设备进行路由,http://backreference.org/wp-content/uploads/2010/03/simpletun.tar.bz2正常工作。在一台机器上运行两次程序不起作用!