SSLH – 为 HTTPS 和 SSH 共享同一个端口

在这个简短的教程中,我们将了解什么是 SSLH、如何安装 SSLH 以及如何配置 SSLH 以在 Linux 和类 Unix 操作系统中为 https 和 ssh 共享相同的端口。

内容

  1. 什么是 SSLH?
  2. 在 Linux 中安装 SSLH
  3. 配置 Apache 或 Nginx 网络服务器
  4. 配置 SSLH
    1. 测试

什么是 SSLH?

一些互联网服务提供商和企业公司可能已经封锁了大部分端口,只允许端口 80 和 443 等少数特定端口以加强其安全性。

在这种情况下,我们别无选择,只能为多个程序使用同一个端口,比如 HTTPS 端口 443,很少被阻止。 这里是哪里 SSLH,一个 SSL/SSH 多路复用器,提供帮助。

SSLH 将侦听端口 443 上的传入连接。更简单地说,SSLH 允许我们在 Linux 系统的端口 443 上运行多个程序或服务。 因此,您可以同时使用同一端口同时使用 SSL 和 SSH。

如果您曾经遇到过大多数端口被防火墙阻止的情况,您可以使用 SSLH 访问您的远程服务器。

在 Linux 中安装 SSLH

SSLH 为大多数 Linux 发行版打包,因此您可以使用默认的包管理器安装它。

Debian, Ubuntu, Linux 薄荷糖流行操作系统, 跑:

$ sudo apt install sslh

安装 SSLH 时,您将提示您是要将 sslh 作为 inetd 的服务运行,还是作为独立服务器运行。

每个选择都有其自身的好处。 每天只有几个连接,最好从 inetd 运行 sslh 以节省资源。

另一方面,对于许多连接,sslh 应该作为独立服务器运行,以避免为每个传入连接生成一个新进程。

安装 sslh

Arch Linux 以及像 Antergos、Manjaro Linux 这样的衍生产品,使用 Pacman 安装它,如下所示。

$ sudo pacman -S sslh

RHEL, 中央操作系统, AlmaLinux洛基 Linux, 你需要添加 EPEL 存储库,然后安装 SSLH,如下所示。

$ sudo dnf install epel-release
$ sudo dnf install sslh

Fedora

$ sudo dnf install sslh

如果它在默认存储库中不可用,您可以按照说明手动编译和安装 SSLH 这里.

配置 Apache 或 Nginx 网络服务器

正如你已经知道的, Apache Nginx 网络服务器将监听所有网络接口(即 0.0.0.0:443) 默认情况下。 我们需要更改此设置以告诉网络服务器仅在 localhost 接口上侦听(即 127.0.0.1:443 或者 localhost:443)。

为此,请编辑网络服务器(nginx 或 apache)配置文件并找到以下行:

listen 443 ssl;

并且,将其更改为:

listen 127.0.0.1:443 ssl;

如果你在使用 Virutalhosts Apache,确保你也改变了它。

VirtualHost 127.0.0.1:443 

Save 和 close 配置文件。 不要重新启动服务。 我们还没有完成。

配置 SSLH

一旦你让网络服务器只监听本地接口,编辑 SSLH 配置文件:

$ sudo vi /etc/default/sslh

找到以下行:

Run=no

并且,将其更改为:

Run=yes

然后,向下滚动一点并修改以下行以允许 SSLH 侦听所有可用接口上的端口 443(例如。 0.0.0.0:443)。

DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

在哪里,

  • --user sslh :需要在这个指定的用户名下运行。
  • --listen 0.0.0.0:443 : SSLH 正在监听端口 443 在所有可用的接口上。
  • --sshs 127.0.0.1:22 : 将 SSH 流量路由到端口 22 在本地主机上。
  • --ssl 127.0.0.1:443 : 将 HTTPS/SSL 流量路由到端口 443 在本地主机上。

Save 和 close 文件。

最后,启用并启动 sslh 服务以更新更改。

$ sudo systemctl enable sslh
$ sudo systemctl start sslh

测试

检查 SSLH 守护进程是否正在监听 443.

$ ps -ef | grep sslh  sslh 2746 1 0 15:51 ? 00:00:00 /usr/sbin/sslh --foreground --user sslh --listen 0.0.0.0 443 --ssh 127.0.0.1 22 --ssl 127.0.0.1 443 --pidfile /var/run/sslh/sslh.pid sslh 2747 2746 0 15:51 ? 00:00:00 /usr/sbin/sslh --foreground --user sslh --listen 0.0.0.0 443 --ssh 127.0.0.1 22 --ssl 127.0.0.1 443 --pidfile /var/run/sslh/sslh.pid sk 2754 1432 0 15:51 pts/0 00:00:00 grep --color=auto sslh

现在,您可以使用端口通过 SSH 访问远程服务器 443

$ ssh -p 443 [email protected]

样本输出:

[email protected]'s password:  Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-55-generic x86_64)  * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage  System information as of Wed Aug 14 13:11:04 IST 2019  System load: 0.23 Processes: 101 Usage of /: 53.5% of 19.56GB Users logged in: 0 Memory usage: 9% IP address for enp0s3: 192.168.225.50 Swap usage: 0% IP address for enp0s8: 192.168.225.51  * Keen to learn Istio? It's included in the single-package MicroK8s.  https://snapcraft.io/microk8s  61 packages can be updated. 22 updates are security updates.   Last login: Wed Aug 14 13:10:33 2019 from 127.0.0.1
使用端口 443 通过 SSH 访问远程系统

看? 即使默认的 SSH 端口,我现在也可以通过 SSH 访问远程服务器 22 被阻止。 正如您在上面的示例中看到的,我使用了 https 端口 443 用于 SSH 连接。 此外,我们可以使用相同的端口 443 也适用于 openVPN 连接。

我在我的 Ubuntu 18.04 LTS 服务器上测试了 SSLH,它工作得很好,如上所述。 我在受保护的局域网中测试了 SSLH,所以我不知道安全问题。 如果您在生产中使用它,请在下面的评论部分告诉我们使用 SSLH 的优点和缺点。

有关更多详细信息,请查看下面给出的官方 GitHub 页面。

资源:

  • SSLH GitHub 存储库

建议阅读:

  • 如何通过 SSH 连接到 Linux 上的特定目录
  • 如何在 Linux 中创建 SSH 别名
  • 如何在 Linux 中配置基于 SSH 密钥的身份验证
  • 如何在 Linux 中阻止 SSH 会话断开连接
  • 在 Linux 中允许或拒绝对特定用户或组的 SSH 访问
  • 退出 SSH 会话后保持命令运行的 4 种方法
  • ScanSSH – 快速 SSH 服务器和开放代理扫描器

HTTPSLinux安全连接为 HTTPS 和 SSHSSHSSLSSLH 共享同一个端口