用 Java 还是其他高级语言构建我自己的防火墙?

用 Java 还是其他高级语言构建我自己的防火墙?

我发布了一个关于 ServerFault 上有关专门防火墙设置的问题,但作为一名狂热的软件开发人员,我也在考虑推出自己的软件。

我只对使用高级语言感兴趣,最好是 Java 或 Node.JS。 Linux 或 Illumos 是否有某种系统可以获取所有网络数据包,并将它们提供给我的应用程序,以确定是否应该允许、丢弃或拒绝它们? (或重写)

我只对 ICMP、UDP 和 TCP 数据包感兴趣。我设想我会编写一个 Java 应用程序,它允许我嗅探流量以确定是否应该允许它。例如,在 HTTP 流量中,我可能希望检查Host标头以确定浏览器正在尝试访问哪个网站。

我意识到这可能会降低潜在的吞吐量,但也许你们推荐的解决方案会有文档,让我澄清该警告的影响。

这几乎就像我在要求 FUSE,除了防火墙而不是文件系统。

是否有这样的程序,或者我是否会一直为防火墙编写 C/C++ 代码?

答案1

在基于 Linux 的平台上,有一个 netlink 套接字,您可以从 Java 程序中打开它并确定是否接受数据包。该套接字可以通过规则包含在网络堆栈中iptables。当然,您还可以在这里限制要传递到用户模式过滤器的数据包类型。

以下是手册页关于此事的说明:

乌洛格

该目标提供匹配数据包的用户空间日志记录。当为规则设置此目标时,Linux 内核将通过 netlink 套接字多播此数据包。然后,一个或多个用户空间进程可以订阅各种多播组并接收数据包。

鉴于 netfilter 项目的复杂性和复杂性,可能值得寻求您要解决的问题的解决方案。 (或者也许这就是你的其他 SE 问题所涵盖的内容;我还没有看过)

答案2

在 OpenBSD 上divert(4)机制可用于在内核和以任意语言编写的任意用户态进程之间传递数据包,假设该语言可以与系统调用进行交互(直接或可能通过填充程序的附加复杂性divert(4))如果该语言在系统调用方面表现不佳,则需要 IPC 代理层)。

答案3

用 Java 构建防火墙是完全合理的,但它不太可能是一个以网络系统所需的速度运行的整洁项目。

我曾经在一家公司工作,该公司生产在 SecureBSD 之上运行的网络安全设备。我们对 ipchains 所做的任何更改都需要仔细审查,因为流量是实时过滤的。即使是非常微小的性能损失也可能是灾难性的。

相关内容