是否可以将通过某个端口进入的ssh请求转发到另一台机器?

时间:2008-09-05 04:30:20

标签: macos ubuntu ssh port

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

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

6 个答案:

答案 0 :(得分: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 manpage说:**只有超级用户才能转发特权端口。 **

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

只要转发端口 (在本例中为8022) 不是特权端口(如22),就不需要超级用户权限。感谢您澄清Mike Stone

答案 1 :(得分:4)

(在这个例子中,我假设端口2222将转到你的内部主机。$ externalip和$ internalip分别是可见内核和内部机器的ip地址或主机名。)

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

  • 某种TCP代理。在Linux上,基本思想是处理传入数据包之前,你想要更改其目的地 -i.e。预先路由目的地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所做的关于花哨的SSH技巧的演讲。您可以看到my slides,但我推荐text version,因为S5幻灯片有点儿错误。有关信息,请查看“转发任何内容:简单端口转发”一节。还有关于使用OpenSSH创建SOCKS5代理的信息。是的,你可以这样做。 OpenSSH很棒。

(最后,如果你正在进行大量的内部网络遍历,请考虑设置一个VPN。这听起来很可怕,但OpenVPN非常简单,可以在所有操作系统上运行。我会说这对于SSH来说太过分了;但是一旦你通过你的port-forwards开始端口转发以获得VNC,HTTP或其他东西;或者如果你有许多内部主机需要担心,它可以更简单,更易于维护。)

答案 2 :(得分:3)

@Mark Biek

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

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

不同之处在于您连接到/从哪台机器。不久前,我的老板向我展示了这个技巧,知道这一点真是太好了......我们在防火墙后面,需要外部访问机器...他通过ssh -R到达另一台机器那是可以访问的...然后连接到该机器被转发到防火墙后面的机器,所以你需要根据你所在的机器和你正在使用的机器使用-R或-L。

此外,我很确定你使用普通用户是好的,只要你转发的端口(在这种情况下是8022端口)不低于限制范围(我认为是1024,但我可以被误认为,因为那些是“保留”的端口。您将它转发到“受限”端口并不重要,因为该端口未被打开(机器只是通过隧道向其发送流量,它不知道隧道),8022端口IS是开放的,因此受到限制。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分: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