作者:阮一峰
出处:http://www.ruanyifeng.com/blog/2020/12/ssh-tutorial.html
SSH 服务器
简介
SSH 的架构是服务器/客户端模式,两端运行的软件是不一样的。OpenSSH 的客户端软件是 ssh,服务器软件是 sshd。本章介绍 sshd 的各种知识。
如果没有安装 sshd,可以用下面的命令安装。
# Debian$ sudo aptitude install openssh-server# Red Hat$ sudo yum install openssh-server
一般来说,sshd 安装后会跟着系统一起启动。如果当前 sshd 没有启动,可以用下面的命令启动。
$ sshd
上面的命令运行以后,sshd 自动进入后台,所以命令后面不需要加上&
。
除了直接运行可执行文件,也可以通过 Systemd 启动 sshd。
# 启动$ sudo systemctl start sshd.service# 停止$ sudo systemctl stop sshd.service# 重启$ sudo systemctl restart sshd.service
下面的命令让 sshd 在计算机下次启动时自动运行。
$ sudo systemctl enable sshd.service
sshd 配置文件
sshd 的配置文件在/etc/ssh
目录,主配置文件是sshd_config
,此外还有一些安装时生成的密钥。
/etc/ssh/sshd_config
:配置文件/etc/ssh/ssh_host_ecdsa_key
:ECDSA 私钥。/etc/ssh/ssh_host_ecdsa_key.pub
:ECDSA 公钥。/etc/ssh/ssh_host_key
:用于 SSH 1 协议版本的 RSA 私钥。/etc/ssh/ssh_host_key.pub
:用于 SSH 1 协议版本的 RSA 公钥。/etc/ssh/ssh_host_rsa_key
:用于 SSH 2 协议版本的 RSA 私钥。/etc/ssh/ssh_host_rsa_key.pub
:用于 SSH 2 协议版本的 RSA 公钥。/etc/pam.d/sshd
:PAM 配置文件。
注意,如果重装 sshd,上面这些密钥都会重新生成,导致客户端重新 ssh 连接服务器时,会跳出警告,拒绝连接。为了避免这种情况,可以在重装 sshd 时,先备份/etc/ssh
目录,重装后再恢复这个目录。
配置文件sshd_config
的格式是,每个命令占据一行。每行都是配置项和对应的值,配置项的大小写不敏感,与值之间使用空格分隔。
Port 2034
上面的配置命令指定,配置项Port
的值是2034
。Port
写成port
也可。
配置文件还有另一种格式,就是配置项与值之间有一个等号,等号前后的空格可选。
Port = 2034
配置文件里面,#
开头的行表示注释。
# 这是一行注释
注意,注释只能放在一行的开头,不能放在一行的结尾。
Port 2034 # 此处不允许注释
上面的写法是错误的。
另外,空行等同于注释。
sshd 启动时会自动读取默认的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f
参数指定。
$ sshd -f /usr/local/ssh/my_config
上面的命令指定 sshd 使用另一个配置文件my_config
。
修改配置文件以后,可以用 sshd 命令的-t
(test)检查有没有语法错误。
$ sshd -t
配置文件修改以后,并不会自动生效,必须重新启动 sshd。
$ sudo systemctl restart sshd.service
sshd 密钥
sshd 有自己的一对或多对密钥。它使用密钥向客户端证明自己的身份。所有密钥都是公钥和私钥成对出现,公钥的文件名一般是私钥文件名加上后缀.pub
。
DSA 格式的密钥文件默认为/etc/ssh/ssh_host_dsa_key
(公钥为ssh_host_dsa_key.pub
),RSA 格式的密钥为/etc/ssh/ssh_host_rsa_key
(公钥为ssh_host_rsa_key.pub
)。如果需要支持 SSH 1 协议,则必须有密钥/etc/ssh/ssh_host_key
。
如果密钥不是默认文件,那么可以通过配置文件sshd_config
的HostKey
配置项指定。默认密钥的HostKey
设置如下。
# HostKey for protocol version 1# HostKey /etc/ssh/ssh_host_key# HostKeys for protocol version 2# HostKey /etc/ssh/ssh_host_rsa_key# HostKey /etc/ssh/ssh_host_dsa_ke
上面命令前面的#
表示这些行都是注释,因为这是默认值,有没有这几行都一样。
如果要修改密钥,就要去掉行首的#
,指定其他密钥。
HostKey /usr/local/ssh/my_dsa_keyHostKey /usr/local/ssh/my_rsa_keyHostKey /usr/local/ssh/my_old_ssh1_key
sshd 配置项
以下是/etc/ssh/sshd_config
文件里面的配置项。
AcceptEnv
AcceptEnv
指定允许接受客户端通过SendEnv
命令发来的哪些环境变量,即允许客户端设置服务器的环境变量清单,变量名之间使用空格分隔(AcceptEnv PATH TERM
)。
AllowGroups
AllowGroups
指定允许登录的用户组(AllowGroups groupName
,多个组之间用空格分隔。如果不使用该项,则允许所有用户组登录。
AllowUsers
AllowUsers
指定允许登录的用户,用户名之间使用空格分隔(AllowUsers user1 user2
),也可以使用多行AllowUsers
命令指定,用户名支持使用通配符。如果不使用该项,则允许所有用户登录。该项也可以使用用户名@域名
的格式(比如AllowUsers jones@example.com
)。
**AllowTcpFo