SSLH-为HTTPS和SSH共享相同的端口
一些Internet服务提供商和可能已封锁了大多数端口,并仅允许使用少数特定端口(例如端口80和443)来加强其安全性。
在这种情况下,我们别无选择,只能对多个程序使用相同的端口,例如HTTPS端口443,该端口很少被阻塞。
这是SSLH(SSL/SSH多路复用器)提供帮助的地方。
它将侦听端口443上的传入连接。
简而言之,SSLH允许我们在Linux系统上的端口443上运行多个程序/服务。
因此,我们可以同时使用同一端口的SSL和SSH。
如果我们曾经遇到大多数端口被防火墙阻止的情况,则可以使用SSLH访问远程服务器。
此教程描述了如何在类似Unix的操作系统中使用SSLH为https,ssh共享相同的端口。
SSLH-为HTTPS,SSH和OpenVPN共享相同的端口
安装SSLH
SSLH已打包用于大多数Linux发行版,因此我们可以使用默认的软件包管理器进行安装。
在Debian,Ubuntu和衍生产品上,运行:
$sudo apt-get install sslh
在安装SSLH时,系统将提示我们是将sslh作为来自inetd的服务还是作为独立服务器运行。
每种选择都有其自身的优势。
每天只有很少的连接,可能最好从inetd运行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中使用Virutalhosts,请确保也进行了更改。
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 Hyman@theitroad
输出示例:
Hyman@theitroad'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端口22被阻止,我也可以通过SSH访问远程服务器。
如上例所示,我已将https端口443用于SSH连接。
另外,我们也可以将相同的端口443用于openVPN连接。