---
author: Sk
category: 技术
comments_data: []
count:
  commentnum: 0
  favtimes: 1
  likes: 0
  sharetimes: 0
  viewnum: 10928
date: '2019-08-19 20:14:29'
editorchoice: false
excerpt: 如果你遇到大多数端口被防火墙阻止的情况，你可以使用 SSLH 访问远程服务器。这个简短的教程描述了如何在类 Unix 操作系统中使用 SSLH 让
  https、ssh 共享相同的端口。
fromurl: https://www.ostechnix.com/sslh-share-port-https-ssh/
id: 11247
islctt: true
largepic: /images/p/201908/19/201432csw4aewysmmhayse.jpg
permalink: /article-11247-1.html
pic: /images/p/201908/19/201432csw4aewysmmhayse.jpg.thumb.jpg
related: []
reviewer: wxy
selector: lujun9972
summary: 如果你遇到大多数端口被防火墙阻止的情况，你可以使用 SSLH 访问远程服务器。这个简短的教程描述了如何在类 Unix 操作系统中使用 SSLH 让
  https、ssh 共享相同的端口。
tags:
- ssh
- https
thumb: false
title: SSLH：让 HTTPS 和 SSH 共享同一个端口
titlepic: true
translator: wxy
updated: '2019-08-19 20:14:29'
---

![SSLH - Share A Same Port For HTTPS And SSH](/images/p/201908/19/201432csw4aewysmmhayse.jpg)


一些 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 应作为独立服务器运行，以避免为每个传入连接生成新进程。


![](/images/p/201908/19/201433isti0tpp0p1drem0.png)


*安装 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
```

如果它在默认存储库中不可用，你可以如[这里](https://github.com/yrutschle/sslh/blob/master/doc/INSTALL.md)所述手动编译和安装 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
```

![](/images/p/201908/19/201435x73rmjrmlyzw41lm.png)


*通过 SSH 使用 443 端口访问远程系统*


看见了吗？即使默认的 SSH 端口 22 被阻止，我现在也可以通过 SSH 访问远程服务器。正如你在上面的示例中所看到的，我使用 https 端口 443 进行 SSH 连接。


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


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


资源：


* [SSLH GitHub 仓库](https://github.com/yrutschle/sslh)




---


via: <https://www.ostechnix.com/sslh-share-port-https-ssh/>


作者：[sk](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出