SSLH:讓 HTTPS 和 SSH 共用同一個埠

2019-08-19 20:14:00

一些 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:443localhost: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 sslhsslh 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.pidsslh 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.pidsk 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/advantageSystem information as of Wed Aug 14 13:11:04 IST 2019System load: 0.23 Processes: 101Usage of /: 53.5% of 19.56GB Users logged in: 0Memory usage: 9% IP address for enp0s3: 192.168.225.50Swap 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/microk8s61 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 頁面。

資源: