是否可以限制哪些主机可通过 SSH 隧道访问?

是否可以限制哪些主机可通过 SSH 隧道访问?

我有一个运行 ssh 服务器和 web 服务器的盒子。

  • 我想防止拥有 ssh 帐户的人可以使用此盒子作为 Internet 其余部分的匿名代理(例如,通过创建隧道并将其用作 SOCKS 代理)。
  • 我想允许拥有 ssh 帐户的人可以使用此框作为代理来访问本地网络服务器。

例如:

  1. 打开隧道:ssh -D1234 myhost.com
  2. 配置浏览器使用 localhost:1234 作为代理
  3. 通过此代理访问myhost.com应该可以
  4. 通过此代理访问任何其他主机都会失败

我认为可以通过简单地关闭传出端口 80 来粗略地实现这一点,但这 (a) 不会阻止人们通过隧道传输非 Web 流量,并且 (b) 阻止任何用户访问网站。是否有更精细的方式来做到这一点,理想情况下是通过限制 sshd 同意通过隧道传输的内容,这可能吗?

答案1

您可以使用 sshd_config 文件中的 PermitOpen 选项限制可通过隧道访问的主机。

PermitOpen <TheIPYourWebServerListensOn>:80

如果你使用localhostas,TheIPYourWebServerListensOn你可能需要指示你的代理客户端使用它,即使对于发往 的请求也是如此localhost。这可能会令人困惑。

另外,请记住,通过 SOCKS5,DNS 解析发生/可以发生在代理端,这允许非常方便的设置,例如在 hosts 文件中为服务器定义本地别名。

忘了说了,您可以添加多个主机:端口组合。您只需用空格将它们分开即可。sshd_config 手册页是此处的参考。希望这能有所帮助!

答案2

使用PermitOpensshd_config 您当然可以实现这种设置。

但是,请记住,如果您仍然允许用户通过 shell 登录,那么仅禁用端口转发实际上并不能提高安全性:他们可以直接从服务器访问互联网,甚至安装自己的转发器。无论如何,您必须信任您的 shell 用户。

如果你需要阻止用户直接访问某些端口范围甚至整个互联网(仅允许使用本地服务,例如发送和接收邮件),你可以使用iptables'扩展数据包匹配模块,确切地说是模块所有者,它允许根据所有者的 uid 或 gid 甚至进程名称过滤数据包。

相关内容