因此,一段时间以来,我一直在使用 SSH 隧道来限制对内部站点或部分公共站点的访问,而且由于只有管理员才有 SSH 访问权限,因此我一直在使用标准的非 root/sudo 用户帐户。现在,我正在扩展并试图让我当地大学的学生参与扩展他们的项目,他们将需要开始访问其中一些内部页面。
代理服务器是 CentOS 6.4 机箱,启用了 SELinux,除了代理之外不会运行任何其他服务。我希望最终设置一个完整的 VPN,但在这种情况下,它只是允许使用 IP 白名单访问某些机器,而不是完全的内部网络访问。
我已经研究过所有设置 SOCKS 代理的方法,用户账户中有 /bin/false 等内容,但
A)他们假设只有一个端口或主机被转发(而在这种情况下,我有一组 VPS 实例,它们将根据网络配置的需求而改变),或者
B) 使用常规 SSH 客户端而不是 PuTTY 之类的客户端(尽管我很想强迫所有学生使用 VM 或直接安装 Linux,但这不是一个选择,因为学校在其工程硬件上使用 PuTTY 供学生使用)。
这是我目前发现的:如果使用常规 ssh 客户端,我可以将用户 shell 设置为 /bin/false,并且用户可以在设置 SOCKS 代理时指定 -N 命令,但不幸的是对于 PuTTY 用户来说,这似乎不起作用(至少我无法让它工作)。
当 PuTTY 通过默认隧道选项打开隧道时,它必须打开一个 shell,该 shell 在登录时会立即断开连接,因为用户有一个 /bin/false shell。如果我在 SSH 设置中指定“无 shell 或命令”参数,代理选项似乎无法设置。如果我尝试在远程命令的 SSH 选项中设置代理,除非我在选项中允许使用 shell 或其他命令,否则它仍然无法运行。
我找到了相关问题但不太合适:
使用 PuTTY 和 nologin 创建 SOCKS 隧道 (这个在技术上是可行的,但是 shell 只是一个运行很长时间的睡眠命令,我担心它会被逃脱。我宁愿有一个真正的 noshell,而不是一个出于安全原因挂起的 shell)
https://askubuntu.com/questions/48129/how-to-create-a-restricted-ssh-user-for-port-forwarding (这不起作用,因为它要求用户使用真正的 ssh 安装,而像 PuTTY 这样的程序将不起作用)。我还需要他们能够访问网页,尽管我认为我可以简单地为帐户指定 PermitTunnel,而不是仅允许特定端口。
ssh 代理用户的“noshell” (由于我上面提到的原因,这个方法不适用于 PuTTY,因为 PuTTY 需要启用命令来设置 SOCKS 代理)
有什么建议吗?我可能很容易遗漏了一些东西,但我不确定。
-吉姆
答案1
我找到了一个解决方案(在一篇这样的帖子下,没有使用像 nologin 或 noshell 这样的标签,而是使用了一个针对 Windows 用户的非常简单的技巧,但我让它在没有 shell 的情况下为我工作)。
我使用此帖子的答案创建了一个批处理脚本,该脚本可以运行 PuTTY 的默认安装并设置隧道,而无需执行会导致 shell 断开连接的命令:
"C:\Program Files (x86)\PuTTY\plink.exe" -v -N -D localhost:8080 proxy@remote_host
由于这使得使用 PuTTY 的 Windows 用户现在可以访问隧道,因此我可以继续使用帐户 shell 作为 /bin/false
发在这里是为了任何可能遇到类似情况的人解决这个帖子。如果有其他解决方案,我很乐意听听!
现在我只需要尝试使用我在所有系统上实施的基于 SSH 推送的双因素系统来实现这一点,但这是在其他一切正常后才需要进行的工作。
-吉姆
答案2
刚刚看到PuTTY有以下选项,它可能就是您正在寻找的: 连接->SSH->不启动 shell 或命令
如果启用,则建立连接,控制台上不再显示,但它保持活动状态并且隧道工作正常。希望有帮助。