我正在尝试使用VpnService为BS项目实现一个简单的Android防火墙.我选择VpnService是因为它将在非root设备上运行.它将记录连接并让您过滤连接.(基于IP)
有一个应用程序这样做是有可能的.
我做了一些研究,发现VpnService创建了一个Tun接口.而已.(没有VPN实现只是一个隧道)它允许您为此接口添加地址并添加路由.它返回一个文件描述符.您可以读取传出的包并写入传入的包.
我创建了一个VpnService派生类,我开始服务.我可以tun0
使用VpnService.Builder类进行配置.当我查看mobiwol's
与adb shell netcfg
它的连接时,创建一个tun0
10.2.3.4/32地址的接口.它将所有程序包路由到此专用网络并发送到Internet.我也在尝试.创建了10.0.0.2/32地址的接口.添加了具有addRoute功能的路由.0.0.0.0/0所以据我所知,我可以从所有网络捕获所有包.(我对这个主题很新,还在学习.我在互联网上找到了作品,所以我不太确定.如果我错了,请纠正我.)
我在服务中创建了2个线程.一个从文件描述符读取并使用受保护的套接字将其写入127.0.0.1.(我不确定我是否应该读/写127.0.0.1.也许这就是问题所在.)
我分析了从文件描述符中读取的数据包.例如:
01000101 byte:69 //ipv4 20byte header
00000000 byte:0 //TOS
00000000 byte:0 //Total Length
00111100 byte:60 //Total Length
11111100 byte:-4 //ID
11011011 byte:-37 //ID
01000000 byte:64 //fragment
00000000 byte:0 //"
01000000 byte:64 //TTL
00000110 byte:6 //Protocol 6 -> TCP
01011110 byte:94 //Header checksum
11001111 byte:-49 //Header checksum
00001010 byte:10 //10.0.0.2
00000000 byte:0
00000000 byte:0
00000010 byte:2
10101101 byte:-83 //173.194.39.78 //google
00111110 byte:-62
00100111 byte:39 …
Run Code Online (Sandbox Code Playgroud) 我正在通过程序创建网络接口,以便在模拟网络(NS-3)和真正的Linux主机之间建立桥梁.因此,当"桥接"节点在NS-3中接收数据包时,真正的Linux主机会接收数据包.
但是当我再次运行程序时,它无法"擦除"或删除网络接口,因为"设备或资源正忙".
我试图关闭接口down(ifconfig <myInterface> down
),重新启动网络服务(service networking restart
),尝试用tunctl(tunctl -d myInterface
)删除TAP接口,但即使在几小时后,我仍然无法删除或重用此接口."设备或资源很忙".
你能解释一下如何删除或删除或重用界面吗?
我很难解决这个问题 - 我正在尝试编写一个与Linux隧道驱动程序交互的程序.在最基本的层面上,我只想创建一个能够通过网络隧道传输数据的应用程序.但是,我完全不知道如何正确设置隧道驱动程序以实现此目的.
我在Ubuntu 9.04上开发,我加载了隧道驱动程序内核模块.
存在设备/dev/net/tun
,但是没有/dev/tunX
设备.我无法使用创建这些设备ifconfig
- /sbin/ifconfig tun0 up
例如,每当我运行时,我都会收到以下错误:
获取接口标志时的tun0:ERROR:没有这样的设备.
如果我尝试查看/dev/net/tun
设备,则会出现以下错误:
cat:/ dev/net/tun:文件描述符处于错误状态.
尝试/dev/tunX
通过一个小程序打开,基本上,简单
tun_fd = open( "/dev/tun0", O_RDWR )
Run Code Online (Sandbox Code Playgroud)
返回-1:应用程序以root身份运行,但仍无法打开此隧道设备.可以打开/dev/net/tun
,但这似乎不会生成/dev/tunX
要使用的新设备.
总而言之 - 如何编写希望使用Linux隧道驱动程序的应用程序?任何见解将不胜感激.
谢谢; 〜罗伯特
如何在OSX上为TUN接口设置IP地址?我无法弄清楚如何在不指定目标IP的情况下为我的接口设置IP地址.我不想这样做 - 我想要或多或少地在以后的某个时间点建立到任意地址的隧道.先前的问题是无益的:
在osxtuntap的页面上,它说:
ifconfig tap0 10.1.2.3 up
Run Code Online (Sandbox Code Playgroud)
我不能在OSX 10.6上使用TUN接口:
$ sudo ifconfig tun0 10.1.2.3 up
ifconfig: ioctl (SIOCAIFADDR): Destination address required
Run Code Online (Sandbox Code Playgroud)
添加网络掩码没有帮助 - OSX似乎需要目标地址:
$ ifconfig tun0 10.0.0.1/24 netmask 255.255.255.0
ifconfig: ioctl (SIOCAIFADDR): Destination address required
Run Code Online (Sandbox Code Playgroud)
对于linux,我得到它的工作原理.根据这个页面,你打开()接口,并使用ip命令,并执行此操作,我之前做过这个,没有问题:
$ ip link set tun0 up
$ ip addr add 10.0.0.1/24 dev tun0
Run Code Online (Sandbox Code Playgroud)
我想做的就是我在linux中可以做的事情.
编辑:
我正在写一个小的UDP隧道应用程序.像这样:
tun1 - > udp app#1 - > udp tunnel - > udp app#2 - > tun2
如果udp应用程序位于不同的计算机上(假设是本地和远程),我想将他们各自的tun设备与ip地址关联起来,这样我就可以通过隧道将数据包从本地发送到远程数据包了.删除计算机上的tun设备的IP地址. …
我找到了以下tun\tap示例程序,但无法使其工作:
http://www.secdev.org/projects/tuntap_udp/files/tunproxy.py
我修改了以下几行:
f = os.open("/dev/tun0", os.O_RDWR)
ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE))
ifname = ifs[:16].strip("\x00")
Run Code Online (Sandbox Code Playgroud)
修改了第一行以反映驱动程序的实际位置.它原来是
f = os.open("/dev/net/tun", os.O_RDWR)
Run Code Online (Sandbox Code Playgroud)
运行后,我收到以下错误:
sudo ./tuntap.py -s 9000
Password:
Traceback (most recent call last):
File "./tuntap.py", line 65, in <module>
ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE))
IOError: [Errno 25] Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)
我正在使用从http://tuntaposx.sourceforge.net/download.xhtml安装的最新tun\tap驱动程序
PPP和tun/tap有什么区别?两者似乎都是用于在用户空间程序上实现网络.
使用PPP,内核创建ppp%d供使用,让用户空间程序为它提供后端.
使用tun/tap,内核创建tun%d供使用,让用户空间程序为它提供后端...
将程序从使用tun/tap (我的Android设备上似乎不可用)更改为ppp 有多难?
TAP/TUN设备的"目标地址"的目的是什么?
Pytun可让您轻松设置tap/tun设备的参数:
tun = TapTunDevice(name='mytun')
tun.addr = '10.66.66.1'
tun.dstaddr = '10.66.66.2'
tun.netmask = '255.255.255.0'
tun.up()
Run Code Online (Sandbox Code Playgroud)
这样做会导致设备配置如下:
$ ifconfig mytun
mytun: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.66.66.1 netmask 255.255.255.0 destination 10.66.66.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Run Code Online (Sandbox Code Playgroud)
我知道系统现在有一个IP 10.66.66.1的虚拟接口.并且可以推测,在这种情况下,TUN设备将"连接"到IP地址为10.66.66.2的(例如VPN网关)设备.
但具体是什么目的,内核是否知道这是一个"点对点"接口,以及目的地的IP地址?它是否会以某种方式影响路由,简单地配置路由表无法实现?
设置dstaddr
属性会产生SIOCSIFDSTADDR
ioctl.
该netdevice(7)
手册页只是说: …
我正在使用ip tuntap
创建一个tap界面,如下所示:
$ sudo ip tuntap add mode tap tap0
Run Code Online (Sandbox Code Playgroud)
之后,我设置了接口,并使用常用的IP命令对其进行寻址.我可以看到我的界面和简单的地址ifconfig
.
现在,老师告诉我,通过创建一个tap接口(在这种情况下名为tap0),我会找到一个/dev/net/tap0
节点,并且我可以在其中写入或读取它.但是,我找不到它.我"只是"有一个/dev/net/tun
.
我是否必须处理此tun节点,或者我应该真的有tap0节点?
我使用VpnService创建了一个TUN设备.为什么TUN接口在我的设备的其他网络接口中具有最高优先级?
更新#1
这是我配置TUN设备的方式:
mInterface = new Builder().setSession(getString(R.string.app_name))
.addAddress("10.0.1.1", 24)
.addRoute("0.0.0.0", 1)
.addRoute("128.0.0.0", 1)
.establish();
Run Code Online (Sandbox Code Playgroud)
更新#2
这是route -n
没有 TUN设备的输出:
shell@m0:/ $ busybox route -n
busybox route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.197.55.0 0.0.0.0 255.255.255.0 U 0 0 0 rmnet0
Run Code Online (Sandbox Code Playgroud)
这是的输出route -n
与所述TUN设备:
shell@m0:/ $ busybox route -n
busybox route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.1.0 0.0.0.0 255.255.255.0 U 0 …
Run Code Online (Sandbox Code Playgroud) 我已经整理了一个perl脚本,通过Linux :: TunTap将数据包读入用户空间,这一切似乎都运行良好:
#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;
$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IF\n";
while (my $packet = $tun->get_raw()) {
print Dumper($packet);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:如何将表示从tntap设备读取的原始IP数据包的字符串转换为适当的数据结构进行处理?特别是我在源,目的地和序列号之后.
显然,原始IP数据包的原始格式不是很易读.这是通过tuntap接口发送ping后的输出:
{{{?}/??8V?| !"#$%&'()*+,-./0123456ET??@@4
如何从此处继续以编程方式处理此数据?