【问题标题】:Routing traffic with TUN/TAP interface使用 TUN/TAP 接口路由流量
【发布时间】:2014-06-09 13:29:40
【问题描述】:

我是网络编程的新手,并尝试了解如何通过 TUN/TAP 接口管理流量。

因为我几乎不具备系统编程技能,并且对 Java 有信心;我使用 OpenVPN tun/tap 驱动程序和现成的 Java 绑定。它适用于 TAP 模式。

作为一个示例应用程序,我试图模拟无加密、无身份验证客户端服务器 VPN 应用程序。

我可以捕获以太网帧数据包,但是对于路由部分,我失败了。 (我可以修改路由/arp 表。)

  1. 有人知道 OpenVPN 如何将数据包从客户端发送到服务器,然后从服务器发送到目标。从 Java 中打开套接字看起来像是另一种选择;但我希望修改数据包(更改 IP 和/或 MAC 地址)并写回虚拟分路接口就足够了。是这样吗?

  2. 我可以注入数据包以发送其他位置,或者默认情况下接收到的数据包移动到应用层吗?

-- 编辑:

情景

Client Tap0 _____ Server Tap0 ______ Target
       Eth0              Eth0

目标:从客户端 Ping,通过点击接口移动,目标只看到服务器 ip(匿名化)

到目前为止我所取得的成就。

  • 在客户端 tap0 接口捕获流量。

  • 我无法在服务器上转发流量 Tap 所以为了固定我在客户端-服务器之间使用 Java 套接字编程的东西。

现在我从服务器的套接字读取数据包,并尝试使用 OpenVPN Tap 驱动程序的写入方法继续前进,但我不确定我在哪里失败。我在服务器 tap0 上看到带有 tcpdump 的数据包,但它们没有传递到服务器 eth0。

我最重要的问题是如果我修改数据包(ip,mac地址)并调用write方法,数据包是否有可能向前移动。 (或者无论你改变什么,它都会移动到应用层??)

任何帮助将不胜感激。

【问题讨论】:

  • 你想要达到什么目的?
  • "我使用 OpenVPN tun/tap 驱动"你使用什么操作系统?

标签: networking routing vpn openvpn network-traffic


【解决方案1】:

1. 路由是第 3 层 (IP) 问题,由操作系统处理。至于第 2 层上的以太网帧,您有多种选择。在任何情况下,您都必须解析 the incoming packets' headers 并提取 MAC 地址,并根据 MA​​C 决定将数据包传递到何处:到特定客户端、所有客户端(广播)或本地分路接口。

选项1:在每个客户端上,使用一个tun设备,让服务器使用一个tap设备。为每个客户端分配伪 MAC 地址,相应地从服务器的操作系统响应ARP requests,并让服务器上的操作系统处理其余的事情。应用程序方面,您只需将所有传入数据包转发到分接头设备,并将所有传出数据包转发到您分配此 MAC 的客户端。

选项 2:让客户端选择自己的 MAC 地址并通过网络转发 ARP 请求。对于来自客户端的传入数据包,服务器应用程序必须决定是否将数据包转发给客户端,或者如果地址与本地设备的 MAC 匹配,则将其发送到本地分路设备。

在这两种情况下,客户端都会将所有数据包从其本地 tun/tap 设备传递到服务器,反之亦然。

2. 你几乎可以做任何事情。仅当您决定将数据包写入分接设备时,才会“接收”数据包,您当然可以调整任何数据包,或注入新数据包,...

作为最后的评论,我发现使用 tun 设备在概念上更简单,因为它们在第 3 层上工作。您必须在服务器上为每个客户端打开一个 tun 设备,但在您的应用程序中除了将来自设备的任何内容转发给单个客户端外,您无需执行任何操作,反之亦然。

【讨论】:

  • 亲爱的菲利普,您说“只有当您决定将数据包写入分接设备时,才会“收到”数据包”。收到是什么意思。我想更改数据包的地址并让它移动到其他位置。如果接收是唯一的选项,那意味着我必须使用其他方式发送数据包。
  • tap 设备驱动程序将通过 tap 设备(这是其他应用程序看到的)路由到/来自 ip 的数据包转换为可以是read() rsp 的原始以太网数据包。使用来自 Tap 设备的 FD 的write() 编写(这就是您的 VPN 程序所看到的)。我的意思是,一旦获得原始数据包,您可以以任何您想要的方式对其进行更改,并决定再次将其写入哪个客户端的 TUN 设备(用户空间应用程序将显示为正在接收的相应数据包)。
  • 对不起,我理解的有点慢 :) 更改数据包时,我可以将其路由到其他子网对吗?例如,在我添加到问题的示例中,让我们认为目标是 google.com(不是另一个客户端)。顺便说一句,我使用 TAP 设备。如果我更改目标地址,如果路由配置正确,我希望数据包将通过服务器的 eth0 移动到 google.com。我说的对吗?
  • 是的。您只需将更改后的数据包写入分接设备,您的操作系统会将其转发到其目的地。 (至少在理论上,实际上中间的某些路由器会丢弃数据包,原因与 Google 无法回复您的原因相同)。 Google 的响应不会到达您,因为他们的服务器不知道如何将响应路由回发件人 IP,该 IP 位于您的 VPN 子网中。有几种方法可以解决这个问题。一种是使用 NAT(如果你使用的是 linux,则是 iptables 的 masquerade 目标),另一种是自己打开一个套接字并实现数据的正确路由。
  • 谢谢。现在我需要弄清楚我的数据包在哪里丢失了。 ping -I tap0 someIp returns destination host unreachable from tap0ip.
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多