java - 实现 IP 网关(用 Java?)

标签 java routes ip

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

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

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

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

最佳答案

您的问题非常广泛,因此答案也同样广泛。我希望它能帮助你找到一些初步的研究方向。

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

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

第三种选择是实际写一些东西。这就是事情变得棘手的地方,特别是如果你想用 java 来做的话。要执行桥接或路由,您需要将帧获取到用户空间( iptables+nfqueue 可以在这里提供帮助),然后根据您自己的逻辑处理它们,最后将它们写出 using a raw socket 。这是相当大量的工作。

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

如果您需要有关其中一些内容的更多详细信息,您可能需要在阅读后提出第二个更有针对性的问题。

关于java - 实现 IP 网关(用 Java?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58292986/

相关文章:

ruby-on-rails - Rails 没有路由匹配 PUT,但 rake 路由显示它存在

apache - 当您的 IP 地址作为 URL 输入时,您如何设置默认网站以提供服务?

javascript - 如何将页面中以文本形式表示的 IP 地址替换为其 IP 位置(例如 "Country, Region, City")

c++ - 禁止MAC地址访问某个端口 - C++

java - 使用 ajax 将数据发布到 Jax-RS

java - toString 的显式与隐式调用

Java SQLException 与 JDBC - SQLITE_MISUSE

java - 如何在 Java Swing 中将 html 文本附加到 JLabel

android - 开源安卓路由SDK

ruby-on-rails - Rails路线-限制资源的可用格式