Gogs SSH连接失败(如`ssh: connect to host xxx port 22: Connection refused`)最常见的原因之一是:**Gogs 配置的 SSH 端口未实际开放,或系统级 SSH 服务未启用/监听指定端口**。需注意——Gogs 本身不运行 SSH 守护进程,它依赖宿主机的 OpenSSH(sshd)提供 Git over SSH 支持。若管理员误以为 Gogs 自带 SSH 服务,可能忽略以下关键检查项:① `sshd` 是否已启动(`systemctl status sshd`);② `sshd_config` 中 `Port` 和 `ListenAddress` 是否匹配 Gogs 的 `SSH_PORT` 配置(默认22);③ 防火墙(ufw/iptables/firewalld)是否放行该端口;④ 云服务器安全组是否同步开放。此外,若 Gogs 运行在 Docker 中且未正确映射 SSH 端口(如 `-p 22:22` 缺失或冲突),也会导致连接被拒。排查时应优先验证 `telnet your-host 22` 是否可达,而非直接归因于 Gogs 配置。
1条回答 默认 最新
风扇爱好者 2026-02-27 14:46关注```html一、现象层:连接被拒的表象与误判陷阱
当执行
git clone ssh://git@your-domain.com:22/myrepo.git或ssh -T git@your-domain.com时,终端抛出ssh: connect to host your-domain.com port 22: Connection refused—— 这是典型的“连接未建立”错误,而非认证失败或权限拒绝。关键在于:该错误由 TCP 层触发,意味着客户端根本未收到服务端 SYN-ACK 响应。大量运维人员第一反应是检查 Gogs 的app.ini中SSH_PORT = 22是否配置正确,却忽略了一个根本事实:Gogs 是纯 Go Web 应用,不内置 SSH 守护进程,它完全依赖宿主机的sshd提供 Git over SSH 的底层通道。二、架构层:Gogs SSH 通信的真实链路图谱
graph LR A[Git Client] -->|TCP SYN to :22| B[Host OS Network Stack] B --> C{Is port 22 bound?} C -->|Yes| D[OpenSSH sshd daemon] C -->|No| E[Connection Refused] D -->|Auth & Command Dispatch| F[Gogs via git-shell or custom hook] F --> G[Repository I/O]三、验证层:四阶连贯性诊断流程
- 宿主机 SSH 服务状态:
systemctl is-active sshd(非仅status,需确认 active (running));若为inactive,执行sudo systemctl enable --now sshd - sshd 监听配置校验:检查
/etc/ssh/sshd_config:Port 22(或与 GogsSSH_PORT严格一致)ListenAddress 0.0.0.0或明确绑定公网 IP(禁用ListenAddress 127.0.0.1)PermitEmptyPasswords no+AllowUsers git(最小权限原则)
- 网络可达性穿透测试:
# 本地验证(宿主机内) telnet 127.0.0.1 22 # 远程验证(从办公网络) nc -zv your-domain.com 22 # 若超时而非 Connection refused → 防火墙/安全组拦截 - 容器化部署特例检查:Docker 启动命令必须显式映射 SSH 端口且避免冲突:
docker run -d \ --name gogs \ -p 3000:3000 \ -p 22:22 \ # ⚠️ 必须存在!缺则容器内 sshd 不可达 -v /var/gogs:/data \ -v /etc/ssh:/etc/ssh \ # 共享宿主 sshd 密钥(推荐)或自建 keypair gogs/gogs
四、纵深防御:防火墙与云平台协同策略
层级 工具 关键命令/操作 验证方式 OS 内核 iptables sudo iptables -L INPUT -n | grep :22sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT发行版抽象 ufw sudo ufw status verbosesudo ufw allow OpenSSH云平台 AWS Security Group 入站规则:TCP/22,源 IP 限定(如 203.0.113.0/24) 使用 AWS EC2 Instance Connect 测试 SSH 连通性 五、进阶陷阱:SELinux、端口冲突与用户上下文
在 RHEL/CentOS 8+ 环境中,即使
```sshd正常运行,setsebool -P ssh_sysadm_login on可能影响 git 用户登录;同时需确认git用户 shell 为/bin/bash或/usr/bin/git-shell(Gogs 推荐),且/home/git/.ssh/authorized_keys权限为600;若宿主机已运行其他服务(如 Jenkins SSH 插件)占用 22 端口,sudo ss -tulpn | grep ':22'将暴露真实占用者。此时必须调整 GogsSSH_PORT并同步更新sshd_config,而非强行 kill 进程——这违反最小变更原则。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 宿主机 SSH 服务状态: