如何实现特定用户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
相关产品推荐
相关产品推荐

