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

相关推荐
0思必得02 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5162 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
a41324474 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
layman05284 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔5 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李5 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN5 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒5 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库5 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css