我有两台机器,A 和 B,运行 RHEL Linux。每台机器都有一个连接到我称之为“LAN”网络的 1Gig 网卡。每台机器都有一个 10Gig 网卡,连接到我称之为“BIGDATA”的网络。除了通过这些机器外,这些网络没有相互连接。
我在 BIGDATA 网络上的 A 的 10Gig 接口上有光纤分接头。水龙头通向捕获服务器,我想在其中记录所有进出的数据。最初都是 TCP,但将来也许一些 UDP 会很好。
出于开发和测试目的,我想在 A 上运行 TCP 对话的双方,然后通过这些水龙头捕获对话。将使用此设置的开发人员不会在 B 上拥有帐户(至少这是我的目标)。
在我看来,超级用户应该可以在 B 上设置某种转发/中继,这将允许 A 上的客户端通过分接光纤连接到 A 上的服务器。即流量从 LAN 网络上的 A 到 B,然后在 BIGDATA 网络上返回到 A。返回流量采用相同的路径返回。
到目前为止,我的尝试是使用 ssh 隧道。喜欢A:~ $ssh B -L 8051:<A's-BIGDATA-IP>:3434 -N
。这实际上非常适合捕获从客户端到服务器的流量。但不幸的是,服务器的响应是找到只留在本地的捷径,并且永远不会出现在光纤上。查看wireshark,数据包知道它们的目标IP,并且不觉得有义务收回隧道。
我找到了这个答案,但我相信所有的解决方案都要求两个接口都在同一个网络上。也许我的解决方案的种子在那里,但我找不到它们。
我想我可以用 C 从头开始编写这个程序,在 B 上运行一个程序,在 LAN 接口上建立 TCP 连接,在 BIGDATA 接口上启动另一个 TCP 连接,返回到 A,并转发回复。它只会复制 TCP 有效负载,这足以满足我的目的。
是否有一个很酷的工具可以进行这种转发/中继?
有没有办法让 ssh 隧道按照我想要的返回流量的方式工作?
看看EtherPuppet ,可能与Scapy结合使用;EtherPuppet 被描述为
Scapy被描述为
源和目标 NAT
只要您不介意破坏您正在捕获的数据包,您就可以使用与您找到的答案相同的想法,使用 DNAT 和 SNAT 的组合来转发流量。捕获将具有 B 的目标 IP 或 src IP,但听起来您已经使用转发客户端完成了该操作。我猜 NAT 的优势在于速度,一切都保留在内核空间中。
此示例是 A 上的客户端连接到 A:BIGDATA:3434 上的服务器。NAT 规则将连接从 A 转发到 B,然后 B 转发回 A,同时将源设置为 B 以设置返回路径。如果您不熟悉 NAT 表,请查看netfilter 指南。
确保在 B 上启用了 IP 转发:
流量在 LAN 网络上从 A 流向 B
然后回到 BIGDATA 网络上的 A。
返回流量采用相同的路径返回
NAT 连接跟踪负责最后映射回原始源 IP。
虽然这不是我希望找到的答案,但我最终还是自己动手了。
我编写了一个在 B 上运行的程序,该程序将接受 LAN 接口上的连接并启动 BIGDATA 接口的连接。该程序将 TCP 有效负载复制到新的传出消息中。它对以另一种方式返回的回复做同样的事情。这不会保留标头信息(例如源 IP)——在我的情况下,我认为这是一件好事,因此返回流量不会捷径。
它正在工作,尽管对于我认为如此基本的东西来说这是一种痛苦。我会发布源代码,但它很冗长,可能写得不太好。
我将不接受答案,希望有人最终会以完美的解决方案偶然发现它!