我需要构建一个系统,在这个系统中,我能够根据一些参数(例如端口/协议等)路由数据包,这些参数在某种程度上是“正常的”,但也可以根据其他方面(例如队列长度)和其他外部因素路由数据包。我的路由器由 2 个内部接口(802.11)和两个外部接口(一个 ADSL,一个 LTE)组成。因此,我想通过外部程序检查每个数据包,并决定应在哪个接口上路由它。
我看了一下 iproute2,但没有找到任何方法将每个数据包传递给外部程序,或者以某种方式动态地选择每个数据包的路由。
所以问题是:最好的方法是什么? 是否已经有朝这个方向发展的工具,还是我应该依靠自己制作的东西,并通过 Linux 标准工具传递数据包?
答案1
答案2
通过在设备上指定默认路由tun
,并让用户空间程序检查每个收到的数据包,可以实现用户空间路由。这是一种低效且脆弱的方法,但它已经成功了——Henning Rogge 发明了一种以这种方式工作的 AODVv2 实现。
当然,另一种选择是在内核中实现路由协议 - 大多数 AODV/DYMO/AODVv2 的实现都是这样工作的。
在着手进行此类任务之前,我建议仔细考虑是否需要为每个单独的数据包做出路由决策;如果可能的话,更好的方法是动态操作路由表,同时将实际转发留给内核。使用这种方法可以实现的示例如下这份草案文件.(免责声明:我是合著者。)
答案3
您使用的是哪种硬件?听起来您可能正在使用嵌入式设备,在这种情况下,您可能应该使用 netfilter 选项。但是,如果您有更多资源可供使用,则应考虑使用 OVS (http://openvswitch.org/),这是软件定义网络事实上的开源标准。
软件定义网络具有“数据平面”与“控制平面”的概念。数据包在数据平面中的物理/虚拟交换机之间传输。在控制平面中,您的软件向交换机发送有关如何通过数据平面转发数据包的指令。
您可以在容器中设置 OVS,并将其视为系统的 ToR(路由器顶部)交换机。将所有传入数据包路由到 OVS,并让其决定如何处理它们。您的软件将 openflow 指令发送到交换机。
以下是一些可帮助您入门的资源:
- 来自 LXC 首席贡献者的有关容器/ovs 的博客:
- pox 教程,一个用于 openflow 编程的 python API:
- 使用 mininet 和简单的 openflow 规则设置测试实验室的教程:
祝你好运!