SSLH-为HTTPS和SSH共享相同的端口

时间:2020-03-21 11:47:20  来源:igfitidea点击:

一些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连接。