我在 Apache 中设置了负载平衡httpd
:
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName xxx.xxx.xxx.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://xxx.xxx.xxx.xxx:8080/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:8080/
</VirtualHost>
:8080
是tomcat
运行在同一主机上的 Apache 应用服务器。我工作的地方有日志保留要求,所以我认为将所有内容都改为 apachehttpd
将使事情变得非常适合分析。
我试图让所有公共请求通过端口 80,而不破坏最终用户可能拥有的任何链接或书签。我打算通过进行一些端口转换来做到这一点,以便所有内容看起来都像是通过端口 80 进入应用程序。在没有考虑上面的负载平衡的情况下,我在表中添加了以下规则nat
:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8081 -j REDIRECT --to-ports 80
问题是,我可以通过httpd
或直接访问该应用程序:8080
。每条规则的数据包计数也在增加,因此显然它们正在匹配。
我的问题是这样的:为什么这没有创建无限循环?
看起来:8080
请求会被转发到,httpd
而请求本身会尝试通过遍历来检索它们:8080
,因此循环将继续向前,直到我重新格式化我的新简历。
答案1
答案就在于-i eth0
。
即使您将 httpd 设置为连接到17.98.65.28
,我认为这是 上的 IP eth0
,流量实际上不会流过eth0
,而是会使用lo
。
这样做的原因是,当路由到盒子本身拥有的任何 IP 时,流量会流过lo
.您可以通过以下方式验证这一点:
ip route get 17.98.65.28
您将得到一条包含 的行dev lo
,这告诉您将使用哪个接口将流量发送到该地址。
例如,在我的笔记本电脑上,我wlan0
有10.252.28.62
:
$ ip route get 10.252.28.62
local 10.252.28.62 dev lo src 10.252.28.62
cache <local>