0

我是网络编程的新手,并尝试了解通过 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方法,数据包是否有可能向前移动。(或者无论你改变什么它都会移动到应用层??)

任何帮助,将不胜感激。

4

1 回答 1

3

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

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

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

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

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

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

于 2014-06-12T10:35:50.747 回答