我有一个在主机上运行的 Web 服务器,我想拦截该 Web 服务器发送的所有数据包(包括 IP/TCP 标头),这样 Web 服务器就不会直接将数据包发送到 Internet。
原本我的计划是使用 iptables 过滤掉 web 服务器发送的数据包,再使用 libpcap 来抓包,但是我发现数据包的流向是:
Wire----NIC----libpcap----INPUT CHAIN---TCP STACK
Wire----NIC----libpcap----OUTPUT CHAIN---TCP STACK
这意味着对于传入的数据包,我可以使用 libpcap 和 iptables 来实现拦截:使用 libpcap 捕获数据包,使用 iptables 阻止数据包传递到 TCP 堆栈。但是对于拦截来自 Web 服务器的传出数据包,libpcap 和 iptables 的组合似乎不起作用。因为如果我过滤传出的数据包,我的 libpcap 就无法捕获这些数据包。如果我不使用 iptables 进行过滤,虽然我可以使用 libpcap 捕获数据包,但原始数据包将到达互联网。
我的目标是拦截所有从 Web 服务器发送的数据包(包括 TCP/IP 头),有没有什么解决办法?谢谢!
注意:我不是问如何修改数据包的 TCP/IP 标头,我只是想让你知道我为什么要拦截数据包(包括 IP/TCP 标头)。我问的是如何拦截数据包。
答案1
使用 libpcap 来抓取数据包进行修改是错误的工具。您几乎肯定应该查看 netfilter 中用于在用户空间处理数据包的内置方法之一。
如果您想以 netfilter 中未内置的方式修改或滥用数据包,那么您可能需要仔细查看 NFQUEUE 目标。
这允许您设置规则,以便将数据包传送到用户空间。然后您可以对其进行任何您想做的事情,然后重新注入。
如果您实际上不需要对数据包做任何事,只需接受它,那么 ULOG 目标可能会提供您想要的东西。ULOG 将整个数据包转发给用户空间进程进行记录。
当然,如果内置方法都无法满足您的需要,您的另一个选择可能是构建自己的 netfilter 模块来执行任何不寻常的数据包更改。
答案2
你大概想要在Apache前面放置一个代理,例如nginx或haproxy。
这将使得以适当的方式处理来自 Apache 的响应成为可能,并且比在网络级别执行此操作容易得多。