You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现特定用户SSH请求转发至内网服务器并区分管理员访问权限

刚好我之前折腾过几乎一模一样的场景,给你两个靠谱的解决方案——一个用OpenSSH本身就能搞定(不用额外装软件),另一个是用专门的SSH代理工具,都能完美匹配你的需求:

方案一:用OpenSSH服务器的Match配置实现(零额外软件)

你之前觉得sshd做不到,其实是没用到Match指令结合密钥转发的正确姿势,这个方案能同时满足普通用户自动转发和管理员shell登录的需求:

1. 配置普通Git用户的自动转发(含动态公钥同步)

首先编辑公网服务器的/etc/ssh/sshd_config,添加以下配置:

# 匹配所有用git用户连接的请求
Match User git
    # 强制转发到内网Git服务器,同时开启Agent转发传递客户端密钥
    ForceCommand ssh -o "ForwardAgent yes" git@你的内网Git服务器IP $SSH_ORIGINAL_COMMAND
    # 允许Agent转发(必须开,否则客户端密钥传不过去)
    AllowAgentForwarding yes
    # 禁用不必要的功能,提升安全性
    X11Forwarding no
    PermitTTY no
    # 动态从内网Git服务器获取授权公钥,不用手动维护公网的authorized_keys
    AuthorizedKeysCommand /usr/local/bin/fetch_git_authorized_keys.sh
    AuthorizedKeysCommandUser nobody

然后创建/usr/local/bin/fetch_git_authorized_keys.sh脚本,用来动态拉取内网Git服务器的授权公钥:

#!/bin/bash
# 注意:需要先把公网服务器git用户的公钥加到内网Git服务器git用户的authorized_keys里,实现无密码访问
ssh git@你的内网Git服务器IP "cat ~/.ssh/authorized_keys"

给脚本加执行权限:

sudo chmod +x /usr/local/bin/fetch_git_authorized_keys.sh

2. 配置管理员用户的Shell访问

同样在/etc/ssh/sshd_config里添加管理员用户的匹配规则(比如用root或者专门的admin用户):

# 匹配管理员用户(这里用root为例,你可以换成自己的管理员账号)
Match User root
    # 允许获取交互式shell
    PermitTTY yes
    # 保留Agent转发权限(可选)
    AllowAgentForwarding yes
    # 不强制指定命令,默认进入shell
    ForceCommand no

最后重启sshd服务生效:

sudo systemctl restart sshd

使用说明:

  • 普通Git用户只需要在本地执行ssh-add ~/.ssh/他们的身份密钥(把密钥加到SSH Agent),然后正常用Git命令比如git clone git@公网服务器地址:仓库名.git,请求会自动转发到内网Git服务器,内网服务器会用客户端的密钥做验证。
  • 管理员直接用ssh root@公网服务器地址就能登录获取shell,完全不受普通用户规则的影响。

方案二:用专用SSH代理工具Teleport(更适合多服务场景)

如果你的场景后续可能扩展更多内网服务,Teleport这个开源工具会更省心,它专门做SSH访问管理和代理,配置更直观:

1. 在公网服务器安装Teleport

curl https://goteleport.com/install.sh | bash

2. 初始化Teleport集群(公网服务器作为代理和认证节点)

sudo teleport start --roles=proxy,auth --cluster-name=your-cluster-name

3. 把内网Git服务器加入集群

在公网服务器上执行生成节点加入命令:

tctl nodes add --roles=node --ttl=24h --labels=service=git

复制生成的命令到内网Git服务器上执行,完成节点注册。

4. 配置访问规则

创建一个规则文件access-rules.yaml:

kind: role
version: v6
metadata:
  name: git-users
spec:
  allow:
    logins: [git]
    node_labels:
      service: git
    commands:
      - "git-*"  # 只允许执行Git相关命令
  deny:
    logins: [root, admin]
---
kind: role
version: v6
metadata:
  name: admins
spec:
  allow:
    logins: [root]
    node_labels:
      "*": "*"
    shell: true  # 允许交互式shell

导入规则:

tctl create -f access-rules.yaml

5. 给用户分配角色

给普通Git用户授权:

tctl users add git-user --roles=git-users

给管理员授权:

tctl users add admin-user --roles=admins

使用说明:

  • 普通用户用tsh ssh git@公网服务器地址或者直接用Git命令(Teleport支持Git协议转发),就能自动连接到内网Git服务器,无需额外配置。
  • 管理员用tsh ssh root@公网服务器地址就能直接获取shell。

内容的提问来源于stack exchange,提问作者notgapriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 12:27:41