我的目标相当典型,所以我希望其他人可能之前已经实现过类似的设置。
外部客户端 Foo 将连接到 Bar,这是一台具有适当防火墙例外的服务器,因此可以看到应用服务器 Baz (192.168.1.5) 所在的内部网络 192.168.1.0/24。Baz 通过 JNLP 提供 Java 应用。
当前设置
xinetd 在 Bar 的 8080 端口上运行,它通过防火墙重定向到内部系统 Baz 的 443 端口,JNLP 在该端口启动,并反馈到客户端 Foo,Java 应用程序在该端口启动正常,一切正常。Foo 客户端与 JNLP 文件的交互确实使用了由 xinetd“路由”的相同连接,因此此设置不会发生非对称路由或任何令人讨厌的事情。只是没有对应用程序的保护,这是不太理想的。
xinetd 配置:
service baz-app {
disable = no
type = UNLISTED
flag = IPv4
socket_type = stream
wait = no
user = root
port = 80
#Not functional yet.
#only_from = 127.0.0.1
redirect = 192.168.1.5 443
log_on_failure += USERID
}
所需设置
一些身份验证来保护应用程序。我们已成功实施以下操作:
Apache + mod_ssl + mod_proxy + mod_authz_ldap 带有 Kerberos 主体。它在端口 443 上运行,身份验证工作正常。然后,配置应代理到内部系统 Baz 的端口 443,JNLP 应从该端口传回。
以下是相关的 Apache 配置:
SSLProxyEngine on
ProxyPreserveHost on
<Location />
ProxyPass https://192.168.1.5/ # Baz's internal address.
ProxyPassReverse https://192.168.1.5/
.... all authentication options follow ....
</Location>
问题
使用前面提到的“所需设置”,JNLP 确实被传回,尽管由于 ProxyPreserveHost 选项设置为开启,Foo 的 WebStart 启动的 JNLP 文件希望在端口 443 上连接回 Bar 的主机名(然后只是一个循环),但不幸的是,如果没有 ProxyPreserveHost 选项,Foo 的 WebStart 会尝试连接到 Baz 的内部地址(防火墙阻止除 Bar 以外的任何主机访问该地址)。我的困境如此绝望,真是令人惊叹。
我已尝试对上述配置进行许多次排列,甚至通过添加另一个重定向级别来引入 xinetd 来停止循环,(这导致了奇怪的、未记录的(可能)怪异的情况,我甚至无法开始理解)。
此时,我发现很难只见树木不见森林,而且似乎无法摆脱这种奇怪的“第 22 条军规”。
欢迎任何建议。
干杯
sc.