天天看點

如何在同一個端口上運作多個程式或服務

如何在同一個端口上運作多個程式或服務

在實際生産環境中,大部分網際網路服務提供商或公司可能已經阻止了大多數網絡端口,并且隻允許使用少數特定端口(如: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

繼續閱讀