快速 SSH 代理或路由?

快速 SSH 代理或路由?

我有使用 nginx 指令代理网站的经验proxy_pass。我可以用 SSH 做类似的事情吗?

这是我的家庭网络以及我的机器及其主机名:

         <the Internet>
               |
            [router]
               |
 [kenmore]---[park]---[chiswick]

我该如何配置park,以便每当它获得 SSH 连接时,它都会检查主机名并相应地连接到或kenmorechiswick我知道如何为 HTTP 服务,但不知道如何为 SSH 服务。

答案1

如果你有 root 权限@park,你可以使用 iptables - 重定向:

  • ssh -p 2201 user@park→ 重定向至 kenmore:22
  • ssh -p 2202 user@park→ 重定向至 chiswick:22

iptables -t nat -A PREROUTING -$PARK_IP -p tcp --dport 2201 -j DNAT --到目的地 kenmore:22
iptables -t nat -A PREROUTING -$PARK_IP -p tcp --dport 2202 -j DNAT --到目的地 chiswick:22
iptables -t nat -A POSTROUTING -j MASQUERADE

(如果有人有不带 NAT 的 iptables-snippet 我会感兴趣。)

答案2

如果你有 kenmore、park 和 chiswick 的用户访问权限,最简单的解决方案就是使用 SSH 密钥和命令〜/.ssh /授权密钥

为简单起见,我们假设三台机器上都有一个名为的用户ryan

在 park 上创建两个 SSH 密钥对:

$ ssh-keygen -C kenmore -f kenmore.rsa
$ ssh-keygen -C chiswick -f chiswick.rsa

kenmore.rsa.pub,在内容前加上前缀,如下所示:

command="ssh ryan@kenmore" ssh-rsa KEY_HERE

chiswick.rsa.pub,在内容前加上前缀,如下所示:

command="ssh ryan@chiswick" ssh-rsa KEY_HERE

将 kenmore.rsa.pub 和 chiswick.rsa.pub 的全部内容附加到〜/.ssh /授权密钥在单独的行上。

如果您现在使用任一密钥文件登录 park(kenmore.rsa或者chiswick.rsa)您将注意到提示输入密码 - 这应该是 kenmore 或 chiswick 的 SSH 提示,取决于您使用的密钥文件。

答案3

如果我正确理解了您的要求,我认为这是不可能的。

当你提供 HTTP 服务时,客户端会执行主机的 DNS 查找,并向该主机发送 HTTP 请求,该请求包括请求标头中的原始主机名(从客户端的角度来看)。当请求到达服务器时,服务器能够根据传入的 IP 地址和/或客户端对主机名的看法来决定如何处理该请求。

另一方面,使用 SSH,一旦完成 DNS 查找,就只使用 IP 地址,而客户端用来解析该 IP 的主机名永远不会被服务器看到。

您可能需要考虑的其他一些选择 -

  • 让多个 SSH 守护进程监听不同的端口,每个都重定向到不同的主机。在客户端,你可以像这样设置 ~/.ssh/config:

    Host kenmore
    Port 2201
    
    Host chiswick
    Port 2202
    

    (这是假设它们都解析到首先命中的 IP park。)

  • 在你的客户端上,只需运行第二个 SSH,park就像第一个 SSH 的命令一样,例如

    ssh -t kenmore ssh kenmore
    

    (假设从外部kenmore解析到的 IP,但是一旦进入内部就知道第二个 SSH 的真实 IP )parkparkkenmore

  • 运行类似盖特一号并通过 HTTP建立park隧道,充当park内部所需的 SSH 终端的跳转主机/网关。

答案4

这是一个不寻常的配置,因为它取代了 10 美元的交换机所能实现的功能。当然,如果 10 美元的交换机能做到这一点,更有甚者一台电脑就能做到。肯定有无数种方法可以做到,这只是其中一种简单的方法。

假设您的路由器提供的地址在 192.168.1.21-50 范围内,我们将 eth0 称为 park 与路由器的接口,将 eth1 与 kenmore 的接口称为 eth1,将 eth2 与 chiswick 的接口称为 eth2。

1)让 park 通过路由器的 DHCP 获取其 IP 地址。

2) 让我们为 kenmore 和 chiswick 指定静态 IP 地址。例如 kenmore 192.168.1.5 和 chiswick 192.168.1.10。请注意,这两者都超出了路由器使用的范围,因此不会发生冲突。

3) 根据 kenmore/chiswick 上的操作系统,您可能需要在其上设置路由表。在 Linux 中,您应该有

  sudo route add default gw 192.168.1.1

在 Mac 上也是如此,但在 Windows 上我认为这是自动的。

4)在 park 上:首先,让我们允许 IPv4 转发:使用 sudo 编辑 /etc/sysctl.conf 并更改此行

 #net.ipv4.ip_forward=0

 net.ipv4.ip_forward=1

保存文件,发出命令:

 sudo sysctl -p

5)其次,在park上,让我们将这两条路线添加到路由表中:

 sudo route add -host 192.168.1.5 dev eth1
 sudo route add -host 192.168.1.10 dev eth2

现在您就可以开始了。

相关内容