隧道时 Apache/Tomcat AJP DNS 失败

隧道时 Apache/Tomcat AJP DNS 失败

我遇到这样一种情况,我可以直接从主机或本地网络访问私有 NAT 的 apache2.4 / tomcat7.0 railo4.2 服务器,但是当通过 SSH 远程端口转发进行隧道连接时,应用程序会中断并出现错误:

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /.

Reason: DNS lookup failure for: server-dev:5555

显而易见的答案是 server-dev 是一个无法解析的主机名,但这里不应该是这种情况,因为它lynx server-dev:80在服务器上本地或子网上的 LAN 机器上工作(名称通过客户端和服务器上的 /etc/hosts 解析)。apache 提供的静态页面也可以工作,错误似乎出在 Tomcat 端或 AJP 连接器中。我自己从 2.4.9 源用 apr 1.5.1 编译了 apache。似乎只有在端口转发时才会出现。

Apache 错误日志显示:

[Tue Jun 24 22:37:06.911541 2014] [proxy:error] [pid 16858] [client 10.10.10.15:63398] AH00898: DNS lookup failure for: server-dev:5555 returned by /

catalina.out在任何其他日志中我都看不到任何值得注意的内容。

相关的 apache 配置是:

<VirtualHost *:80>
    ServerName server-dev
    UseCanonicalName On

    RewriteCond %{REQUEST_FILENAME} /[^/:]+\.cfml*($|/)
    RewriteRule (.*) ajp://%{HTTP_HOST}:8009$1 [P,L]
</VirtualHost>

SSH 隧道是使用 PuTTY 从第三个“中间人”系统 (10.10.10.15) 创建的,其设置如下:

Remote: 5555
Local: 10.10.10.101:80

服务器上的相关 /etc/hosts 条目(它没有 bind/dnsmasq):

10.10.10.101  server-dev  # servers private ip

看起来,要么是 hosts 文件被忽略了,要么是尝试进行 DNS 解析,要么是 5555 端口号以某种方式造成了混淆(好像它认为它是主机名的一部分),不过我想不出发生这两件事的充分理由。

答案1

我找到了问题所在。%{HTTP_HOST}在端口不是 80 的情况下,它似乎还包含端口号,因此规则被评估为RewriteRule (.*) ajp://server-dev:5555:8009$1 [P,L]

简单的解决方案:看起来%{SERVER_NAME}变量不包含端口。

因此有效的规则是

RewriteRule (.*) ajp://%{SERVER_NAME}:8009$1 [P,L]

警告:我忘记了 HTTP_HOST 和 SERVER_NAME 根据客户端浏览器发送的域而不同。我实际上需要 HTTP_HOST,但不需要端口,因此实际的解决方案是https://stackoverflow.com/questions/11553939/rewriterule-using-http-host-and-a-different-port

RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ http://%1:12345/ [R,L]

相关内容