5

我有一个小型本地网络。只有一台机器可供外界使用(这不容易改变)。我希望能够对其进行设置,以便标准端口上没有的 ssh 请求转到另一台机器。这可能吗?如果是这样,怎么做?

哦,所有这些机器都在运行 Ubuntu 或 OS X。

4

6 回答 6

11

另一种方法是使用 ssh 隧道(发生在客户端)。

你会像这样执行 ssh 命令:

ssh -L 8022:myinsideserver:22 paul@myoutsideserver

它将您连接到可从外部访问的机器(myoutsideserver),并通过该 ssh 连接创建一个隧道,该隧道连接到服务器上只能从内部访问的端口 22(标准 ssh 端口)。

然后你会做另一个像这样的 ssh 命令(让第一个仍然连接):

ssh -p 8022 paul@localhost

然后,与本地主机上的端口 8022 的连接将通过第一个 ssh 连接建立隧道,将您带到 myinsideserver。

您可能需要在 myoutsideserver 上执行一些操作以允许转发 ssh 端口。我现在正在仔细检查。

编辑

嗯。ssh 手册页这样说:**只有超级用户才能转发特权端口。**

这对我来说意味着第一个 ssh 连接必须以 root 身份。也许其他人可以澄清这一点。

只要转发端口(在本例中为 8022)不是特权端口(如 22),似乎不需要超级用户权限。感谢迈克·斯通的澄清。

于 2008-09-05T04:40:18.740 回答
4

(在本例中,我假设端口 2222 将转到您的内部主机。$externalip 和 $internalip 分别是可见机器和内部机器的 IP 地址或主机名。)

您有几个选项,具体取决于您希望代理的持久性:

  • 某种 TCP 代理。在 Linux 上,基本思想是在处理传入数据包之前,您要更改其目的地——即预路由目的地 NAT:

    iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport 1024:65535 -j DNAT --to $internalip:22

  • 使用 SSH 建立临时端口转发。从这里开始,您又有两个选择:

    • 透明代理,客户端认为你的可见主机(在端口 2222 上)只是一个普通的 SSH 服务器,并没有意识到它正在通过。虽然您失去了一些细粒度的控制,但您获得了便利(特别是如果您想使用 SSH 将 VNC 或 X11 一直转发到内部主机)。

      • 从内部机器:ssh -g -R 2222:localhost:22 $externalip
      • 然后来自外界:ssh -p 2222 $externalip

      请注意,“内部”和“外部”机器不必在同一个 LAN 上。您可以通过这种方式在世界各地进行端口转发。

    • 首先强制登录到外部机器。这是真正的“转发”,而不是“代理”;但基本思想是这样的:你强制人们登录到外部机器(这样你就可以控制谁可以登录以及何时登录,并且你可以获得活动日志),然后他们可以从那里通过 SSH 连接到内部。这听起来很麻烦,但是如果您在外部机器上使用内部主机的名称设置简单的 shell 脚本,再加上无密码的 SSH 密钥对,那么用户登录非常简单。所以:

      • 在外部机器上,您制作了一个简单的脚本,/usr/local/bin/internalhost它只是运行ssh $internalip
      • 从外部世界,用户这样做:ssh $externalip internalhost一旦他们登录到第一台机器,他们就会立即转发到内部机器。

      这种方法的另一个优点是人们不会遇到密钥管理问题,因为在一个 IP 地址上运行两个 SSH 服务会使 SSH 客户端生气。

仅供参考,如果您想通过 SSH 连接到服务器并且不想担心密钥,请执行此操作

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

我的 shell 中有一个名为“nossh”的别名,所以我可以这样做nossh somehost,它会忽略所有关键错误。只需了解您在执行此操作时忽略了安全信息,因此存在理论上的风险。

这些信息大部分来自我在 Barcamp Bangkok 的一次关于花哨的 SSH 技巧的演讲。你可以看到我的幻灯片,但我推荐文本版本,因为 S5 的幻灯片有点错误。查看名为“转发任何东西:简单端口转发”的部分以获取信息。还有关于使用 OpenSSH 创建 SOCKS5 代理的信息。是的,你可以这么做。OpenSSH 就是这么棒。

(最后,如果您要大量穿越内部网络,请考虑设置 VPN。这听起来很吓人,但 OpenVPN 非常简单,并且可以在所有操作系统上运行。我会说这对于 SSH 来说太过分了;但是一旦您开始通过您的端口转发进行端口转发以使 VNC、HTTP 或其他事情发生;或者如果您有很多内部主机要担心,它可以更简单且更易于维护。)

于 2008-09-05T05:33:22.873 回答
3

@Mark Biek

我正要这么说,但你打败了我!无论如何,我只是想补充一点,还有 -R 选项:

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

不同之处在于您连接到/从哪台机器。我的老板不久前向我展示了这个技巧,知道这绝对是真的很高兴......我们在防火墙后面,需要对一台机器进行外部访问......他通过 ssh -R 绕过它到另一台机器那是可以访问的......然后与该机器的连接被转发到防火墙后面的机器中,因此您需要根据您所在的机器以及您正在使用的机器使用 -R 或 -L 。

另外,我很确定您可以使用普通用户,只要您要转发的端口(在本例中为 8022 端口)不低于限制范围(我认为是 1024,但我可能弄错了) ,因为这些是“保留”端口。将它转发到“受限”端口并不重要,因为该端口没有被打开(机器只是通过隧道将流量发送到它,它不知道隧道),8022 端口是是开放的,因此受到限制。

编辑:请记住,只要初始 ssh 保持打开状态,隧道才会打开,因此如果超时或退出,隧道将关闭。

于 2008-09-05T05:10:58.230 回答
0

您可以使用端口转发来执行此操作。看看这里:

http://portforward.com/help/portforwarding.htm

此页面上有关于如何设置路由器以端口转发请求的说明:

http://www.portforward.com/english/routers/port_forwarding/routerindex.htm

于 2008-09-05T04:32:19.493 回答
0

在 Ubuntu 中,您可以安装Firestarter,然后使用它的转发服务功能从您机器上的非标准端口转发 SSH 流量,并从外部访问您网络内机器上的端口 22。

在 OS X 上,您可以编辑/etc/nat/natd.plist文件以启用端口转发。

于 2008-09-05T05:57:41.130 回答
0

在不乱用防火墙规则的情况下,您可以设置一个 ~/.ssh/config 文件。

假设 10.1.1.1 是“网关”系统,10.1.1.2 是“客户端”系统。

Host gateway
  Hostname 10.1.1.1 
  LocalForward 8022 10.1.1.2:22 

Host client
  Hostname localhost
  Port 8022

您可以通过以下方式打开到“网关”的 ssh 连接:

ssh gateway

在另一个终端中,打开与客户端的连接。

ssh client
于 2008-09-16T18:39:51.140 回答