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

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

有帮助吗?

解决方案

另一种方法是使用 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)。感谢您的澄清 迈克·斯通.

其他提示

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

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

  • 某种 TCP 代理。在 Linux 上,基本思想是 传入的数据包已处理,您想要 改变其目的地-IE。预路由目标 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 连接到内部。这听起来像是一件苦差事,但如果你 使用内部主机的名称以及无密码 SSH 密钥对在外部计算机上设置简单的 shell 脚本 那么用户登录就非常简单了。所以:

      • 在外部机器上,您编写一个简单的脚本, /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 的幻灯片有点越野车。查看名为“转发任何内容:简单端口转发”的信息。还有有关使用 OpenSSH 创建 SOCKS5 代理的信息。是的,你可以这么做。OpenSSH 就是这么棒。

(最后,如果您要频繁地穿越内部网络,请考虑设置 VPN。听起来很可怕,但 OpenVPN 非常简单并且可以在所有操作系统上运行。我想说这对于 SSH 来说有点过分了;但是一旦您通过端口转发开始端口转发以获取 VNC、HTTP 或其他内容;或者如果您有很多内部主机需要担心,它可以更简单且更易于维护。)

@马克·比克

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

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

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

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

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

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

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

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

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

在Ubuntu中,您可以安装 点火器 然后使用它的 转发服务 功能可将 SSH 流量从计算机上的非标准端口转发到网络内部计算机上的端口 22。

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

无需搞乱防火墙规则,您可以设置 ~/.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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top