我注意到,当发出特定类型的请求时,即使在私有子网中,也会显示ELB背后的ec2实例的内部IP。特别是具有空HOST值的那个。
telnet site_url 80
GET / HTTP/1.0
返回的标题:
HTTP/1.1 301 Moved Permanently
Cache-Control: max-age=1209600
Content-Type: text/html; charset=iso-8859-1
Date: Thu, 26 Mar 2015 18:47:22 GMT
Expires: Thu, 09 Apr 2015 18:47:22 GMT
Location: https://10.0.7.35/
Server: Apache
Content-Length: 226
Connection: Close
当然,这也会在443上打开ssl请求时发生。
是否有人知道此问题的解决方案或锻炼?我知道IIS有相同的症状,但我的问题是AWS ELB特有的。
编辑:
Apache重定向强制HTTPS。
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_ADDR} !^127\.0\.0\.1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
答案 0 :(得分:7)
这与ELB无关,与Apache有关,这显然是返回此信息(因此输出中的server: Apache
行)。
您显然在Apache配置中定义了某种重定向,以将流量从端口80重定向到端口443.您应该更新您的问题以包含Apache配置文件的相关部分,包括任何重写规则, ServerName,.htaccess设置等
编辑:
您在重写规则中使用HTTP_HOST,这与请求中提供的主机相对应。在您提供的示例中,您未提供主机,因此请尝试执行此操作:
$ telnet www.example.com 80
GET / HTTP/1.0
Host: www.example.com
如果定义了虚拟主机,则必须执行请求的主机部分,以便Apache知道应将请求路由到哪个虚拟主机。
您可能还想在这些行中添加另一个重写条件:
RewriteCond %{HTTP_HOST} !^www.example.com
RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]
这将确保如果某人试图访问您的网站而未提供包含标头的完整请求,则会将其重定向到正确的域。
答案 1 :(得分:5)
一位朋友今天发布了这个消息,尽管已经有答案,我还以为我会把我发现的细节放进去。
使用原始帖子中描述的机制,我能够重现所描述的场景,其中返回的Location
标头确实是https://地址。
但是,经过仔细检查后,提供的地址不我的任何实例地址 - 而不是 ELB实例本身中的IP地址。。 p>
我通过检查ELB背后的一个实例进一步证实了这一点,并使用这样的命令序列,我能够确认GET /
命令返回的IP地址确实是ELB的。< / p>
# These commands are purely to assist in obscuring my own IPs. :)
$ export LOCALIP=$(ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
$ export DISCOVEREDIP=<the IP from the GET test>
# I'm also using `sed` here to replace real IPs with strings to demonstrate which node is which
$ ss -tn | grep $DISCOVEREDIP | sed -e "s/$LOCALIP/localip/" -e "s/$DISCOVEREDIP/discoveredip/" | head -n 3
ESTAB 0 0 localip:80 discoveredip:3950
ESTAB 0 0 localip:80 discoveredip:4157
ESTAB 0 0 localip:80 discoveredip:4148
因此,我可以推断出我的Web服务器的本地IP地址正在侦听ELB指向的端口80,并且ELB的IP正在使用更高的端口连接到我的Web服务器。
没有超出ELB内部IP地址的曝光,无需担心。快乐的云彩!
答案 2 :(得分:3)
我们最近一直在研究这个问题并得出结论:
我们找到了一个适合我们的解决方案(我们只需要在我们的&#34;默认&#34; VirtualHost中解决这个问题),您可以考虑将其添加到您的VirtualHost:< / p>
UseCanonicalName On
在我们的评估中,这指示一些Apache行为在ServerName指令的响应中正式替换HTTP_HOST,这解决了我们试图解决的问题。
答案 3 :(得分:-1)
通过将作为公共VPC子网上的IP的主机字段重写为我们的主域名来解决Varnish Cache中的此问题。
if(req.http.host ~ "10.30.0") {
set req.http.host = "www.mydomain.com";
}