【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(七)
分析了 default_server 的具体情况,如果有显式指定的 default_server,就用显式指定的,如果没有,就默认用最前面那个 server 块,并给出了一个安全的 default_server 配置,下面继续分析
Nginx 配置审视
上篇 blog 提到,对于 default_server 来说,server_name 几乎不起作用,只是语法上必须存在,因为 Nginx 要求每个 server 至少有一个 server_name,并且设置为 server_name ""; 是一种约定俗成的写法,表示不打算匹配任何合法域名,不服务任何真实站点
bash
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name "";
return 444; # 关闭连接,不返回任何内容
}
其目标在于,所有未明确配置的域名,或 IP 直接访问,或非法 Host 请求,一律拒绝,不返回任何内容,这时安全加固的最佳实践,可以预防如下场景:
- 服务器 IP 被直接访问,暴露 Web 信息
- 被网上机器人恶意扫描,发现 Web 服务
- 域名未绑定时返回其他错误站点,导致信息泄露
另外,再补充下这里的 return 444,这里的 444 不是 HTTP 协议中定义的状态码(不像 404,200,500 那样),而是 Nginx 自己内部的状态码,效果表现为立即关闭连接,不发送任何响应(连 HTTP 头都不发),对客户端表现为,连接被重置,此时攻击者都不知道 Web 服务器是否存在 ,官方 Module ngx_http_rewrite_module 解释如下

这样,所有非法 Host 或 IP 访问都会被静默拒绝,真实站点只有通过正确域名才能访问
OK,server_name 配置项也分析完了,并且和 external_url 作了区分,下面继续看 server 块中剩下的内容 location

这里的 location 配置是一个典型的反向代理设置,用于将外部 HTTP 请求转发到本地运行的另一个服务 ,比如有某个 Web 应用监听在 localhost:8080,当然,这个 Web 应用就是 Gitlab-Puma(这个后面分析),比如用户访问 http://192.168.1.100/,或任意路径,比如 http://192.168.1.100/api/users 时,(这里的 Host 就是 192.168.1.100,匹配上面的 server_name 192.168.1.100;),Nginx 会把请求透明地转发给本机的 http://localhost:8080,并正确传递客户端原始信息
- 首先是这里的
location /,表示匹配所有以/开头的请求路径,也就是所有路径,比如/,/login,/static/logo.png都会进入这个块儿,这种表达是最宽泛的匹配规则,相当于兜底处理所有请求 - 接下来是
proxy_pass http://localhost:8080;,是代理的核心指令,表示将请求代理(转发) 到服务http://localhost:8080上 ,比如用户访问http://192.168.1.100/api/users,Nginx 会向http://localhost:8080/api/users发起一个新请求,然后把后端的响应原样返回给用户 proxy_set_header Host $host;:把原始请求的 Host 头传递给后端服务,这里的$host是 Nginx 变量,值来源于客户端请求的 Host 头(也就是192.168.1.100),很多 Web 框架会检查 Host 头来生成绝对 URL(重定向场景),或用来做安全校验(防止 Host 头攻击) ,如果不设置,后端收到的 Host 可能是localhost:8080(相当于后端 Web 应用以为 Host 是自己,而不是外界能访问到的那个域名)

这里再提一嘴上面说的用 Host 头来生成绝对 URL(重定向场景) ,当 Web 应用需要主动告诉用户去另一个地址时(比如登录后跳转,或者注册邮件里的跳转链接),Web 应用就必须知道用户是通过哪个域名或地址来访问的 ,这样才能生成正确的完整网址,也就是绝对 URL,相当于绝对路径,而这个信息,就来自 HTTP 请求中的 Host 头
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(九)