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

相关推荐
怪我冷i4 小时前
wsl Ubuntu切换中科大源
linux·windows·ubuntu·ai编程·ai写作
余生H4 小时前
前端科技新闻(WTN-3)React v19 引发 Cloudflare 异常事件复盘 - 一次序列化升级,如何影响全球边缘网络?
前端·科技·react.js
春日见4 小时前
ubuntu以前可以联网,突然无法上网了
linux·服务器·ubuntu·debug
HIT_Weston4 小时前
62、【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(六)
前端·ubuntu·gitlab
ID_180079054735 小时前
淘宝关键词搜索 API 系列 数据返回参考(附解析与实战)
java·服务器·前端
Hao_Harrision5 小时前
50天50个小项目 (React19 + Tailwindcss V4) ✨| BackgroundSlider(背景滑块)
前端·typescript·react·vite7·tailwildcss
蟑螂恶霸5 小时前
ubuntu 20.04 移除旧版systemback, 安装新版1.8.5, 支持大型ISO镜像
linux·服务器·ubuntu
JPX-NO5 小时前
ubuntu编译安装FreeRDP Version 3.x.x 版本
linux·ubuntu
weixin_307779135 小时前
Jenkins Font Awesome API插件:现代化插件界面的图标引擎
开发语言·前端·自动化·jenkins