我正在尝试解决网络上的一些简单的 tun/tap 示例,但遇到了一些麻烦。简而言之,我正在尝试:
- 创建一个tun接口(interface)并给它一个地址
- 使用一些代码打开 tun 接口(interface),打印出收到的数据包
- 使用 netcat 发送一些数据包
- 使用wireshark和打印它们的代码观察数据包
我在 (3) 和 (4) 方面遇到问题。 This tutorial说在旧的 Linux 版本中你可以使用 ping,但显然情况不再是这样了,所以我尝试使用 netcat。我的假设是我没有正确发送数据 - 具体来说,使用 netcat 我必须瞄准特定端口,因此我给它一个任意端口以及 tun 接口(interface)的地址。
由于wireshark和两个程序都看不到任何东西,我认为是数据包的发送不正确。有没有比使用 netcat 更好的方法?
tun接口(interface):
$ ifconfig tun2
tun2 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.7.1 P-t-P:192.168.7.2 Mask:255.255.255.255
UP POINTOPOINT NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
写入一些数据包,未观察到错误
$ echo -n 'fooooo' | nc 192.168.7.1 5555
$
$ echo -n `cat index.html` | nc 192.168.7.1 5555
$
Wireshark(和程序控制台)什么也不显示:
$sudo tshark -i tun2
....
我已经为(2)尝试了两段不同的代码,两者都应该打印出收到的数据包:
更新:
在同一台计算机上作为客户端和服务器运行上面第二个链接中的 simpletun 程序,以获得我得到的服务器:
$ ./simpletun -i tun2 -s -d
Successfully connected to interface tun2
对于客户端(我认为它将在不同的机器上运行):
$./simpletun -i tun2 -c 192.168.7.1 -d
ioctl(TUNSETIFF): Device or resource busy
Error connecting to tun/tap interface tun2!
所以我很确定我正在打开 tun2。
编辑2:
我在带有 ubuntu 服务器的 virtualbox 虚拟机上执行此操作。一旦我让它在一台机器上工作,我想尝试用第二台机器编写一个简单的 UDP 桥接器,两者都在 tun 接口(interface)上。
编辑3:
这是环回
$ sudo tshark -i lo
[sudo] password for nflacco:
tshark: Lua: Error during loading:
[string "/usr/share/wireshark/init.lua"]:45: dofile has been disabled
Running as user "root" and group "root". This could be dangerous.
Capturing on lo
0.000000 192.168.7.1 -> 192.168.7.1 TCP 74 59584 > personal-agent [SYN] Seq=0 Win=32792 Len=0 MSS=16396 SACK_PERM=1 TSval=26444728 TSecr=0 WS=4
0.000019 192.168.7.1 -> 192.168.7.1 TCP 54 personal-agent > 59584 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
最佳答案
隧道 tun2 的另一端是否连接有另一个系统?
注意 ifconfig 输出中的 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
。确实没有数据包通过该接口(interface)传输。确保该接口(interface)上有一些接收器。
例如如果您将其用于虚拟化,请确保虚拟机已启动并准备好接收数据包。如果您将其用于 VPN 或其他用途,请确保远程系统正在响应。
我使用隧道接口(interface)进行虚拟化。当虚拟机启动并运行时,它就可以工作。
关于捕获通过 netcat 发送的 tun 接口(interface)上的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13676928/