内网部署的 Gitlab 通过内网穿透映射到外网

场景描述

网络环境:GitLab 部署在内网,通过内网穿透(如 frp)映射到外网。
外网访问:https://gitlab.dev.example.com(不带端口)。
内网转发:穿透工具将流量转发至内网机器的 http://127.0.0.1:10022。

一、 Web 访问配置 (HTTPS)

目标:解决 HTTPS 域名访问内网 HTTP 端口导致的链接生成错误、登录重定向问题。

  1. 修改 GitLab 配置文件 /etc/gitlab/gitlab.rb
# 1. 设置外网显示的完整域名,协议必须为 https
external_url 'https://gitlab.dev.example.com'

# 2. 指定 GitLab 内部 Nginx 监听的内网物理端口
nginx['listen_port'] = 9600

# 3. 关键:虽然外部是 HTTPS,但内部穿透转发是 HTTP,所以关闭内部 SSL 监听
nginx['listen_https'] = false

# 4. 强制传递协议头,避免登录后跳转到 http 或重定向次数过多
nginx['proxy_set_headers'] = {
  "X-Forwarded-Proto" => "https",
  "X-Forwarded-Ssl" => "on"
}
  1. 生效配置
sudo gitlab-ctl reconfigure

二、 SSH 访问配置 (Git Clone)

问题排查:ssh -T 提示输入密码是因为请求打到了外网服务器自身的 22 端口,而非内网 GitLab。

  1. 内网穿透工具 (frp) 配置
    需要在 frp 客户端增加一个 TCP 协议转发,将外网某个端口(如 10022)映射到内网 GitLab 的 22 端口。
  2. 修改 GitLab 的 SSH 端口显示
    为了让 GitLab 网页端显示的克隆链接正确(带上穿透端口),修改 /etc/gitlab/gitlab.rb:
# 告知 GitLab 页面显示的 SSH 克隆地址使用 10022 端口
gitlab_rails['gitlab_shell_ssh_port'] = 10022

三、 核心知识点总结

external_url:不仅是访问地址,还决定了 GitLab 内部链接、邮件、克隆地址的生成格式。
listen_https = false:当外网穿透工具已处理了 SSL 证书并以 HTTP 方式转发给 GitLab 时,此项必须设为 false。
X-Forwarded-Proto:这是前后端协议一致性的“桥梁”,配置后可解决 HTTPS 环境下的登录失效和跳转错误。
SSH 穿透:Nginx 的 http 模块无法转发 SSH 流量。必须通过 frp 的 tcp 模式转发,或者使用 Nginx 的 stream 模块。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容