通过 SSL 进行 SSH 隧道

通过 SSL 进行 SSH 隧道

在我的某个系统上,有一个防火墙禁止任何传出内容,除非 http(s)...

有些用户必须使用 ssh,但他们不能。我首先尝试在端口 443 上运行 ssh,但没有成功。

我在 Google 上搜索了一下,发现我可以使用来实现这一点stunnel,但需要一些配置,那么该怎么做呢?

答案1

此配置分为两部分。第一部分在远程 SSH 服务器上完成。第二部分在本地机器上完成。

服务器端说明:

首先安装stunnel:

sudo apt-get install stunnel4

制作SSL证书(365天):

openssl genrsa 1024 > stunnel.key
openssl req -new -key stunnel.key -x509 -days 365 -out stunnel.crt
cat stunnel.crt stunnel.key > stunnel.pem
sudo mv stunnel.pem /etc/stunnel/

配置 stunnel 将 443 (https) 隧道连接至 22 (ssh):

创建配置文件以满足使用 SSH over SSL 的需求。

gksu gedit /etc/stunnel/stunnel.conf

写下这些:

pid = /var/run/stunnel.pid
cert = /etc/stunnel/stunnel.pem
[ssh] accept = public_ip:443
connect = 127.0.0.1:22

上述配置告诉 stunnel 在哪里找到我们生成的证书以及在哪里接受和转发连接。在这种情况下,stunnel 将在端口 443(https)上监听 public_ip,并将连接重定向回 22(ssh)上的 localhost。

为了启动 stunnel 服务,我们需要在 /etc/default/stunnel4 中激活它。将 ENABLED 行从 0 更改为 1。

最后,我们可以启动服务并继续进行客户端配置:

sudo service stunnel4 start

您可以使用 netstat 命令验证 stunnel 现在是否正在监听:

netstat -natp | grep :443

客户端说明:

首先安装 stunnel 包:

sudo apt-get install stunnel4

制作SSL证书(365天):

openssl genrsa 1024 > stunnel.key
openssl req -new -key stunnel.key -x509 -days 365 -out stunnel.crt
cat stunnel.crt stunnel.key > stunnel.pem
sudo mv stunnel.pem /etc/stunnel/

创建配置文件:

gksu gedit /etc/stunnel/stunnel.conf

写下这些:

pid = /var/run/stunnel.pid
cert = /etc/stunnel/stunnel.pem
[ssh] accept = 127.0.0.1:2200
connect = remote_ip:443

为了启动 stunnel 服务,我们需要在 /etc/default/stunnel4 中激活它。将 ENABLED 行从 0 更改为 1。

启动服务。

sudo service stunnel4 start

建立联系

现在,stunnel 服务已在服务器和客户端上运行,我们就可以建立安全连接了。现在,当您在端口 2200 上连接到本地计算机时,它将在端口 443 上连接到远程 IP,创建安全 SSL 连接,并连接到另一端的端口 22。您的加密 SSH 连接现在已使用端口 443 封装在加密 SSL 连接中。

ssh localhost -p 2200

资料来源: 链接1 链接2

答案2

stunnel适合永久设置,但如果您想要更临时的解决方案,您可以连接 2 个隧道。

例如,你希望主机 A 访问主机 B 上的端口 443,但被防火墙阻止,因此你尝试从主机 C 创建隧道,主机 C 可以访问 A 端口 22 和 B 端口 443

ssh -R 443:B:443 root@A无法在 Ubuntu 或任何禁用 root 帐户或 root ssh 访问的 dist 上运行。

ssh -R 443:B:443 other_user@A不起作用,因为只有 root 可以在 A 上设置监听端口,即使用户“other_user”有 sudo 权限。

ssh -R 1443:B:443 other_user@A将允许 A 使用 127.0.0.1:1443 访问 B:443。这很好,但有时您无法更改端口(端口号可能在应用程序中被硬编码)。在这种情况下,除了之前的 A->C->B 隧道之外,
您还可以添加另一个从 A:443 到 A:1443 的隧道 。ssh -L 443:127.0.0.1:1443 127.0.0.1

相关内容