问题标签 [tun]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 尝试从 tun 接口获取超过 8 个队列文件描述符时,ioctl 失败
在我听说内核 3.8 linux 添加了多队列功能以使用标志 IFF_MULTI_QUEUE 调整抽头设备后,我将内核升级到 3.10 并将其标头放在 /usr/src 然后我更改了我的 c 代码以有一个线程来打开一个新队列每次需要文件描述符。但线程只能打开 8 个队列(使用我早于 3.8 的内核,它根本无法打开队列),然后我从 ioctl 中得到这个“参数太长”错误
然后我编写了另一个程序来测试可以在我的 ubuntu 12.10 linux 盒子中打开多少队列 fd
内核版本在一个更简单的程序中。
事实证明,这也仅限于 8 个。这是输出:
我在另一个 linux 机器上对其进行了测试,它具有相同的输出。那么从内核中的 tun 设备打开超过 8 个队列是否有限制?如果是这样,如何解决?请帮帮我
networking - 如何在 OSX 上为 TUN 接口设置 IP 地址(没有目标地址)?
如何在 OSX 上为 TUN 接口设置 IP 地址?如果不指定目标 IP,我无法弄清楚如何为我的接口设置 IP 地址。我不想那样做——我想或多或少地在以后的某个时间点建立一条通往任意地址的隧道。之前没有帮助的问题:
在osxtuntap的页面上它说:
对于 TUN 接口,我无法在 OSX 10.6 上完成这项工作:
添加网络掩码无济于事 - OSX 似乎需要一个目标地址:
对于 linux,我知道它是如何工作的。根据此页面,您打开()界面,并使用 ip 命令,然后执行此操作,我之前已完成此操作,但问题为零:
我想做的只是我可以在 linux 中做的同样的事情。
编辑:
我正在编写一个小 UDP 隧道应用程序。像这样:
tun1 -> udp 应用程序 #1 -> udp 隧道 -> udp 应用程序 #2 -> tun2
如果 udp 应用程序位于不同的计算机上(比如说本地和远程),我想将它们各自的 tun 设备与一个 IP 地址相关联,这样我就可以通过隧道将数据包从本地发送到远程,方法是将数据包发送到删除机器上 tun 设备的 IP 地址。
借用linux教程的更多内容,作者在本地和远程设置一个tun设备,关联ips,并运行一个简单的隧道应用程序,然后ping隧道的另一端:
ubuntu - Ubuntu,删除网络 TAP 接口
我正在通过一个程序创建一个网络接口,以便在模拟网络(NS-3)和真正的 Linux 主机之间建立一座桥梁。因此,当“桥接”节点在 NS-3 中接收到数据包时,真正的 Linux 主机会接收到该数据包。
但是当我再次运行该程序时,它无法“擦除”或删除网络接口,因为“设备或资源正忙”。
我尝试关闭接口ifconfig <myInterface> down
(“设备或资源正忙”。service networking restart
tunctl -d myInterface
你能解释一下如何删除或删除或重用界面吗?
networking - Filtering ethernet packets (ICMP, Bonjour) on a TAP interface on OSX
I'm writing a little tunneling app with layer 2 interfaces (TAP) as endpoints. In the course of testing this on OSX, I noticed I was getting all sorts of traffic I didn't expect on the tunnel, both when the tunnel was running on a single OSX machine, and when I tunneled between OSX and a Linux box. I'd like to filter this traffic out, and I'm wondering what the best way to do this is.
The tunnel looks like this (note both endpoints can be on the same machine):
The notable traffic is Bonjour packets on destination port 5353 and ICMP/IGMP. Multicast is enabled on the TAP interface. I'd like to block this sort of traffic. My thoughts on doing this:
- Turn off multicast on the interface (doesn't work on OSX, see below)
- Use
ebtables
- Parse the packets coming off the interface inside the tunnel app and ignore them there
Is there a better/easier way to do this?
I tried turning off multicast on the OSX interface (let's call it tap0) but I get an error.
EDIT: After a bit more hunting around, it appears UNIX and BSD ifconfig have different options. Is there another way to block multicast/ICMP traffic on a given interface in OSX/BSD?
here's the ifconfig output...
OSX (with osxtuntap):
Linux:
packets - 你可以一次写入多个IP数据包到linux tun设备吗?
我已经看到(通过实际读取 tun 设备)Linux 上的 tun 驱动程序可以在一次读取中返回多个 IP 数据包。反过来是真的吗 - 你可以在一次写入 tun 设备时写入多个 IP 数据包吗?
networking - 在 Linux 内核 2.6 中使用 TunTap
vtun 站点上的 TunTap 文档指出,该驱动程序仅在 Linux 内核 2.4 之前受支持。有没有办法让它在 2.6 和 3.2 版本的 Linux 上运行?
设备上的猫显示:
我尝试直接从 rpm 文件安装,看看我能走多远:
有什么办法可以让它在 linux 2.6+ 上工作,或者你知道有什么好的 tuntap 替代品吗?
c - 如何通过C程序设置tun设备的IP地址并设置link UP
我正在编写一个使用 Linux tun 设备进行隧道传输的 C 程序。我正在创建一个 tun 设备,使用ioctl()
调用设置它的所有者、组和持久性。但是,为了进行隧道,我需要为设备设置 IP 地址并设置链接。我目前正在使用
我想设置地址、掩码并将链接设置为up
. 有没有什么方法可以通过程序而不调用ip
命令来做到这一点?
我尝试使用ioctl()
withSIOCSIFADDR
命令,但它不适用于 tun 设备,并且适用于eth0
. 我得到错误ioctl() - Invalid argument
。
以下是适用于eth0
但不适用于以下内容的代码tun2
:
我搜索了为 tun 设备执行此操作的方法,但找不到任何方法。我必须使用的所有帖子ip
或ifconfig
类似的东西。
有没有办法通过程序做到这一点?谢谢
linux - 10G Linux VPN 性能
我有一个 Linux 机器,它有几个 10 Gbe 接口。我想要的是制作一个能够处理 10 Gbit/s 流量以及 10 Gbit/s 路由器/防火墙的加密隧道。有一些方法可以实现这一点,但正如我所见,所有方法都被带到了用户空间或内核空间处理中。
至于用户空间解决方案,我想是 TUN/TAP 设备。但我的实验表明,单个 TUN 设备在 1 Gbit/s 边界处具有性能限制。我尝试了某种 TUN 的聚合,它在 8xCPU XEON 配置上给了我大约 3.5 Gbit/s(没有加密思想)
至于内核空间解决方案,我想它可能比用户空间更快,但它有另一个程度的复杂性......
有没有人知道如何制作基于 Linux 的 10th Gbit/s 的 VPN 解决方案?
UPD #1
需要软件解决方案
sockets - tun 设备:服务器进程未收到消息
我设置了两个 tun 设备。写入每个 tun 设备的数据使用一个简单的循环通过 UDP 套接字转发到另一个 tun 设备:
使用设置接口后
我从一台设备向另一台设备发送 ping
我可以看到 tun0 的 UDP 套接字接收到 IPv4 数据包,并且该数据包已正确写入 tun0。还使用wireshark 观察tun0 上的流量表明该数据包是由tun0 接收的。但是,不会创建 ping 响应数据包。
我认为这可能是 ICMP 数据包的特殊情况,但是当我使用
再次没有建立连接。连接过程(第二次 socat 调用)仅继续触发 TCP-SYN 数据包并最终超时。同样,使用 wireshark 观察 tun0 上的流量表明 TCP-SYN 数据包已传递到 tun0 设备。
为什么这个数据包不转发到socat TCP-LISTEN进程以便建立连接?
c - 监听虚拟接口
我的目标是创建一个虚拟无线接口并在该接口上附加一个侦听器。我正在尝试使用 C 程序来执行此操作。
到目前为止,我已经能够通过以下方法创建虚拟接口:
- 使用 linux iw 命令:`
sudo iw phy phy0 接口添加 mySta1 类型站
但我无法找到使用 C 程序执行相同操作的库。
使用 Tun/Tap 持久接口:
http://backreference.org/2010/03/26/tuntap-interface-tutorial/
其中 tun_alloc 是我的函数,它使用 ioctl 创建接口
ioctl(fd, TUNSETIFF, (void *) &ifr)
但是这个接口没有无线扩展
在界面上收听:
nread = 读取(tunfd,缓冲区,sizeof(缓冲区));
但这仅适用于我使用我的程序或 openvpn 等程序创建的 tun 设备。当与 wlan0 等任何其他接口一起使用时,ioctl 会给出错误“无效参数”
我解决问题的方法正确吗?有没有其他方法可以实现这一目标?我想知道以下内容:
- 有没有办法将 tun 设备连接到由“iw add interface”命令创建的设备上?
- 有没有办法制作虚拟无线 tun/tap 接口或将现有 tun 接口的类型更改为无线?