赵泠 2026-02-27 14:45 采纳率: 98.8%
浏览 11
已采纳

Gogs SSH连接失败:端口未开放或SSH服务未启动

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.gitssh -T git@your-domain.com 时,终端抛出 ssh: connect to host your-domain.com port 22: Connection refused —— 这是典型的“连接未建立”错误,而非认证失败或权限拒绝。关键在于:该错误由 TCP 层触发,意味着客户端根本未收到服务端 SYN-ACK 响应。大量运维人员第一反应是检查 Gogs 的 app.iniSSH_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]

    三、验证层:四阶连贯性诊断流程

    1. 宿主机 SSH 服务状态systemctl is-active sshd(非仅 status,需确认 active (running));若为 inactive,执行 sudo systemctl enable --now sshd
    2. sshd 监听配置校验:检查 /etc/ssh/sshd_config
      • Port 22(或与 Gogs SSH_PORT 严格一致)
      • ListenAddress 0.0.0.0 或明确绑定公网 IP(禁用 ListenAddress 127.0.0.1
      • PermitEmptyPasswords no + AllowUsers git(最小权限原则)
    3. 网络可达性穿透测试
      # 本地验证(宿主机内)
      telnet 127.0.0.1 22
      # 远程验证(从办公网络)
      nc -zv your-domain.com 22
      # 若超时而非 Connection refused → 防火墙/安全组拦截
    4. 容器化部署特例检查: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 内核iptablessudo iptables -L INPUT -n | grep :22sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
    发行版抽象ufwsudo 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' 将暴露真实占用者。此时必须调整 Gogs SSH_PORT 并同步更新 sshd_config,而非强行 kill 进程——这违反最小变更原则。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月28日
  • 创建了问题 2月27日