服务器SSH(Secure Shell)是一种加密的网络传输协议,主要用于在不安全的网络中为网络服务提供安全的传输环境,常用于远程登录、命令执行、文件传输等场景,相较于传统的Telnet、FTP等明文传输协议,SSH通过加密算法和认证机制确保数据传输的机密性和完整性,已成为服务器远程管理的标准工具。
SSH的核心工作原理
SSH基于客户端-服务器架构,通过分层加密和密钥交换机制保障通信安全,其工作流程可概括为以下步骤:
- TCP连接建立:客户端默认通过22端口与服务器建立TCP连接(端口可配置)。
- 版本协商:双方交换SSH协议版本号,确定兼容的加密算法(如AES、RSA、ECC等)。
- 密钥交换:基于Diffie-Hellman(DH)算法进行密钥交换,生成会话密钥(对称加密密钥),确保后续通信的加密性。
- 身份认证:客户端通过密码或公钥私钥对向服务器证明身份,服务器需验证客户端的合法性。
- 加密通信:认证通过后,所有数据(包括命令输入、输出结果、文件传输内容等)均通过会话密钥加密传输,防止窃听或篡改。
SSH的核心优势
与传统远程管理协议相比,SSH具备以下显著优势:
- 数据加密:采用AES、3DES等对称加密算法和RSA、DSA等非对称加密算法,全程加密数据,避免敏感信息(如密码、配置文件)泄露。
- 身份认证灵活:支持密码认证和公钥私钥认证(更安全),可结合双因素认证(如OTP)增强安全性。
- 端口转发与隧道:支持本地转发(将本地端口流量通过SSH隧道转发至远程)、远程转发(将远程端口流量转发至本地)和动态转发(SOCKS代理),可用于穿透防火墙或加密非SSH服务(如数据库、VNC)。
- 命令执行与文件传输:除远程登录外,SSH可通过
ssh user@host "command"
直接执行远程命令;结合SCP(Secure Copy)或SFTP(SSH File Transfer Protocol)实现安全文件传输,替代不安全的FTP。 - 多路复用:支持单连接多会话,通过
ProxyCommand
或mosh
(移动优化SSH)提升弱网络环境下的稳定性。
服务器端SSH配置
SSH服务器的核心配置文件为/etc/ssh/sshd_config
,需根据安全需求调整关键参数,以下是常见配置项及说明:
配置参数 | 默认值 | 建议值 | 说明 |
---|---|---|---|
Port | 22 | 非22端口(如2222) | 修改默认端口,降低自动化攻击风险 |
PermitRootLogin | yes | no | 禁止root直接登录,需通过普通用户sudo提权 |
PasswordAuthentication | yes | no | 禁用密码登录,仅允许公钥认证(提升安全性) |
PubkeyAuthentication | yes | yes | 启用公钥认证(需配合AuthorizedKeysFile 指定公钥存储路径) |
PermitEmptyPasswords | no | no | 禁止空密码登录 |
MaxAuthTries | 6 | 3 | 限制每连接最大认证尝试次数,防暴力破解 |
ClientAliveInterval | 0 | 300 | 设置客户端心跳间隔(秒),避免长时间无操作连接断开 |
ClientAliveCountMax | 3 | 0 | 超过最大心跳次数后断开连接(结合ClientAliveInterval 使用) |
AllowUsers | 无 | 指定用户(如”admin user1″) | 仅允许特定用户登录,格式为”用户名@主机名”(主机名可选) |
DenyUsers | 无 | 禁用用户(如”test guest”) | 明确禁止特定用户登录 |
配置步骤:
- 备份原配置文件:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 编辑配置文件:
vim /etc/ssh/sshd_config
,按需修改上述参数。 - 重启SSH服务:
systemctl restart sshd
(CentOS 7+/Ubuntu 16.04+)或service sshd restart
。
客户端SSH连接方法
基本登录
- 密码登录:
ssh username@server_ip -p 端口号
(如ssh admin@192.168.1.100 -p 2222
)。 - 密钥登录:
- 生成密钥对(本地客户端):
ssh-keygen -t rsa -b 4096
(默认生成~/.ssh/id_rsa
私钥和~/.ssh/id_rsa.pub
公钥)。 - 上传公钥至服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip
(自动将公钥追加至服务器~/.ssh/authorized_keys
)。 - 登录时无需密码:
ssh username@server_ip
。
- 生成密钥对(本地客户端):
高级功能
- 端口转发:
- 本地转发:将本地端口
8080
流量转发至远程服务器168.1.100
的80
端口:ssh -L 8080:192.168.1.100:80 username@server_ip
。 - 远程转发:将远程服务器端口
9090
转发至本地8080
端口:ssh -R 9090:localhost:8080 username@server_ip
。
- 本地转发:将本地端口
- X11转发:运行远程图形化程序:
ssh -X username@server_ip "firefox"
(需服务器开启X11Forwarding yes
)。 - 多路复用:通过
~/.ssh/config
配置复用连接,减少重复认证:Host server1 HostName 192.168.1.100 User admin Port 2222 ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
SSH安全加固实践
为防范暴力破解、中间人攻击等风险,需进一步强化SSH安全:
- 禁用密码登录:仅允许公钥认证,避免弱密码被破解。
- 使用fail2ban:安装并配置
fail2ban
,监控SSH登录日志,对连续失败IP进行临时封禁(如sshd
过滤器,封禁30分钟):sudo apt install fail2ban # Ubuntu/Debian sudo yum install fail2ban # CentOS/RHEL
编辑
/etc/fail2ban/jail.local
:[sshd] enabled = true port = 2222 maxretry = 3 bantime = 1800 findtime = 600
- 限制登录IP:通过防火墙(如iptables、firewalld)仅允许信任IP访问SSH端口:
iptables -A INPUT -p tcp --dport 2222 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j DROP
- 定期更新SSH软件:通过包管理器更新OpenSSH至最新版本,修复已知漏洞:
sudo apt update && sudo apt upgrade openssh-server # Ubuntu/Debian sudo yum update openssh-server # CentOS/RHEL
常见问题排查
-
连接超时或拒绝连接:
- 检查SSH服务状态:
systemctl status sshd
(确保服务运行)。 - 检查防火墙规则:
iptables -L -n
或firewall-cmd --list-ports
,确认SSH端口(如2222)已开放。 - 检查SELinux状态(CentOS):
sestatus
,若开启需执行setsebool -P sshd_can_network_connect 1
。
- 检查SSH服务状态:
-
认证失败(Permission denied):
- 密钥认证失败:检查服务器
~/.ssh/authorized_keys
权限(需为600
,属主为登录用户)。 - 密码认证失败:确认用户名、密码正确,检查
/etc/ssh/sshd_config
中PasswordAuthentication
是否为yes
。
- 密钥认证失败:检查服务器
相关问答FAQs
Q1: SSH连接时出现“Permission denied (publickey,password).”错误,如何解决?
A: 该错误通常由认证配置问题导致,排查步骤如下:
- 确认服务器
/etc/ssh/sshd_config
中PubkeyAuthentication
和PasswordAuthentication
至少一项为yes
(若使用密钥登录,确保PubkeyAuthentication yes
)。 - 检查客户端公钥是否已上传至服务器:
cat ~/.ssh/id_rsa.pub | ssh username@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
。 - 确认服务器
~/.ssh
目录权限为700
,authorized_keys
文件权限为600
:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
。 - 检查用户是否在
DenyUsers
或允许列表外(若配置AllowUsers
,需确保用户在列表内)。
Q2: 如何修改SSH默认端口(如从22改为2222)?
A: 修改SSH端口需同时调整服务器配置和防火墙规则,步骤如下:
- 编辑SSH配置文件:
vim /etc/ssh/sshd_config
,将Port 22
改为Port 2222
(确保端口未被其他服务占用)。 - 重启SSH服务:
systemctl restart sshd
。 - 更新防火墙规则(以firewalld为例):
sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload
- 更新SELinux策略(若开启):
semanage port -a -t ssh_port_t -p tcp 2222
(需安装policycoreutils-python
)。 - 客户端连接时需指定新端口:
ssh username@server_ip -p 2222
。 - (可选)若需彻底禁用22端口,在防火墙中移除22端口规则:
sudo firewall-cmd --permanent --remove-port=22/tcp
并重载。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/40060.html