使用TUN / TAP接口路由流量

时间:2014-06-09 13:29:40

标签: networking routing vpn openvpn network-traffic

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

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

作为一个示例应用程序,我试图模仿没有加密,没有认证客户端服务器VPN应用程序。

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

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

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

  3. - 编辑:

    Scneario

    Client Tap0 _____ Server Tap0 ______ Target
           Eth0              Eth0
    

    目标:从客户端ping,通过tap接口,目标只能看到服务器ip(匿名化)

    到目前为止我的成就。

    • 在客户端tap0界面捕获流量。

    • 我可以在服务器上转发流量点击,以便在客户端 - 服务器之间使用Java套接字编程。

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

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

    任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

1。路由是第3层(IP)问题,由操作系统处理。对于第2层上的以太网帧,您有多个选项。在任何情况下,您都必须解析the incoming packets' headers并提取MAC地址,并根据MAC传递数据包的位置来决定:对特定客户端,所有客户端(广播)或本地分路接口。< / p>

选项1:在每个客户端上,使用tun设备,让服务器使用tap设备。为每个客户端分配伪MAC地址,从服务器的操作系统响应ARP requests,让服务器上的操作系统负责其余的工作。在Applicationwise中,您只需将所有传入的数据包转发到tap设备,并将所有传出的数据包转发到您为其分配此MAC的客户端。

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

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

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

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