我设置了两个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进程,所以它可以建立连接?
答案 0 :(得分:0)
看起来这是路由错误。 当我在两台不同的机器上运行程序时,数据包分别通过每台机器上的tun0设备进行路由,http://backreference.org/wp-content/uploads/2010/03/simpletun.tar.bz2正常工作。在一台机器上运行两次程序不起作用!