64、【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(八)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如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 协议中定义的状态码(不像 404200500 那样),而是 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 配置审视(九)

相关推荐
king王一帅30 分钟前
Incremark Solid 版本上线:Vue/React/Svelte/Solid 四大框架,统一体验
前端·javascript·人工智能
智航GIS5 小时前
10.4 Selenium:Web 自动化测试框架
前端·python·selenium·测试工具
前端工作日常5 小时前
我学习到的A2UI概念
前端
徐同保6 小时前
为什么修改 .gitignore 后还能提交
前端
一只小bit6 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
Mr -老鬼6 小时前
前端静态路由与动态路由:全维度总结与实践指南
前端
颜酱7 小时前
前端必备动态规划的10道经典题目
前端·后端·算法
wen__xvn7 小时前
代码随想录算法训练营DAY10第五章 栈与队列part01
java·前端·算法
大怪v8 小时前
前端佬们!!AI大势已来,未来的上限取决你的独特气质!恭请批阅!!
前端·程序员·ai编程
Mr -老鬼8 小时前
功能需求对前后端技术选型的横向建议
开发语言·前端·后端·前端框架