我需要在机器 A 上通过 22 以外的其他端口访问 SSH,因为我使用的网络只允许标准端口访问。因此,我想将机器 B 的端口 443 路由到机器 A 的端口 22(在机器 A 上,没有标准端口可用,我不想碰生产机器)。
机器B只是一台闲置的机器,所以443端口没用到。而且这个方案也只能用几天。
我的问题是:
-如何将机器B(5.6.7.8)的443端口转发到机器A(1.2.3.4)的22端口?我想到iptables。
-这种方法的安全性如何?由于 SSH 服务器密钥打印,应该不会出现问题,对吗?
答案1
您需要使用 iptables 中的 NAT 功能。此处有相关记录:使用 netfilter 进行目标 NAT(DNAT)。但是,这不包括端口号。不过,我看到它只在 IP 地址后面加上端口号就可以工作。
我认为这会起作用:
iptables -t nat -A PREROUTING -p tcp -d 5.6.7.8 --dport 443 -j DNAT --to-destination 1.2.3.4:22
当然,这是假设 5.6.7.8 可以达到 1.2.3.4:22。关于安全性,您可能会看到一些客户端尝试连接到 SSH。如果您在所有帐户上都使用强密码(或者更好的是,仅使用公钥身份验证),它仍然应该相当安全。
编辑:我看到这个问题已经在 Server Fault 上得到解答了:如何使用 iptables 进行端口转发?
答案2
除非我误解了你需要做什么,否则实现你想要的相当简单,如果你控制 B 并且可以将 B 上的 SSH 守护程序配置为监听端口 443 而不是标准端口 22,并在 B 上设置任何防火墙软件以允许入站连接到端口 443,只要允许任何到端口 443 的流量从您使用的网络出站。
如果 B 是 Linux 系统,要让它监听端口 443 上的 SSH 连接,可能需要对 进行小幅更新/etc/ssh/sshd_config
。在文件中查找以下行:
#Port 22
从行首删除“#”,否则,该符号后面的内容将被视为注释。将“22”更改为“443”,然后重新启动 SSH 守护程序。
在客户端系统上,您使用-L
SSH 选项,这将导致本地连接(即您启动 SSH 连接的系统的连接)从您所连接的 SSH 服务器转发到其他系统上的端口。
-L [bind_address:]port:host:hostport
Specifies that the given port on the local (client) host is to be
forwarded to the given host and port on the remote side. This
works by allocating a socket to listen to port on the local side,
optionally bound to the specified bind_address. Whenever a con‐
nection is made to this port, the connection is forwarded over
the secure channel, and a connection is made to host port
hostport from the remote machine. Port forwardings can also be
specified in the configuration file. IPv6 addresses can be spec‐
ified by enclosing the address in square brackets. Only the
superuser can forward privileged ports. By default, the local
port is bound in accordance with the GatewayPorts setting. How‐
ever, an explicit bind_address may be used to bind the connection
to a specific address. The bind_address of “localhost” indicates
that the listening port be bound for local use only, while an
empty address or ‘*’ indicates that the port should be available
from all interfaces.
例如,您可以使用如下命令通过机器 B 上的 SSH 连接到端口 443,并让其将本地系统上的端口 2222 的流量通过 B 上的端口 443 转发到 A 上的端口 22。
ssh -p 443 -L 2222:1.2.3.4:22 [email protected]
代表-p
“端口”,它告诉 SSH 您需要连接到目标系统,即位于 5.6.7.8 的 B,端口为 443,而不是标准端口 443。 告诉-L
SSH 在您建立连接的系统上创建一个本地监听端口。我在命令行中输入了“2222”,但这个数字是任意的;只要输入大于 1,024 且小于 65,536 的数字即可。-L 2222:1.2.3.4:22
还指示您建立到 B 的 SSH 连接的系统上的 SSH 程序将其在端口 2222 上收到的任何流量转发到SSH 隧道它已经与 B 建立了连接。当它离开隧道的另一端时,B 会将其发送到位于 1.2.3.4 端口 22 的 A。因此从 A 的角度来看,与它的 SSH 连接源自 B。
然后,在建立连接的系统上,您需要启动另一个 SSH 连接,但这次是连接到其自身的端口 2222。您可以按如下方式执行此操作:
ssh -p 2222[电子邮件保护]
现在你的系统连接到了本地主机地址为 127.0.0.1。您设置的第一个 SSH 连接让 SSH 客户端软件在端口 2222 上监听连接,然后通过 SSH 隧道将流量转发到 B 上的端口 443,然后再发送到 A 上的端口 22。当您启动连接时,如果您使用密码验证,您将收到的密码提示将针对机器 A。
您发起第一个 SSH 连接的网络上的防火墙仅看到到 B 上的端口 443 的出站连接。但是在到 B 上的端口 443 的连接中有一个加密隧道,该隧道将到 SSH 客户端上端口 2222 的所有流量路由到 A 上的端口 22。
我使用类似的方法将文件传输到 SSH 服务器 A 或从该服务器 A 传输文件,该服务器位于受限网络区域,其中唯一允许的入站 SSH 连接必须通过堡垒主机,B. 注意:如果您还需要使用安全副本 (SCP),您需要使用大写的“P”和 SCP 来指定端口,而使用 ssh 时必须使用小写的“p”。
如果你没有使用 Linux 或 OS X 系统作为客户端 SSH 系统,则可以使用使用 PuTTY 的类似端口转发方法或其他 SSH 客户端软件。
答案3
您是否手动登录,或者外部机器 X 上的服务是否需要登录到机器 A?对于手动登录,您可以执行以下操作:
- 您设置机器 B 上的 SSH 服务器来监听 443 端口。当然,您需要设置公司防火墙,将 443 端口的外部流量引导至这台机器。
- 您登录到机器 B。现在您在本地网络上,可能没有防火墙限制。
- 从机器 B 登录到机器 A,其 SSH 服务器监听端口 22。
既然你可以设置防火墙将端口 443 的流量导向机器 B,那么为什么不能设置防火墙来监听端口 22 或端口 54827(或任何随机端口号)并将其路由到机器 A?
另一个选择是通过 B 隧道将 SSH 流量传输到 A。
安全性与 SSH 一样好。