预处理数据包发送到/从接口

er4*_*53r 5 linux networking network-interface

是否有可能在数据包数据到达接口之前和接收之后拦截它?例如预处理它并在途中将其送回?

我想创建一个自定义解决方案,就像这个名为 vtun 的伟大程序一样。它创建了一个充当接口的虚拟设备。这使其能够执行各种操作,例如流量压缩、加密、整形等。

我想知道现在是否可以更轻松地完成(vtun 已经很老了……)。我的目标操作系统是 Ubuntu 14.04。

dka*_*dis 4

是的,Linux 内核的 Netfilter 框架足够灵活,足以使这成为可能。

我不确定您所说的“自定义解决方案”“现在是否可以更容易地完成”有何期望。我假设您准备编写代码来进行低级数据包处理。

总体思路如下:

  1. 创建iptables规则,将流量从所需的表 ( filternatmangle) 通过目标传递到用户空间QUEUE
  2. 您将能够使用libnetfilter_queue库或nfqueue-bindings(如果您使用 Perl 或 Python)访问发送到队列的数据包。
  3. 按照您认为合适的方式处理数据包并将其按原路发送回去。

请记住,您将使用原始 IP 数据包、TCP 分段或 UDP 数据报(取决于您要处理的流量类型),并且您有责任正确地重新组装流量、维护数据包级别的校验和正确性以及操作系统的 TCP/IP 堆栈在幕后神奇地处理的所有其他事情。

如果您打算使用 Python 工作,我建议您使用dpktscapy来处理数据包或 TCP 段。这将使事情变得更加容易。