SSH远程连接
SSH(Secure Shell)是Linux系统管理中最常用的远程连接协议,提供加密的安全通信通道。
基础连接
连接远程主机
# 基本连接
ssh user@hostname # 用户名@主机名
ssh user@192.168.1.100 # 用户名@IP地址
ssh -p 2222 user@host # 指定端口(默认22)
# 首次连接会提示确认主机指纹
The authenticity of host '192.168.1.100' can't be established.
ECDSA key fingerprint is SHA256:xxx...
Are you sure you want to continue? yes/no? yes常用选项
ssh -v user@host # 显示详细信息(调试用)
ssh -vvv user@host # 更详细的调试信息
ssh -i ~/.ssh/id_rsa user@host # 指定私钥文件
ssh -L 8080:localhost:80 user@host # 本地端口转发
ssh -J jumpuser@jumphost user@host # 通过跳板机连接SSH密钥认证
生成密钥对
# 生成RSA密钥(默认)
ssh-keygen -t rsa -b 4096
# 生成ED25519密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 交互过程
Enter file to save the key: # 默认 ~/.ssh/id_ed25519
Enter passphrase: # 可选密码保护私钥分发公钥到远程主机
# 自动复制公钥
ssh-copy-id user@host
# 手动复制(当ssh-copy-id不可用时)
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 设置正确权限(远程主机上)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys密钥类型对比
| 类型 | 长度 | 安全性 | 性能 | 推荐 |
|---|---|---|---|---|
| RSA | 2048-4096 | 足够 | 较慢 | 兼容性好 |
| ED25519 | 256位 | 很高 | 很快 | 首选 |
| ECDSA | 256-521位 | 高 | 快 | 可选 |
SSH配置文件
客户端配置 (~/.ssh/config)
# 基本配置
Host myserver
HostName 192.168.1.100
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519
# 跳板机配置
Host target
HostName 10.0.0.50
User app
ProxyJump jumpuser@jumphost.example.com
# 多主机配置
Host web-*
User webadmin
IdentityFile ~/.ssh/web_key
Host web-01
HostName 192.168.1.101
Host web-02
HostName 192.168.1.102
# 保持连接
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes使用配置后,连接简化为:
ssh myserver # 直接使用别名服务端配置 (/etc/ssh/sshd_config)
# 基本设置
Port 22 # 监听端口
ListenAddress 0.0.0.0 # 监听地址
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码登录(仅密钥)
PubkeyAuthentication yes # 启用公钥认证
# 安全设置
MaxAuthTries 3 # 最大认证尝试次数
LoginGraceTime 60 # 登录超时时间(秒)
ClientAliveInterval 300 # 客户端存活检测间隔
ClientAliveCountMax 2 # 存活检测次数
# 修改后重启服务
sudo systemctl restart sshdSCP文件传输
复制文件
# 本地 → 远程
scp file.txt user@host:/path/to/destination/
scp -r folder/ user@host:/remote/path/ # 复制目录
# 远程 → 本地
scp user@host:/remote/file.txt ./local/path/
scp -r user@host:/remote/folder/ ./local/
# 指定端口
scp -P 2222 file.txt user@host:/path/
# 使用SSH配置别名
scp file.txt myserver:/path/SFTP安全文件传输
# 连接
sftp user@host
# 常用命令
sftp> ls # 列出远程目录
sftp> lls # 列出本地目录
sftp> cd /remote/path # 切换远程目录
sftp> lcd /local/path # 切换本地目录
sftp> get remote_file # 下载文件
sftp> put local_file # 上传文件
sftp> mget *.txt # 批量下载
sftp> mput *.txt # 批量上传
sftp> exit # 退出端口转发
本地端口转发
# 将远程服务的端口映射到本地
ssh -L 8080:localhost:80 user@host
# 访问远程MySQL(远程仅监听localhost)
ssh -L 3306:localhost:3306 user@host
# 通过跳板机访问内网服务
ssh -L 8080:internal-server:80 user@jumphost远程端口转发
# 将本地服务暴露给远程
ssh -R 8080:localhost:80 user@host
# 场景:让外部访问本地的开发服务器
ssh -R public-port:localhost:3000 user@public-server动态端口转发(SOCKS代理)
# 创建本地SOCKS5代理
ssh -D 1080 user@host
# 浏览器设置SOCKS5代理为 localhost:1080
# 所有流量通过SSH隧道转发安全加固
禁用密码登录
# 编辑 /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
# 确保已配置密钥认证后再禁用!
sudo systemctl restart sshd使用Fail2ban防暴力破解
# 安装
sudo apt install fail2ban
# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m
# 启动服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban更改默认端口
# 编辑 /etc/ssh/sshd_config
Port 2222
# 注意更新防火墙规则
sudo ufw allow 2222/tcp
sudo systemctl restart sshd常见问题排查
# 检查SSH服务状态
sudo systemctl status sshd
# 查看SSH日志
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo tail -f /var/log/secure # RHEL/CentOS
# 测试连接
ssh -vvv user@host # 详细调试输出
# 检查端口
sudo ss -tlnp | grep 22
# 检查配置文件语法
sudo sshd -t快速参考
| 命令 | 说明 |
|---|---|
ssh user@host | 连接远程主机 |
ssh -i key.pem user@host | 使用指定密钥 |
ssh -L local:remote host | 本地端口转发 |
ssh -R remote:local host | 远程端口转发 |
ssh -D port host | SOCKS代理 |
ssh-keygen -t ed25519 | 生成密钥 |
ssh-copy-id user@host | 复制公钥 |
scp file user@host:/path | 复制文件 |
sftp user@host | 安全FTP |