有没有办法强制 OpenSSH(或创建某种代理)仅通过他(或她)提供的用户名将一个用户转发到一台机器,将另一个用户转发到另一台机器?
我遇到了以下问题:我将在 Docker 容器中运行 GitLab,同时在主机上运行 SSH 服务器。GitLab 监听 SSH 连接,但它只对“git”用户通过 SSH 密钥区分客户端感兴趣。因此,我想要创建的设置是以下任一设置:
- 主机上端口 22 上的代理,当提供的用户是“git”时,将整个会话转发到 Docker Gitlab,当用户名不同时,转发到主机 SSH(可能监听另一个端口,重要的是客户端不知道这一点)。
- 主机 SSH 在内部处理除“git”之外的每个用户,并在用户名为“git”时将会话转发到 Docker 容器。
需要明确的是:Docker 容器运行一个网桥,可以通过不同于主机 IP 的唯一 IP 地址从主机访问它。
StackOverflow 上有一个类似的问题被问到(https://stackoverflow.com/questions/8505445/setup-ssh-server-to-forward-connections),但没有答案可以解决这个问题——最有帮助的是建议自定义 shell,但我发现没有办法创建这样的东西。
答案1
SSH TCP 端口隧道由 ssh 客户端配置。在服务器上,您只能使用permitopen=host:port
authorized_keys 来限制隧道配置。
重定向流量的另一种方法是使用带有-m owner --uid-owner $UID
DNAT 目标的 Netfilter/iptables。