我很难弄清楚这个问题--我正在尝试编写一个与Linux隧道驱动程序交互的程序。在非常基本的层面上,我只是想创建一个能够通过网络隧道传输数据的应用程序。然而,我完全不知道如何正确地设置隧道驱动程序来实现这一点。
我正在Ubuntu 9.04上进行开发,并且已经加载了隧道驱动程序内核模块。
存在设备/dev/net/tun
,但没有/dev/tunX
设备。我无法使用ifconfig
创建这些设备-例如,每当我运行/sbin/ifconfig tun0 up
时,我会得到以下错误:
tun0:获取接口标志时出错:无此类器械。
如果我尝试查看/dev/net/tun
设备,将显示以下错误:
目录号:/设备/网络/调谐器:文件描述符处于错误状态。
尝试通过一个小程序打开/dev/tunX
,基本上是一个简单的
tun_fd = open( "/dev/tun0", O_RDWR )
返回-1:应用程序正在以root身份运行,但仍无法打开此隧道设备。可以打开/dev/net/tun
,但这似乎不会生成要使用的新/dev/tunX
设备。
所以,总而言之,如何编写一个希望使用Linux隧道驱动程序的应用程序呢?任何见解都将受到极大的欢迎。
谢谢;~罗伯特
4条答案
按热度按时间yebdmbv41#
没有
/dev/tunX
设备文件。相反,您打开/dev/net/tun
并通过ioctl()
将其配置为“指向”tun0
。为了显示基本过程,我将使用命令行工具ip tun tap
创建TUN接口,然后显示从该TUN设备读取的C代码。因此,要通过命令行创建tun接口:tun0
已创建,所有发往目的IP地址10.0.3.x的数据包都将路由到tun0
。要从用户空间程序读取/写入数据包到该接口,您需要使用
ioctl()
与/dev/net/tun
设备文件交互。下面是一个示例,它将读取到达tun0
接口的数据包并打印大小:如果您正在运行
ping 10.0.3.1
或ping 10.0.3.40
,您将定期看到Read 88 bytes from tun0
。您还可以使用netcat UDP和
nc -u 10.0.3.3 2222
并键入text + Enter进行测试。如果未打印任何内容,则很可能是分配给tun 0的id地址/ ip范围不可访问/不可路由/不可寻址。请确保
ip route get 10.0.3.4
显示10.0.3.4 dev tun0
,表明linux内核知道应将发送到www.example.com的数据包10.0.3.4发送到tun 0设备。要删除
tun0
doizj3ouym2#
读取
/usr/src/linux/Documentation/networking/tuntap.rst
。你应该对
/dev/net/tun
设备执行open
操作,在open fd上执行后续的ioctl
操作会创建tun0
(或者你想给它起什么名字)网络接口,Linux的网络接口不对应任何/dev/*
设备。bzzcjhmw3#
我看到了一个很好的入门教程
http://backreference.org/2010/03/26/tuntap-interface-tutorial/
它附带了一个源代码压缩包。
它和这个问题在同一组谷歌搜索结果中。:-)
uoifb46i4#
另一种实现方式使用c11中
stdio.h
中的APIfopen
fclose
fread
,而不是unistd.h
中的api