为什么我无法从网络外部通过 ssh 访问公司服务器,而该服务器显然可以通过 git/apt 等访问互联网?

为什么我无法从网络外部通过 ssh 访问公司服务器,而该服务器显然可以通过 git/apt 等访问互联网?

我使用一家小型公司网络内的 Linux(ubuntu)服务器进行常规自动数据处理、托管 mongodb 服务器,并且还尝试运行 dash app 网络服务器。

由于各种原因,我希望该服务器能够与外界通信:

  • 设置 jupyter 内核,以便小团队可以通过 ssh 隧道进行开发
  • 通过 pymongo/ssh 访问 mongodb 服务器
  • 连接网络托管服务/数据库

现在我的 IT 部门说这只能通过 VPN 实现,只能安装在 IT 部门管理的硬件上。他们解释得不太清楚,而且我没有足够的经验来自己设置,所以我的问题是:

  • 如果相关服务器显然能够与外界通信(git clone、apt-get 都可以正常工作),为什么我需要为 ssh 使用 VPN?我对 VPN 或网络了解不多,所以我不明白为什么有些服务需要 VPN,而其他服务不需要?
  • 我该怎么做才能找到可能的解决方法或在服务器上测试为什么 ssh 无法正常工作?我有 sudo 权限。

答案1

当相关服务器显然能够与外界通信(git clone,apt-get 都可以正常工作)时,为什么我需要用于 ssh 的 VPN?

服务器能够与外界通信 - 但这并不意味着外界能够与服务器通信。由于各种形式的 NAT,这种情况在商业世界之外也很常见。在您的情况下,这也可能是故意设置的防火墙。通信必须从网络内部发起。

你为什么要这么做?简而言之:因为组织内部的人是值得信赖的和/或在某种程度上是可控制的,以限制攻击面,而外部人则不然。

VPN 可让您连接到内部人员的网络,并确保您确实有权连接。仅在公司发行的硬件上才可以使用 VPN,这是“值得信赖且可控制”的一部分。

我该怎么做才能找到可能的解决方法或在服务器上测试为什么 ssh 无法正常工作?我有 sudo 权限。

它被称为“影子IT”你不应该这么做。正如你承认的那样,你没有足够的经验来理解为什么事情会这样安排。这意味着你没有足够的知识来理解什么时候可以安全地绕过它们。没关系,你不必成为所有事情的专家。与专家合作,而不是与他们作对。

答案2

如果相关服务器显然能够与外界通信(git clone、apt-get 都可以正常工作),为什么我需要为 ssh 使用 VPN?我对 VPN 或网络了解不多,所以我不明白为什么有些服务需要 VPN,而其他服务不需要?

您的计算机可以访问其他站点,但其他站点无法访问您的计算机,这两个原因大致相同。

  1. 服务器可能没有“全局”或“公共”IP 地址(就像您的家用 PC 通常没有 IP 地址一样)。如果服务器只有“私有”地址,您实际上无法通过 Internet 向该服务器发送数据包 - 只有公司自己的网络知道该地址的去向,而您的 ISP 不知道。(这就像您尝试通过仅指定门牌号而不是街道、城市或州来运送物品。)

    但连接到公司的 VPN 基本上会让你之内公司的网络;VPN 连接确保发送到服务器私有地址的所有数据包都通过公司的 VPN 网关,该网关知道将它们转发到何处。

    服务器(或你的 PC)仍然可以出站连接,因为网络的外部网关设置为将所有私有地址转换为属于网关的公共地址之一,因此入站回复数据包将通过 Internet 正确地传送到同一个网关(然后将它们转换回服务器的内部地址)。

    (虽然服务器通常有自己的公共 IP 地址,如果它们意味着为了公开访问,同样常见的是使用私有地址来访问受限的服务器。公共 IPv4 地址很少;大型公司可能只有 32 个、128 个或 512 个,小型公司可能只有一个。)

  2. 服务器可能会有一个防火墙(数据包过滤器)配置,或放置在专用防火墙后面。即使服务器有一个可以通过公共互联网访问的公共地址,它仍然可以随意丢弃它不想要的任何数据包——考虑到当今互联网的现状,许多企业网络故意阻止全部除少数特定类型之外的入站连接。

    例如,只要你允许标准端口 22 上的入站 SSH 连接,你就会开始收到数百甚至数千每天的恶意连接尝试次数。即使服务器设置安全,这些连接也会淹没系统日志,有时甚至会达到“并发连接”安全限制,从而阻止合法客户端登录。因此,您要么设置一个系统来自动阻止恶意客户端,要么决定阻止所有外部连接。

    在大多数情况下,服务器仍然可以进行出站连接,因为防火墙有状态的– 它跟踪每个建立的连接并自动允许回复数据包返回如果它们对应于已知的活动连接(IP 地址匹配、TCP 端口匹配等)。

  3. 上述所有的。

我该怎么做才能找到可能的解决方法或在服务器上测试为什么 ssh 无法正常工作?我有 sudo 权限。

在这种情况下,我唯一推荐的解决方法是“使用 VPN”。还有其他方法,包括建立到其他地方的长期出站连接并通过隧道返回,但您的 IT 团队可能非常不喜欢它们。

对于原因 #1(没有公共地址),只需查看您要连接的服务器地址 - 检查它是否在为私有地址保留的四个特定范围内。(还要检查通过ip addrSSH 连接到服务器时是否显示相同的地址。)

对于原因 #2A(系统级防火墙),请查看服务器上的 iptables 和 nftables 规则集。Ubuntu 可能使用 来管理它们ufw,而“原始”命令将是iptables-savenft list ruleset

对于原因 #2B(网络级防火墙),请检查您是否可以在服务器上安装数据包捕获工具 - tcpdump 或 termshark - 并要求其显示来自例如您的家庭 IP 地址的数据包。(您也可以在自己的 PC 上安装相同的工具以便进行比较;Wireshark 的 GUI 版本适用于每个操作系统。)

如果您尝试从家里连接到该服务器,但相应的 TCP 数据包没有显示在数据包捕获中然后它们在途中的某个地方被防火墙阻止了。

答案3

当您从公司网络外部连接时,您使用公司的公共 IP 地址。此地址实际上是位于本地网络和互联网之间的路由器的地址。

因此,通过此互联网地址使用 SSH,您实际上是连接到公司的路由器,而不是您自己的计算机。

要将您的计算机暴露给互联网,路由器必须知道客户端与 SSH 服务器的任何外部连接都是针对您的计算机的。这称为 转发端口

您应该咨询您的网络管理员,要求他们为您的计算机设置 SSH 连接的端口转发。这涉及一些安全考虑,因为连接到互联网的计算机很可能受到黑客的攻击,因此您应该咨询知识渊博的人。

相关内容