这个问题的整个排查思路和解决方案
问题描述
用curl -v -H 'Host: www.attack.com' http://139.0.0.1:80
响应头:
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Apr 2023 23:07:02 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive
Location: https://www.attack.com:443/
Server: elb
由于其他项目已经做过host判断,验证发现用ELB外网地址就存在这个,而直接用服务器地址就不存在这个问题,
这个问题是ELB的问题,属于误报
现在的问题是需要服务器nginx配置上加上host判断
if ($host !~* ^example.com.cn|10.0.0.1$)
{
return 403;
}
但是加上之后,正常的页面无法访问,有时页面进不去,有时后端接口调用不了
为了解决这个问题,在nginx日志配置上最后加上$host
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$host" ';
通过查看nginx的access.log排查了解目前的调用有哪些host
通过查看日志,定位到一个100开头的ip也是host,于是把这个ip加进去,果然解决了问题
现在还有一个问题是这个100开头的ip是否会变化?会在重启服务时变化吗?如变化的话就不能只加ip,得知道ip的子网掩码得到这个ip范围,写个正则匹配这个范围的ip,后经运维确认这个是个虚拟服务器IP,总之不会随意变更,所以最终就是如下
if ($host !~* ^example.com|10.0.0.1|100.0.0.1$)
{
return 403;
}
验证curl -v -H 'Host: www.attack.com' http://10.0.0.1:80
返回403,ok