我们有两台服务器在同一局域网内,一台安装有gitlab,Ip为10.x.x.x,另一台我们安装了宝塔,配置了nginx,我们配置好了web的反代,但是gitlab的ssh端口,30022,要如何反代呢?
配置nginx.conf反代
打开 Nginx 主配置文件(通常位于 /www/server/panel/vhost/nginx/nginx.conf,不使用宝塔的找一下nginx.conf的位置修改一下也是一样的效果),在 http 块外添加以下内容,如果有stream,直接配置在里面即可,注意不要使用宝塔-安全里的端口映射,配置了也没有效果:
stream { server { listen 30022; proxy_pass 10.x.x.x:30022; proxy_connect_timeout 300s; proxy_timeout 300s; } }
- 重启nginx
🔍 确认一下配置生效
1. 确认域名解析正确性
dig +short git.xxx.com
# 或
nslookup git.xxx.com
- 确保返回的 IP 是 反向代理服务器(宝塔服务器)的公网 IP,而非 GitLab 内网 IP
10.x.x.x
。 - 如果解析到内网 IP 或错误 IP,需修改 DNS 的 A 记录。
2. 检查反向代理服务器的端口监听
在宝塔服务器执行:
ss -tulnp | grep 30022
# 或
netstat -tulnp | grep 30022
预期应看到 nginx
进程监听 30022
端口:
tcp LISTEN 0 4096 0.0.0.0:30022 0.0.0.0:* users:(("nginx",pid=xxx,fd=xxx))
- 如果无输出,说明 Nginx 未正确监听端口,需检查配置加载。
- 如果端口被其他进程占用(如 SSH 服务),需停止冲突服务或修改代理端口。
3. 验证反向代理服务器的防火墙
- 服务器防火墙:
# 查看防火墙规则(CentOS)
firewall-cmd --list-ports
# 或 Ubuntu
ufw status
确保 30022/tcp
已放行。
- 云服务商安全组(阿里云、腾讯云等):
- 登录云控制台,检查宝塔服务器的安全组规则,确保入方向允许 30022
端口。
4. 检查 Nginx 配置加载
- 确认
stream
块配置在nginx.conf
的全局层(不在http
块内)。 - 检查是否有其他配置文件覆盖端口:
grep -r "listen 30022" /www/server/panel/vhost/nginx/
- 重新加载 Nginx:
nginx -t && nginx -s reload
5. 分析 Nginx 的 TCP 日志
检查配置的 TCP 日志文件:
tail -f /www/wwwlogs/tcp-{access,error}.log
- 当尝试通过
git.xxx.com:30022
连接时,观察日志是否有:
- 连接记录(access.log
中的 $upstream_addr
是否指向 10.x.x.x:30022
)。
- 错误信息(如连接超时、拒绝等)。
6. 测试从反向代理服务器到 GitLab 的连通性
在宝塔服务器执行:
telnet 10.x.x.x 30022
# 或
nc -zv 10.x.x.x 30022
- 如果失败,说明 GitLab 的 SSH 服务未正确运行或存在网络隔离。
7. 确认 GitLab 的 SSH 配置
在 GitLab 服务器检查:
# 查看 GitLab SSH 服务状态
gitlab-ctl status gitlab-sshd
# 检查端口监听
ss -tulnp | grep 30022
- 预期输出应显示
gitlab-sshd
监听0.0.0.0:30022
。 - 若服务未运行,重启 GitLab:
gitlab-ctl restart
⚠️ 常见问题解决
场景 1:Nginx 未监听 30022 端口
- 原因:
stream
配置未生效或端口冲突。 - 解决:
1. 停止占用端口的服务。
2. 在 Nginx 主配置中明确添加 stream
块(宝塔面板的"配置修改"直接编辑 nginx.conf
)。
3. 重启 Nginx。
场景 2:防火墙拦截
- 现象:宝塔服务器本地
telnet 127.0.0.1 30022
成功,但外部访问失败。 - 解决:检查云服务商安全组和服务器防火墙,确保
30022
对公网开放。
场景 3:GitLab 绑定地址错误
- 现象:GitLab 的 SSH 服务仅绑定在
127.0.0.1:30022
。 - 解决:修改
/etc/gitlab/gitlab.rb
:
gitlab_sshd['listen'] = '0.0.0.0'
gitlab_sshd['port'] = 30022
运行 gitlab-ctl reconfigure
并重启。
📝 最终验证命令
# 从外部机器测试 SSH 连接
ssh -p 30022 -v [email protected]
# 观察详细输出,定位握手失败环节
本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。