Telnet 是一种客户端-服务端协议,经过 TCP 的 23 端口链接到远程服务器。Telnet 并不加密数据,所以它被认为是不安全的,由于数据是以明文形式发送的,因此密码很容易被嗅探。可是,仍有老旧系统须要使用它。这就是用到 stunnel 的地方。linux
stunnel 旨在为使用不安全链接协议的程序增长 SSL 加密。本文将以 telnet 为例介绍如何使用它。git
使用 sudo 安装 stunnel 以及 telnet 的服务端和客户端:github
sudo dnf -y install stunnel telnet-server telnet
复制代码
添加防火墙规则,在提示时输入你的密码:安全
firewall-cmd --add-service=telnet --perm
firewall-cmd --reload
复制代码
接下来,生成 RSA 私钥和 SSL 证书:bash
openssl genrsa 2048 > stunnel.key
openssl 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 be
incorporated 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 blank
For 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 证书目录:socket
cat stunnel.crt stunnel.key > stunnel.pem
sudo cp stunnel.pem /etc/pki/tls/certs/
复制代码
如今能够定义服务和用于加密链接的端口了。选择还没有使用的端口。此例使用 450 端口进行隧道传输 telnet。编辑或建立 /etc/stunnel/telnet.conf
:tcp
cert = /etc/pki/tls/certs/stunnel.pem
sslVersion = TLSv1
chroot = /var/run/stunnel
setuid = nobody
setgid = nobody
pid = /stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
[telnet]
accept = 450
connect = 23
复制代码
accept
选项是服务器将监听传入 telnet 请求的接口。connect
选项是 telnet 服务器的内部监听接口。测试
接下来,建立一个 systemd 单元文件的副原本覆盖原来的版本:ui
sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system
复制代码
编辑 /etc/systemd/system/stunnel.service
来添加两行。这些行在启动时为服务建立 chroot 监狱。
[Unit]
Description=TLS tunnel for network daemons
After=syslog.target network.target
[Service]
ExecStart=/usr/bin/stunnel
Type=forking
PrivateTmp=true
ExecStartPre=-/usr/bin/mkdir /var/run/stunnel
ExecStartPre=/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 --perm
firewall-cmd --reload
复制代码
如今你能够启用并启动 telnet 和 stunnel。
systemctl enable telnet.socket stunnel@telnet.service --now
复制代码
要注意 systemctl
命令是有顺序的。systemd 和 stunnel 包默认提供额外的模板单元文件。该模板容许你将 stunnel 的多个配置文件放到 /etc/stunnel
中,并使用文件名启动该服务。例如,若是你有一个 foobar.conf
文件,那么可使用 systemctl start stunnel@foobar.service
启动该 stunnel 实例,而无需本身编写任何单元文件。
若是须要,能够将此 stunnel 模板服务设置为在启动时启动:
systemctl enable stunnel@telnet.service
复制代码
本文的这部分假设你在客户端系统上以普通用户(拥有 sudo 权限)身份登陆。安装 stunnel 和 telnet 客户端:
dnf -y install stunnel telnet
复制代码
将 stunnel.pem
从远程服务器复制到客户端的 /etc/pki/tls/certs
目录。在此例中,远程 telnet 服务器的 IP 地址为 192.168.1.143
。
sudo scp myuser@192.168.1.143:/etc/pki/tls/certs/stunnel.pem
/etc/pki/tls/certs/
复制代码
建立 /etc/stunnel/telnet.conf
:
cert = /etc/pki/tls/certs/stunnel.pem
client=yes
[telnet]
accept=450
connect=192.168.1.143:450
复制代码
accept
选项是用于 telnet 会话的端口。connect
选项是你远程服务器的 IP 地址以及监听的端口。
接下来,启用并启动 stunnel:
systemctl enable stunnel@telnet.service --now
复制代码
测试你的链接。因为有一条已创建的链接,你会 telnet
到 localhost
而不是远程 telnet 服务器的主机名或者 IP 地址。
[user@client ~]$ telnet localhost 450
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 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: myuser
Password: XXXXXXX
Last login: Sun May 5 14:28:22 from localhost
[myuser@server ~]$
复制代码
via: fedoramagazine.org/securing-te…
做者:Curt Warfield 选题:lujun9972 译者:geekpi 校对:wxy