有没有可能将通过特定端口进入的ssh请求转发到另一台机器?

6

我有一个小型本地网络,只有一台机器可以通过外网访问(这个不容易改变)。我想设置SSH请求,使不通过标准端口进入的请求转向另一台机器。这是可能的吗?如果可以,如何实现?

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

6个回答

12

另一种方法是使用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手册说:**只有超级用户才能转发特权端口。**

看起来不需要超级用户权限,只要被转发的端口(在此例中为8022)不是特权端口(如22),就可以进行转发了。感谢Mike Stone的澄清。


1
我一直在尝试弄清楚如何做到这一点,最终找到了答案!我希望我能多次点击上箭头! - David Jones

4

@Mark Biek

我本来也想这么说,但你比我先说了!无论如何,我只想补充一下还有一个选项:-R:

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

区别在于你连接/从哪台机器连接。我的老板不久前向我展示了这个技巧,非常好用...我们被防火墙隔离开来,需要给一台机器提供外部访问权限...他通过ssh -R到另一台可访问的机器来绕过它...然后将对那台机器的连接转发到防火墙后面的机器上,因此你需要根据你所在的机器和你要ssh的机器使用-R或-L。
此外,只要你转发的端口(在本例中为8022端口)不低于受限范围(我认为是1024,但我可能错了),就可以使用普通用户,因为那些是“保留”端口。这并不重要,因为该端口没有被打开(该机器只是通过隧道接收流量,对隧道毫无知觉),而8022端口已经被打开,因此受到了限制。
编辑:请记住,只要初始ssh保持打开状态,隧道才会保持打开状态,因此如果超时或退出,隧道将关闭。

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 请注意,“内部”和“外部”机器不必在同一个局域网上。您可以通过这种方式进行端口转发,直到全球范围内。
强制先登录到外部机器。这是真正的“转发”,而不是“代理”;但基本思路是这样的:您强制人们先登录到外部机器(以便您控制谁可以何时登录,并获得活动日志),然后他们可以通过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技巧的演讲中得出的。你可以查看我的幻灯片,但我建议使用文本版本,因为S5幻灯片有点问题。查看名为“Forward Anything: Simple Port Forwarding”的部分以获取信息。还有有关使用OpenSSH创建SOCKS5代理的信息。是的,你可以这样做。OpenSSH就是这么强大。
(最后,如果你需要频繁进入内部网络,请考虑设置VPN。听起来很吓人,但OpenVPN非常简单,并且适用于所有操作系统。我认为仅为SSH而设置VPN有点过度了;但是一旦你开始通过端口转发进行VNC、HTTP或其他操作,或者你需要担心许多内部主机,那么它会更简单、更易于维护。)

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

您可以通过以下方式打开到 'gateway' 的ssh连接:

ssh gateway

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

0

0
在Ubuntu中,您可以安装Firestarter,然后使用其Forward Service功能将来自具有外部访问权限的计算机上的非标准端口的SSH流量转发到网络内部计算机上的22号端口。
在OS X上,您可以编辑/etc/nat/natd.plist文件以启用端口转发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接