在實際生産環境中,大部分網際網路服務提供商或公司可能已經阻止了大多數網絡端口,并且隻允許使用少數特定端口(如:80 和 443)來進行服務通路,以加強其安全性。
在這種情況下,如果我們需要将更多的服務暴露在公網上,我們該怎麼辦呢?這時你别無選擇,隻有為多個程式共用相同的端口,比如:共用 HTTPS 的端口 443。
那怎麼樣才能實作不同程式複用相同端口呢,這時你就需要 SSLH 這款神器。
SSLH 是一款采用 C 語言編寫的開源端口複用軟體,目前支援 HTTP、SSL、SSH、OpenVPN、Tinc、XMPP 等多種協定識别。它主要運作于 *nix 環境,源代碼托管在 GitHub 上。 項目位址:https://github.com/yrutschle/sslh
更簡單地說,SSLH 允許我們在 Linux 系統上的同一端口上運作多個程式/服務。是以,您可以用同一端口來同時使用兩種服務。如果你遇到大多數端口被防火牆阻止的情況,SSLH 就可以幫你派上大用場。下面我們就來看一個 SSL 和 SSH 同時複用同一端口的執行個體。
一 安裝 SSLH
SSLH 适用于大多數 Linux 發行版,是以您可以使用預設包管理器進行安裝。
1 在 Debian / Ubuntu 上
$ sudo apt-get install sslh
2 在 RHEL / CentOS 上
需要先安裝 EPEL 倉庫
$ sudo yum install epel-release
$ sudo yum install sslh
二 配置 Web 伺服器
首先,我們需要安裝一個 Web 伺服器,并且配置它接受 HTTPS 請求。確定這個服務隻監聽在 localhost,當然也可以配置它監聽在非标準端口,如:2443,這裡我們以 Nginx 為例。
1 安裝 Nginx
# RHEL / CentOS
$ yum install nginx
# Debian / Ubuntu
$ apt install nginx
2 配置 Nginx
修改配置讓其隻監聽 localhost 接口,即:127.0.0.1:443 或 localhost:443。
$ vim nginx.conf
# 找到如下行内容
listen 443 ssl;
# 并将其更改為以下内容
listen 127.0.0.1:443 ssl;
三 配置SSLH
接下來,我們需要修改 SSLH 的配置檔案的如下幾處。
$ sudo vi /etc/default/sslh
# 找到以下行:
Run=no
# 并将其更改為:
Run=yes
# 修改以下行以允許 SSLH 在所有可用接口上偵聽端口 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 : 用此指定的使用者名運作 SSLH。
-–listen 0.0.0.0:443 : 指定 SSLH 在所有接口上監聽 443 端口。
-–sshs 127.0.0.1:22 : 将 SSH 流量轉發到 localhost 上的 22 端口。
-–ssl 127.0.0.1:443 : 将 HTTPS/SSL 流量轉發到 localhost 上的 443 端口。
四 啟動 SSLH 服務
$ sudo systemctl enable sslh
$ sudo systemctl start sslh
五 測試 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 和 HTTPS 通路。
$ ssh -p 443 [email protected]
[email protected]'s password:
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-89-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Mon Aug 14 15:52:20 2017 from 192.168.43.192
[email protected]:~$
同時使用浏覽器通路 https://SERVER_NAME 這個位址也是可以正确通路的。
至此,我們就驗證了 SSLH 确實可以在同一端口提供多種服務。
參考文檔
https://linux.cn/article-11247-1.html
https://www.ostechnix.com/sslh-share-port-https-ssh/
https://huataihuang.gitbooks.io/cloud-atlas/service/ssh/sslh_multi_service_in_one_port.html
https://it.baiked.com/linux/linuxcommon/4525.html