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