SSLH - HTTPS 和 SSH 共享同一端口
在这个简短的教程中,我们将了解什么是 SSLH、如何安装 SSLH 以及如何在 Linux 和类 Unix 中配置 SSLH 以为 https 和 ssh 共享同一端口操作系统。
什么是 SSLH?
一些互联网服务提供商和企业公司可能封锁了大部分端口,只允许少数特定端口(例如端口 80 和 443)以加强其安全性。
在这种情况下,我们别无选择,只能为多个程序使用同一个端口,比如 HTTPS 端口 443,很少被阻止。这就是 SSL/SSH 多路复用器 SSLH 的用武之地。
SSLH 将侦听端口 443 上的传入连接。更简单地说,SSLH 允许我们在 Linux 系统上的端口 443 上运行多个程序或服务。因此,您可以使用同一端口同时使用 SSL 和 SSH。
如果您遇到过大多数端口被防火墙阻止的情况,您可以使用 SSLH 访问远程服务器。
在 Linux 中安装 SSLH
SSLH 已针对大多数 Linux 发行版进行了打包,因此您可以使用默认的包管理器来安装它。
在 Debian、Ubuntu、Linux Mint 和 Pop OS 上,运行:
sudo apt install sslh安装 SSLH 时,系统会提示您是否要将 sslh 作为 inetd 的服务运行,或者作为独立服务器运行。
每种选择都有其自身的好处。如果每天只有几个连接,最好从 inetd 运行 sslh 以节省资源。
另一方面,对于许多连接,sslh 应作为独立服务器运行,以避免为每个传入连接生成新进程。
安装sslh
在 Arch Linux 和 Antergos、Manjaro Linux 等衍生产品上,使用 Pacman 安装它,如下所示。
sudo pacman -S sslh在RHEL、CentOS、AlmaLinux和Rocky Linux上,您需要添加EPEL存储库,然后安装 SSLH,如下所示。
sudo dnf install epel-releasesudo dnf install sslh在 Fedora 上:
sudo dnf install sslh
如果默认存储库中没有该工具,您可以按照此处所述手动编译和安装 SSLH。
配置 Apache 或 Nginx Web 服务器
如您所知,Apache 和 Nginx 网络服务器默认侦听所有网络接口(即 0.0.0.0:443)。我们需要更改此设置以告诉网络服务器仅侦听本地主机接口(即127.0.0.1:443 或localhost:443)。
为此,请编辑 Web 服务器(nginx 或 apache)配置文件并找到以下行:
listen 443 ssl;并且,将其更改为:
listen 127.0.0.1:443 ssl;如果您在 Apache 中使用 Virutalhosts,请确保您也对其进行了更改。
VirtualHost 127.0.0.1:443
保存并关闭配置文件。不要重新启动服务。我们还没有完成。
配置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。
保存并关闭文件。
最后,启用并启动 sslh 服务来更新更改。
sudo systemctl enable sslhsudo 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现在,您可以使用端口 443 通过 SSH 访问远程服务器:
ssh -p 443 sk@192.168.225.50示例输出:
sk@192.168.225.50'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 端口 22 被阻止,我现在也可以通过 SSH 访问远程服务器。正如您在上面的示例中看到的,我使用 https 端口 443 进行 SSH 连接。此外,我们也可以使用相同的端口 443 进行 openVPN 连接。
结论
我在我的 Ubuntu 18.04 LTS 服务器上测试了 SSLH,它工作得很好,如上所述。我在受保护的局域网中测试了 SSLH,因此我还没有意识到安全问题。如果您在生产中使用它,请在下面的评论部分告诉我们使用 SSLH 的优点和缺点。
有关更多详细信息,请查看下面给出的官方 GitHub 页面。
资源:
- SSLH GitHub 存储库

