使用外部程序的高级动态路由

使用外部程序的高级动态路由

我需要构建一个系统,在这个系统中,我能够根据一些参数(例如端口/协议等)路由数据包,这些参数在某种程度上是“正常的”,但也可以根据其他方面(例如队列长度)和其他外部因素路由数据包。我的路由器由 2 个内部接口(802.11)和两个外部接口(一个 ADSL,一个 LTE)组成。因此,我想通过外部程序检查每个数据包,并决定应在哪个接口上路由它。

我看了一下 iproute2,但没有找到任何方法将每个数据包传递给外部程序,或者以某种方式动态地选择每个数据包的路由。

所以问题是:最好的方法是什么? 是否已经有朝这个方向发展的工具,还是我应该依靠自己制作的东西,并通过 Linux 标准工具传递数据包?

答案1

网络过滤器(iptables)有队列模块将帧发送到用户空间程序。不同语言的库(CPython、perl 等)可用于检查数据包。处理完一帧后,您将返回 ACCEPT 或 DROP 判决、原始或修改后的帧以及设置标记的选项。

我猜测您可以使用标记在其余的 netfilter 链中以不同方式处理此数据包,并更改路由标记以选择特定的路由表。

与非常低级别的设备处理相比,这将是一个更优雅的解决方案,但根据您选择的用户空间实现,可能会出现性能问题。

我曾在另一个项目中使用它来修改来自损坏的客户端的传入 DHCP 帧,但从未使用过该标记。

答案2

通过在设备上指定默认路由tun,并让用户空间程序检查每个收到的数据包,可以实现用户空间路由。这是一种低效且脆弱的方法,但它已经成功了——Henning Rogge 发明了一种以这种方式工作的 AODVv2 实现。

当然,另一种选择是在内核中实现路由协议 - 大多数 AODV/DYMO/AODVv2 的实现都是这样工作的。

在着手进行此类任务之前,我建议仔细考虑是否需要为每个单独的数据包做出路由决策;如果可能的话,更好的方法是动态操作路由表,同时将实际转发留给内核。使用这种方法可以实现的示例如下这份草案文件.(免责声明:我是合著者。)

答案3

您使用的是哪种硬件?听起来您可能正在使用嵌入式设备,在这种情况下,您可能应该使用 netfilter 选项。但是,如果您有更多资源可供使用,则应考虑使用 OVS (http://openvswitch.org/),这是软件定义网络事实上的开源标准。

软件定义网络具有“数据平面”与“控制平面”的概念。数据包在数据平面中的物理/虚拟交换机之间传输。在控制平面中,您的软件向交换机发送有关如何通过数据平面转发数据包的指令。

您可以在容器中设置 OVS,并将其视为系统的 ToR(路由器顶部)交换机。将所有传入数据包路由到 OVS,并让其决定如何处理它们。您的软件将 openflow 指令发送到交换机。

以下是一些可帮助您入门的资源:

祝你好运!

相关内容