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 配置审视(九)

相关推荐
名字还没想好☜几秒前
Next.js App Router 数据获取:fetch 缓存、revalidate 与 dynamic 一次讲清
前端
成都渲染101云渲染66664 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫6 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
自信的未来8 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
全栈前端老曹8 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
Uncertainty!!9 小时前
Ubuntu 22.04 安装超好用中文输入法rime-ice(雾凇拼音)过程记录
linux·ubuntu·中文输入法
zhangxingchao9 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao10 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静10 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇11 小时前
模型相关知识
前端