问题标签 [tun-tap]

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.

0 投票
1 回答
305 浏览

c - 将 `ip tuntap add` system() 调用转换为 C 代码

我正在尝试将system()我在 C 中的调用转换ip tuntap add ...为不依赖于调用的 C 代码system()

基本上,system("ip tuntap add ...")当我的应用程序被强行终止时,我使用调用调出的隧道适配器留在那里是一个问题。

我被告知我可以使用rtnetlink来实现我的目标。我想将以下行转换为不依赖system()调用的 C 代码。我相信如果我使用rtnetlink,当我的应用程序终止时,我提出的隧道适配器将被内核破坏,这是我想要这样做的主要原因。

这是我在 C 中的当前行:

如果rtnetlink不是我将如何去做,当我的应用程序被强制终止时,是否有另一种方法会破坏隧道?

0 投票
1 回答
327 浏览

docker - 如何使用 Docker 而不是 Virtualbox 在 macOS 上制作透明代理?

有一个 github 项目VRouter,它将 Openwrt 图像制作为 macOS 上的 vbox,并将流量路由到虚拟机的 NIC 作为透明代理。我想知道用 docker 可以做这些事情吗?据我所知,docker for mac 实际上是在 mac 上的虚拟机中运行的,macOS 上没有 docker0 网卡。我找到了一个项目tuntaposx和一个用于 Docker for Mac docker-tuntap-osx的 tuntap 支持 shim 安装程序,这使得它可以从 macOS 访问虚拟机内的 docker 容器,而不是发布端口。但下一步是什么?我对网络问题感到很困惑。有人可以给我一个提示吗?

0 投票
1 回答
267 浏览

udp - 使用 Erlang TUNCTL 时如何提高 TUN 接口的吞吐量

我使用带有 {active, true} 的 TUNCTL 从 TUN 接口获取 UDP 数据包。该进程获取数据包并将它们发送到另一个可以工作的进程,然后将它们发送到另一个进程,该进程使用 gen_udp 将它们推出不同的接口。相同的过程以相反的方向重复,我使用 gen_udp 获取数据包并将它们发送到 TUN 接口。

当 CPU 负载接近 50%(大约 2500 个数据包/秒)时,我开始在传入的 TUN 接口上看到溢出。我永远不会在 gen_udp 端丢失任何数据包,只有 tunctl。为什么我的应用程序在 CPU 没有过载的情况下没有从 TUN 接口获取所有数据包?我的进程的消息队列中没有消息。

我玩过进程优先级和缓冲区大小,但这并没有多大作用。总 CPU 负载会有所不同。我设法降低了 CPU 负载,但即使我看到 TUN 接口吞吐量略有增加,现在它似乎在较低的 CPU 负载下达到最大值,比如 50% 而不是 60%。

TUNCTL/Procket 是否无法足够快地读取数据包,或者 TUNCTL/Procket 是否由于某种原因没有获得足够的 CPU 时间?我的理论是,Erlang Scheduler 不知道它在调用 NIF 时需要多少时间,也不知道 TUN 接口上未处理消息的数量。我需要弄脏 C++ 和/或编写自己的 NIF 吗?帮助!

0 投票
0 回答
1635 浏览

virtualbox - ovs tap "internal" vs tuntap tap

我正在构建一个 SDN 测试平台,其中包括安装在 Linux Ubuntu 18.04 上的 OpenvSwitch 交换机和在 VirtualBox 上运行的 5 个 VM(Linux Ubuntu 16.04 服务器)。OVS 由 OpenDaylight Boron 管理。

  • 当我使用ip tuntap add mode tap tapN创建分接头将 VM 链接到 OVS 时,一切正常,我可以在“同一子网内”的 VM 之间 ping。但是,当我尝试: 时ovs-ofctl -O OpenFlow13 dump-ports br0, (rx pkts 和 tx pkts) 之类的统计信息在除 LOCAL 端口之外的所有端口上仅显示零。 在此处输入图像描述
  • 但是当我ovs-vsctl add-port br0 vnet0 -- set Interface tapN type=internal用来创建分路器时,即使只有一个设备 ping 另一个设备,我也可以看到所有端口的统计信息。 在此处输入图像描述 我的问题:

    1. 为什么 (dump-ports) 在第一种情况下不显示统计信息?

    2. 如第二种情况所述,可以在我的测试平台中继续使用(ovs 内部抽头)吗?


这是完整的OVS配置案例1:

0 投票
1 回答
124 浏览

linux - Tun fd 上的 read(2) 返回零

在我的应用程序中,创建了一个 Tun 接口,并且该进程在 select(2) 循环中继续使用 read(2) 读取关联的 fd。但是,当我在应用程序中调试问题时,我发现在某些时候对 Tun 文件描述符的 read(2) 操作可能会返回零。这可能吗?它可能发生的条件是什么?

提前致谢。木质的

0 投票
1 回答
1080 浏览

dns - 在 GCP VPS 实例 CentOS7 中设置具有专用 IP 的 GRE 隧道

我已经成功在 GCP 中创建了一个新的 VPS 实例。通过 ssh 登录并获得 root 访问权限。我设置 tun1 接口的命令已成功完成:

如果我检查 lsmode | grep gre,我明白了

我也试试:# modprobe ip_tunnel # modprobe gre #

不显示任何结果。

如果一切正常,我应该可以使用外部专用 IP xxx.xxx.xxx.xx 访问我的服务器(它是一个云 DNS 系统)。

推,有人可以帮帮我吗?

0 投票
0 回答
39 浏览

c - 在两个运行 TUN/TAP 的设备之间交换消息

(我是网络编程的新手)我想使用n2n创建连接到 Internet 的各种机器的网络,我希望它们使用 TCP/UDP 等协议交换数据。我已经在他们的 github 上提出了一个问题,但似乎他们已经停止回复了。请我需要帮助

我已经尝试在两台机器上执行问题中提到的内置函数“quick_edge_init”,然后尝试使用标准 udp 交换消息,将一个作为客户端,另一个作为服务器。

两个节点上的 Quick_edge_init 参数

节点 1

节点 2

我只想让我的程序启动的这个网络上的节点交换消息

0 投票
1 回答
131 浏览

c - 如何通过 TAP 设备在我的堆栈中测试 ICMP?

我正在编写代码以在 TAP 设备上实现一个简单的 TCP/IP 堆栈。但是当我想测试 ICMP 代码时,我发现它ping $(TAP IP)不会向 TAP 设备发送数据包。它总是将它们发送到环回。那么如何测试我的 ICMP 代码呢?

我的系统是 Ubuntu-18.04
当我测试 ARP 时,我使用arping -I $(TAP NAME) $(TAP IP),它工作正常。但ping -I $(TAP NAME) $(TAP IP)仍将数据包发送到环回。

0 投票
1 回答
86 浏览

c - 如何判断 linux 内核在哪里解析 tuntap 接口上的 MLD 连接?

我一直在研究一个在 Linux 内核之上运行的路由设备上使用 TUNTAP 接口(在 TUN 模式下)的程序。这是一个多播隧道协议,我正在尝试通过我的应用程序将 MLD 连接发送到内核,以便可以在其他地方接收。然而,即使我已经对接口上发送的数据包进行了四次检查,Linux 内核在数据包被传递之前会丢弃它。

乏味地我一直在通过 linuxkernel 跟踪数据包的路径,试图找出它被丢弃的原因,我想我已经在某种程度上弄清楚了为什么它没有被处理。Hop-by-Hop 选项(包含 MLD 所需的 Router-Alert 选项)在 ipv6_rcv 函数的 net/ipv6/ip6_input.c 中被解析,但不是继续在 ip6_rcv_finish 中处理数据包,而是数据包由于 ipv6_rcv 函数末尾的 NF_HOOK 以某种方式将数据包解释为正在由其他东西处理,因此被丢弃。(NF_STOLEN 而不是 NF_ACCEPT)

一旦 ipv6_rcv 函数完成执行,其他东西就会执行 ip6_mc_input,(仍然在 net/ipv6/ip6_input.c 中)但是从这里开始,逐跳选项不被处理,这意味着当内核最终处理第 4 层协议时,它没有任何东西可以处理协议,因为逐跳选项是要预先处理的。这意味着内核由于未知协议而丢弃了数据包。

我想弄清楚的是什么在调用 ip6_mc_input。我已经在 elixir 上看了很多可以调用它的东西,但是有很多可能性,因为它是从 rt6_info 结构中的指针调用的,由于很多东西都使用它,因此很难追踪。有谁知道任何可以帮助我搜索的东西?

IGMP 连接工作正常,但 IPv4 的内容可能非常相似,因此来自该上下文的信息也可能会有所帮助。

供参考,使用的linux内核版本为v4.4.6

0 投票
1 回答
393 浏览

http - 如何使用 tun tap 接口发送 HTTP 请求

我正在从事网络代理项目和该领域的新手。我想创建一个tun-tap接口并通过这个接口发送一个HTTP请求。这是我的方法。

但是我的开发服务器没有收到任何请求。并且不显示任何错误。