我正在使用 Apache 将子域重定向到端口(mod_proxy
、、 )并mod_proxy_http
使用mod_proxy_ajp
IP 表来限制除我和本地服务器之外的直接端口访问。
我的 IP 表如下所示:
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
ACCEPT tcp -- localhost anywhere tcp dpt:tproxy
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:http-alt
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:webmin
ACCEPT tcp -- localhost anywhere tcp dpt:webmin
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我将在这篇文章中使用的上下文是:
Sonatype Nexus:nexus.example.com => example.com:8081
詹金斯持续集成:jenkins.example.com => example.com:8080
Webmin的:webmin.example.com => example.com:10000
我现在的工作是除了我之外没有其他直接端口访问。我还希望本地系统能够访问端口,我相信我现在拥有的就是这样的。我将其用于mod_proxy_ajp
Jenkins CI 和 Webmin 以及mod_proxy_http
Sonatype Nexus。
当我访问直接端口时,这些服务都能正常加载。当我要求其他人加载每个服务时,他们却无法加载,所以这很正常。
但是,现在,当尝试访问其中一个子域时,我会得到永无止境的负载(无限循环?)
但是,当我在子域上运行 tracert 时,它可以正常结束,所以我可以消除无限循环。
这是我的 Sonatype Nexus apache 虚拟主机配置:
<VirtualHost *:80>
ServerName nexus.majornoob.com
ServerAlias www.nexus.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-nexus.log
LogLevel warn
CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>
这是我的詹金斯:
<VirtualHost *:80>
ServerName jenkins.majornoob.com
ServerAlias www.jenkins.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8080/
ProxyPassReverse / ajp://127.0.0.1:8080/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-jenkins.log
LogLevel warn
CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>
这两个虚拟主机的例子分别使用mod_proxy_ajp
和mod_proxy_http
。
有人能帮助我弄清楚为什么我会得到无限负载吗?
谢谢。
编辑:别在意无限循环。过了一段时间,我收到了 503 服务不可用错误。
答案1
iptables 规则按打印的顺序从上到下进行评估。您遇到的问题是代理连接来自 localhost,它符合以下规则:
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
localhost
不是c-24-7-...
,所以连接被丢弃。代理模块最终会超时;如果规则是 REJECT 而不是 DROP,您会更快收到错误(因为您会被明确拒绝,而不是连接尝试就此消失)。
解决方案非常简单:重新排序规则,将“接受来自本地主机”放在“拒绝来自其他任何地方”之前。(IP 路由按最具体的方式匹配,但由于 iptables 是多因素的,因此不一定定义)。
我通常建议制定第一条规则,允许所有本地主机通信(通过环回接口,以防有人通过以太网尝试一些奇怪的事情);尝试添加
iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT
将-I
其插入()在列表顶部。