实施 IP 网关(在 Java?)

Implementing an IP Gateway (in Java?)

我想编写一个程序来模拟各种网络条件(例如延迟、丢包)。该程序最直接的介绍是将其配置为 IP 网关 - 客户端将流量发送到它作为默认网关,或者下游路由器将其设置为下一跳以用于路由目的。

如何编写程序来接收和处理该流量?

有哪些工具和库可以实现这一点?例如这可以通过 linux 上的 iptables 完成吗? (如果可能的话,我更愿意在 Java 中实现它)。

一种解决方法是将这样的程序实现为代理(例如 HTTP + SOCKS)并配置路由器以透明地将所有流量发送到代理。另一种可能是打开原始套接字并手动处理所有流量,但这实际上可能意味着重新实现网络堆栈。有没有更好的方法?

你的问题很宽泛,所以答案也会很宽泛。我希望它能帮助你找到一些初步的研究方向。

首先,尽量避免写任何东西。此任务已有解决方案(提示:搜索 "WAN Emulator")。

如果您发现的内容不够好,我的下一步将是使用 tc and netem 编写一些脚本。 Linux 对路由和桥接都有很好的支持。使用 tc+netem,您可以在上面添加延迟、丢失、抖动以及几乎任何其他内容。如果需要,创建一个更高级别的实用程序,可能在 Java 中配置 tc 并提供更好的 UI.

第三种选择是实际写点东西。这就是事情变得棘手的地方,特别是如果你想在 java 中做到这一点。要执行桥接或路由,您需要将帧发送给用户 space (iptables+nfqueue could help here), then handle them according to your own logic, and finally write them out using a raw socket。工作量很大。

实施 HTTP 代理会更容易,因为您不需要在单个数据包级别上工作。您可以避免使用低级别的东西(iptables/nfqueue/raw 套接字),而只使用普通和简单的套接字,甚至 Java 中的整个 HTTP 代理实现,例如 this one from Jetty.

如果您需要有关其中一些内容的更多详细信息,您可能希望在阅读一些内容后打开第二个更集中的问题。