SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境,广泛应用于Linux系统的远程管理、文件传输等场景,通过SSH,用户可以以加密的方式远程登录服务器、执行命令、传输文件,相比传统的Telnet等协议,SSH能有效防止信息泄露和中间人攻击,本文将详细介绍SSH的使用方法,包括客户端连接、服务器配置、密钥认证、常用命令及安全优化等内容。
SSH客户端连接基础使用
SSH客户端是用户发起连接的工具,Linux系统通常默认安装OpenSSH客户端,Windows系统可通过PuTTY、Xshell等工具使用SSH,本文以Linux命令行客户端为例,介绍基本连接方法。
基本远程登录
通过ssh
命令可以远程登录到SSH服务器,基本语法为:
ssh [用户名]@[服务器IP地址或域名] [-p 端口号]
用户名
是目标服务器上的合法用户(如root、普通用户等),服务器IP地址或域名
是目标服务器的网络标识,-p
用于指定非默认的SSH端口(默认端口为22)。
示例:
- 以
admin
用户登录IP为168.1.100
的服务器(默认端口22):ssh admin@192.168.1.100
- 登录时指定自定义端口(如2222):
ssh admin@192.168.1.100 -p 2222
首次连接时,系统会提示服务器的SSH密钥指纹(用于验证服务器身份),输入yes
确认后即可建立连接,随后需输入服务器上该用户的密码完成登录。
客户端连接方式对比
连接方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
命令行ssh |
Linux/macOS系统,快速操作 | 无需额外安装,脚本友好 | 无图形界面,功能相对单一 |
图形化工具(如Xshell、PuTTY) | Windows系统,需图形界面 | 支持多标签、会话保存、可视化操作 | 需额外安装,Windows默认不提供 |
终端模拟器(如iTerm2) | macOS系统,高级用户 | 支持分屏、快捷键、主题定制 | 仅限macOS系统 |
SSH服务器配置(以Linux为例)
若要作为SSH服务器提供服务,需安装并配置OpenSSH服务器软件(通常为openssh-server
)。
安装SSH服务器
- Ubuntu/Debian系统:
sudo apt update && sudo apt install openssh-server
- CentOS/RHEL系统:
sudo yum install openssh-server
安装完成后,SSH服务会自动启动(可通过systemctl status sshd
检查状态),若未启动,使用sudo systemctl start sshd
启动,并设置开机自启(sudo systemctl enable sshd
)。
配置SSH服务
SSH服务的主配置文件为/etc/ssh/sshd_config
,通过修改此文件可调整服务器行为,常用配置参数如下:
参数 | 作用 | 推荐值 |
---|---|---|
Port |
指定SSH监听端口 | 非默认端口(如2222),避免默认端口22被暴力破解 |
PermitRootLogin |
是否允许root用户直接登录 | no (禁止root直接登录,提升安全性) |
PasswordAuthentication |
是否允许密码认证 | no (仅密钥认证,更安全)或yes (兼容密码登录) |
PubkeyAuthentication |
是否允许公钥认证 | yes (推荐开启,结合密钥使用) |
AllowUsers |
允许登录的用户列表(空表表示所有用户) | admin,user1 (仅允许指定用户登录) |
MaxAuthTries |
最大认证尝试次数 | 3 (防止暴力破解) |
修改配置示例:
- 禁用root直接登录,修改端口为2222:
sudo sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sudo sed -i 's/^Port 22/Port 2222/' /etc/ssh/sshd_config
- 限制仅
admin
和user1
用户登录:echo "AllowUsers admin user1" | sudo tee -a /etc/ssh/sshd_config
配置修改后,需重启SSH服务使生效:
sudo systemctl restart sshd
SSH密钥认证(免密登录)
密码认证存在暴力破解风险,推荐使用SSH密钥认证(公钥/私钥对)实现免密登录,提升安全性。
生成SSH密钥对
在客户端机器上执行ssh-keygen
生成密钥对(默认存放在~/.ssh/
目录):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa
:指定密钥类型为RSA(也可用ed25519
等更安全的算法);-b 4096
:密钥长度为4096位(越长越安全);-C
:注释字段,可填写邮箱或标识信息(便于区分密钥)。
执行过程中会提示输入私钥密码(可选,用于保护私钥文件,若不输入则为空密码),最终生成id_rsa
(私钥,需保密)和id_rsa.pub
(公钥,可公开)。
上传公钥到服务器
将客户端的公钥内容追加到服务器目标用户的~/.ssh/authorized_keys
文件中:
-
方法1:使用
ssh-copy-id
命令(推荐):ssh-copy-id -i ~/.ssh/id_rsa.pub admin@192.168.1.100 -p 2222
执行后会提示输入服务器用户密码,成功后公钥会自动添加到服务器
~/.ssh/authorized_keys
。 -
方法2:手动上传:
- 在客户端复制公钥内容:
cat ~/.ssh/id_rsa.pub
- 登录服务器,创建
~/.ssh
目录(若不存在)并设置权限:mkdir -p ~/.ssh && chmod 700 ~/.ssh
- 追加到
authorized_keys
文件:echo "客户端公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
- 在客户端复制公钥内容:
测试免密登录
完成公钥上传后,再次执行ssh
命令即可免密登录:
ssh admin@192.168.1.100 -p 2222
SSH常用高级命令
SSH除远程登录外,还支持文件传输、端口转发等功能,提升工作效率。
文件传输
-
scp
(Secure Copy):加密复制文件/目录,语法为:scp [选项] 本地文件/目录 用户@服务器:远程路径
示例:
- 本地文件
test.txt
上传到服务器/home/admin/
:scp test.txt admin@192.168.1.100:/home/admin/
- 下载服务器
/home/admin/data.zip
到本地当前目录:scp admin@192.168.1.100:/home/admin/data.zip ./
- 传输整个目录(需加
-r
参数):scp -r local_dir admin@192.168.1.100:/home/admin/
- 本地文件
-
sftp
(SSH File Transfer Protocol):交互式文件传输,类似FTP但加密,执行sftp admin@192.168.1.100
后进入交互界面,常用命令包括put
(上传)、get
(下载)、ls
(列表)、cd
(切换目录)等。
端口转发
SSH可通过隧道转发端口,实现安全访问内网服务或绕过防火墙限制。
-
本地端口转发:将本地端口映射到远程服务器端口(如访问本地8080端口,实际转发到远程服务器的80端口):
ssh -L 8080:localhost:80 admin@192.168.1.100
执行后,本地访问
http://localhost:8080
即等同于访问远程服务器的http://localhost:80
。 -
远程端口转发:将远程服务器端口映射到本地端口(适用于内网服务器通过外网SSH服务器暴露服务):
ssh -R 8080:localhost:80 admin@192.168.1.100
执行后,远程服务器可通过
localhost:8080
访问本地80端口服务。
SSH安全优化建议
为提升SSH服务安全性,建议采取以下措施:
- 禁用密码认证:仅启用密钥认证(
PasswordAuthentication no
),避免暴力破解; - 修改默认端口:将
Port
改为非2222的高位端口(如22222),减少自动化攻击扫描; - 使用fail2ban:安装
fail2ban
工具,监控SSH登录失败日志,自动封禁恶意IP; - 限制登录用户:通过
AllowUsers
或DenyUsers
参数限制允许登录的用户; - 定期更新SSH软件:通过系统包管理器更新
openssh-server
至最新版本,修复安全漏洞; - 禁用空密码账户:确保服务器所有用户均设置复杂密码(若未禁用密码认证)。
相关问答FAQs
Q1: SSH连接时提示“Permission denied (publickey,password)”怎么办?
A: 通常是因为认证方式配置问题或密钥未正确上传,解决步骤:
- 检查服务器
/etc/ssh/sshd_config
中PasswordAuthentication
和PubkeyAuthentication
是否至少有一个为yes
(若仅用密钥认证,确保PubkeyAuthentication yes
); - 确认客户端公钥是否已上传到服务器
~/.ssh/authorized_keys
,并检查文件权限(600
)和目录权限(700
); - 若使用密钥认证,确保客户端指定了正确的私钥文件(
ssh -i ~/.ssh/id_rsa admin@...
)。
Q2: 如何查看SSH服务的连接日志和登录历史?
A:
- SSH服务日志:默认位于
/var/log/auth.log
(Ubuntu/Debian)或/var/log/secure
(CentOS/RHEL),记录登录成功/失败信息,可通过grep "sshd" /var/log/auth.log
查看; - 用户登录历史:服务器用户可通过
last
命令查看本机登录记录(包括SSH登录),或检查~/.ssh/authorized_keys
文件修改时间(判断是否有异常公钥添加)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/17426.html