我使用 LXC 容器进行 ssh 托管,并希望将 SSH/SFTP 流量(使用端口 22)重定向到容器的私有 IP 地址,但基于用户/IP。也就是说 - 一个源端口,多个目的地。
- 远程控制[电子邮件保护]
- 我们有用户“ahes”,此用户容器的私有 IP 是 10.10.66.66
- 将流量重定向到 10.10.66.66:22
我无法为每个容器分配公共 IP 地址。
我想到的一些可能的解决方案:
简单方法 - 忘记全局端口 22,使用与特定用户匹配的端口。例如,ahes 的端口为 6666。然后使用简单的 iptables 规则重定向流量:server.com:6666 => 10.10.66.66:22。缺点是某些地方除 22/80/443 以外的端口会被阻止。
在父服务器上的 sshd 中使用 ForceCommand 指令:
Match Group 用户 ForceCommand /usr/local/bin/ssh.sh
ssh.sh脚本:
/bin/bash #!/bin/bash #...这里有一些逻辑来查找用户 IP 地址 # 运行 ssh exec ssh $USER@$IP $SSH_ORIGINAL_COMMAND
这个解决方案几乎很好,但是我没有找到让 sftp 使用此配置工作的方法。
另一个考虑因素是我无法深入研究协议,因为在发送任何可识别用户的数据之前都会进行加密。此外,我并没有破解 sshd 源代码的技能,出于安全原因,保留带有原始软件包的父服务器是非常可取的。
我还发现 libpam-nufw 包用于连接级别(iptables)的身份验证,但我认为它用于其他目的。
我将非常感激任何线索。谢谢。
答案1
设置一个在端口 443 上监听的 HTTP 代理,并在内部 LXC IP 上启用到端口 22 的转发连接。然后,在使用 ssh/sftp 客户端时,使用 ProxyConnect 选项与 netcat/socat/proxytunnel/whatever 结合使用。
另一个常见的解决方案是设置 SSH 网关(例如,同一台机器上的专用 LXC)。用户首先连接到那里,然后再连接到他们的 LXC 实例。