使用 stunnel 保護 telnet 連線

2019-06-06 13:46:00

Telnet 是一種用戶端-伺服器端協定,通過 TCP 的 23 埠連線到遠端伺服器。Telnet 並不加密資料,因此它被認為是不安全的,因為資料是以明文形式傳送的,所以密碼很容易被嗅探。但是,仍有老舊系統需要使用它。這就是用到 stunnel 的地方。

stunnel 旨在為使用不安全連線協定的程式增加 SSL 加密。本文將以 telnet 為例介紹如何使用它。

伺服器端安裝

使用 sudo 安裝 stunnel 以及 telnet 的伺服器端和用戶端:

sudo dnf -y install stunnel telnet-server telnet

新增防火牆規則,在提示時輸入你的密碼:

firewall-cmd --add-service=telnet --permfirewall-cmd --reload

接下來,生成 RSA 私鑰和 SSL 證書:

openssl genrsa 2048 > stunnel.keyopenssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt

系統將一次提示你輸入以下資訊。當詢問 Common Name 時,你必須輸入正確的主機名或 IP 地址,但是你可以按確認鍵跳過其他所有內容。

You are about to be asked to enter information that will beincorporated into your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:State or Province Name (full name) []:Locality Name (eg, city) [Default City]:Organization Name (eg, company) [Default Company Ltd]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) []:Email Address []

將 RSA 金鑰和 SSL 證書合併到單個 .pem 檔案中,並將其複製到 SSL 證書目錄:

cat stunnel.crt stunnel.key > stunnel.pemsudo cp stunnel.pem /etc/pki/tls/certs/

現在可以定義服務和用於加密連線的埠了。選擇尚未使用的埠。此例使用 450 埠進行隧道傳輸 telnet。編輯或建立 /etc/stunnel/telnet.conf

cert = /etc/pki/tls/certs/stunnel.pemsslVersion = TLSv1chroot = /var/run/stunnelsetuid = nobodysetgid = nobodypid = /stunnel.pidsocket = l:TCP_NODELAY=1socket = r:TCP_NODELAY=1[telnet]accept = 450connect = 23

accept 選項是伺服器將監聽傳入 telnet 請求的介面。connect 選項是 telnet 伺服器的內部監聽介面。

接下來,建立一個 systemd 單元檔案的副本來覆蓋原來的版本:

sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system

編輯 /etc/systemd/system/stunnel.service 來新增兩行。這些行在啟動時為服務建立 chroot 監獄。

[Unit]Description=TLS tunnel for network daemonsAfter=syslog.target network.target[Service]ExecStart=/usr/bin/stunnelType=forkingPrivateTmp=trueExecStartPre=-/usr/bin/mkdir /var/run/stunnelExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/stunnel[Install]WantedBy=multi-user.target

接下來,設定 SELinux 以在你剛剛指定的新埠上監聽 telnet:

sudo semanage port -a -t telnetd_port_t -p tcp 450

最後,新增新的防火牆規則:

firewall-cmd --add-port=450/tcp --permfirewall-cmd --reload

現在你可以啟用並啟動 telnet 和 stunnel。

systemctl enable telnet.socket [email protected] --now

要注意 systemctl 命令是有順序的。systemd 和 stunnel 包預設提供額外的模板單元檔案。該模板允許你將 stunnel 的多個組態檔放到 /etc/stunnel 中,並使用檔名啟動該服務。例如,如果你有一個 foobar.conf 檔案,那麼可以使用 systemctl start [email protected] 啟動該 stunnel 範例,而無需自己編寫任何單元檔案。

如果需要,可以將此 stunnel 模板服務設定為在啟動時啟動:

systemctl enable [email protected]

用戶端安裝

本文的這部分假設你在用戶端系統上以普通使用者(擁有 sudo 許可權)身份登入。安裝 stunnel 和 telnet 用戶端:

dnf -y install stunnel telnet

stunnel.pem 從遠端伺服器複製到用戶端的 /etc/pki/tls/certs 目錄。在此例中,遠端 telnet 伺服器的 IP 地址為 192.168.1.143

sudo scp [email protected]:/etc/pki/tls/certs/stunnel.pem/etc/pki/tls/certs/

建立 /etc/stunnel/telnet.conf

cert = /etc/pki/tls/certs/stunnel.pemclient=yes[telnet]accept=450connect=192.168.1.143:450

accept 選項是用於 telnet 對談的埠。connect 選項是你遠端伺服器的 IP 地址以及監聽的埠。

接下來,啟用並啟動 stunnel:

systemctl enable [email protected] --now

測試你的連線。由於有一條已建立的連線,你會 telnetlocalhost 而不是遠端 telnet 伺服器的主機名或者 IP 地址。

[user@client ~]$ telnet localhost 450Trying ::1...telnet: connect to address ::1: Connection refusedTrying 127.0.0.1...Connected to localhost.Escape character is '^]'.Kernel 5.0.9-301.fc30.x86_64 on an x86_64 (0)server login: myuserPassword: XXXXXXXLast login: Sun May  5 14:28:22 from localhost[myuser@server ~]$