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

密钥类型对比

类型长度安全性性能推荐
RSA2048-4096足够较慢兼容性好
ED25519256位很高很快首选
ECDSA256-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 sshd

SCP文件传输

复制文件

# 本地 → 远程
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 hostSOCKS代理
ssh-keygen -t ed25519生成密钥
ssh-copy-id user@host复制公钥
scp file user@host:/path复制文件
sftp user@host安全FTP