我需要build立一个系统,在这个系统中,我可以根据许多参数(如端口/协议等)来发送数据包,这些参数在某种程度上是“正常”的,而且还有其他方面,比如队列长度和其他外部因素。 我的路由器由两个内部接口(802.11)和两个外部接口(一个ADSL,一个LTE)组成。 所以我想通过一个外部程序来检查每个数据包,并决定它应该被路由的接口。
我看了一下iproute2,但没有find任何方法将每个数据包传递给外部程序,或者以某种方式为每个数据包dynamicselect路由。
所以问题是:做这件事的最好方法是什么? 有没有工具可以朝这个方向发展,还是我应该依靠自己制造的东西,并通过Linux标准工具传递数据包?
Netfilter (iptables)有队列模块发送帧到用户空间程序。 用于不同语言( c , python ,perl等)的库可用于检查数据包。 处理完一帧后,您将返回一个ACCEPT或DROP结果,原始或修改的帧,以及一个设置标记的选项。
我猜你可以使用标记在netfilter链的其余部分以不同方式处理这个数据包,并更改路由标记以select特定的路由表。
这将是一个比非常低级别的设备处理更优雅的解决scheme,但可能是一个性能问题,取决于您的用户空间实施的select。
我已经在另一个项目中使用这个来修改来自破损客户端的传入DHCP帧,但从未使用该标记。
用户空间路由可以通过在一个tun设备上指定一个默认路由,并让一个用户空间程序检查每个接收到的数据包来实现。 这是一种低效率和脆弱的方法,但已经做好了工作 – 由于Henning Rogge的缘故,AODVv2的实现方式是这样工作的。
另一种select当然是在内核中实现你的路由协议–AODV / DYMO / AODVv2的大部分实现都是这样工作的。
在开始这种任务之前,我会build议您仔细考虑是否需要为每个单独的数据包做出路由决策; 如果可能的话,更好的方法是dynamic操作路由表,同时将实际转发给内核。 本草案给出了使用这种方法可以实现的一个例子。 (免责声明:我是合着者。)
你使用什么样的硬件? 这听起来像你可能在embedded式设备上工作,在这种情况下,你可能应该使用netfilter选项。 但是如果你有更多的资源可供使用,你应该考虑使用OVS( http://openvswitch.org/ ),这是软件定义networking的事实上的开源标准。
软件定义networking具有“数据平面”与“控制平面”的概念。 数据包在数据平面中的物理/虚拟交换机之间传输。 在控制平面中,软件向交换机发送指令,以便如何通过数据平面转发数据包。
您可以在容器中设置OVS,并将其视为系统的ToR(路由器顶部)开关。 将所有传入的数据包路由到OVS,并让它决定如何处理它们。 您的软件将openflow指令发送到交换机。
这里有一些资源让你开始:
祝你好运!