为什么需要配置SSH
SSH(Secure Shell)是Linux系统中最常用的远程管理协议。对于Ubuntu用户来说,无论是管理服务器、传输文件,还是远程执行命令,SSH都是必不可少的工具。默认情况下,Ubuntu桌面版并未安装SSH服务端,而服务器版则默认安装了openssh-server。本文将以Ubuntu 22.04 LTS为示例,从安装、配置到安全加固,完整记录SSH服务的配置过程。

第一步:安装OpenSSH服务端
在开始之前,建议先更新软件包索引,确保安装的软件包为最新版本。
sudo apt update
然后安装openssh-server软件包:
sudo apt install openssh-server -y
安装完成后,SSH服务会自动启动。可以通过以下命令确认服务状态:
sudo systemctl status ssh
如果输出中显示“active (running)”,说明服务正在运行。若未运行,可以手动启动:
sudo systemctl start ssh
同时,建议设置开机自启动:
sudo systemctl enable ssh
验证SSH是否安装成功
在本地终端执行以下命令,检查22端口是否监听:
sudo ss -tlnp | grep :22
如果看到类似 LISTEN 0 128 0.0.0.0:22 的输出,说明SSH服务已正常监听。此时,可以从另一台电脑尝试连接:
ssh 用户名@服务器IP地址
第二步:基础配置SSH服务
SSH的配置文件位于 /etc/ssh/sshd_config。修改此文件前,建议先备份原文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
使用编辑器打开配置文件:
sudo nano /etc/ssh/sshd_config
以下是一些常用的基础配置项:
修改默认端口
默认端口为22,为了减少被扫描攻击的风险,可以修改为其他端口(如2222):
Port 2222
修改后,连接时需指定端口:ssh -p 2222 用户名@IP
禁止root用户直接登录
出于安全考虑,建议禁止root直接SSH登录,改用普通用户登录后通过sudo提权:
PermitRootLogin no
限制允许登录的用户
如果希望只允许特定用户登录,可以添加:
AllowUsers alice bob
这样,只有alice和bob可以SSH登录,其他用户会被拒绝。
启用公钥认证
公钥认证比密码认证更安全。首先在客户端生成密钥对(若已生成可跳过):
ssh-keygen -t rsa -b 4096
然后将公钥复制到服务器:
ssh-copy-id 用户名@服务器IP
在配置文件中确保以下项未被注释:
PubkeyAuthentication yes
第三步:配置防火墙与网络访问
Ubuntu默认使用ufw作为防火墙管理工具。如果启用了ufw,需要放行SSH端口。
放行默认22端口
sudo ufw allow ssh
若修改了端口,放行自定义端口
sudo ufw allow 2222/tcp
然后重新加载防火墙:
sudo ufw reload
查看防火墙状态,确认规则已生效:
sudo ufw status
另外,如果服务器在云环境(如阿里云、AWS),还需要在安全组中放行对应端口。
第四步:重启SSH服务使配置生效
每次修改 sshd_config 后,都需要重启SSH服务:
sudo systemctl restart ssh
重启前建议先检查配置文件语法是否正确:
sudo sshd -t
如果输出没有错误,再执行重启。注意,重启SSH不会断开当前已有的连接,但新连接会使用新配置。
第五步:SSH安全加固建议
仅仅完成安装和基础配置还不够,以下措施能显著提升SSH的安全性。
- 禁用密码认证:在配置文件中设置
PasswordAuthentication no,仅允许密钥登录。这会彻底杜绝暴力破解密码的风险。 - 设置空闲超时:添加
ClientAliveInterval 300和ClientAliveCountMax 2,如果客户端5分钟无操作,服务器将断开连接。 - 限制SSH访问来源IP:通过防火墙或TCP Wrappers(
/etc/hosts.allow和/etc/hosts.deny)限制仅允许特定IP段连接。例如在ufw中:sudo ufw allow from 192.168.1.0/24 to any port 22 - 使用Fail2ban:安装fail2ban可以自动封禁多次尝试失败的IP。
sudo apt install fail2ban -y
安装后,fail2ban默认会监控SSH日志,并自动封禁恶意IP。
第六步:常见问题排查
1. 无法连接SSH服务
首先检查服务是否运行:sudo systemctl status ssh。然后查看端口是否监听:sudo ss -tlnp | grep 22。接着检查防火墙是否放行端口:sudo ufw status。最后确认目标IP是否正确,以及网络是否可达。
2. 连接被拒绝(Connection refused)
这通常意味着SSH服务未运行,或者端口被防火墙拦截。按上述顺序排查即可。
3. 密码正确但无法登录
检查 sshd_config 中是否设置了 AllowUsers 或 DenyUsers,以及 PasswordAuthentication 是否为yes。修改后重启服务。
4. 密钥登录失败
检查客户端公钥是否已添加到服务器的 ~/.ssh/authorized_keys 文件中,且该文件的权限应为600,目录权限应为700:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
同时检查服务器端 PubkeyAuthentication 是否为yes。
第七步:使用SSH的实用技巧
- 免密登录:使用密钥对后,每次登录不再需要输入密码。
- 别名连接:在客户端的
~/.ssh/config文件中配置别名,例如:Host myserver
HostName 192.168.1.100
User alice
Port 2222之后只需输入
ssh myserver即可连接。 - 文件传输:使用
scp或sftp命令在本地与服务器之间传输文件。例如:scp file.txt alice@server:/home/alice/ - 端口转发:通过
ssh -L 本地端口:目标地址:目标端口 用户@服务器实现隧道访问内网服务。
总结
在Ubuntu上配置SSH并不复杂,关键在于理解每个配置项的作用,并根据实际场景进行安全加固。本文从安装、基础配置、防火墙、安全加固到问题排查,覆盖了SSH配置的完整流程。建议读者在配置完成后,使用 sudo sshd -t 检查语法,并重启服务验证。对于生产环境,务必禁用密码登录、修改默认端口,并启用fail2ban等防护工具。通过合理的配置,SSH将成为你管理Ubuntu系统时最可靠、最安全的远程通道。