SSH (Secure Shell) 是一种加密的网络传输协议,用于在不安全的网络中提供安全的远程登录和其他安全网络服务。
SSH主要使用三种加密技术: - 对称加密:用于加密整个通信会话(如AES, 3DES) - 非对称加密:用于密钥交换和身份验证(如RSA, ECDSA, Ed25519) - 哈希算法:用于数据完整性验证(如SHA-2)
# 基本连接语法
ssh username@hostname
# 指定端口连接
ssh -p 2222 username@hostname
# 使用特定私钥连接
ssh -i ~/.ssh/custom_key username@hostname
# 从本地复制到远程
scp local_file username@remote_host:/remote/directory
# 从远程复制到本地
scp username@remote_host:/remote/file local_directory
# 递归复制目录
scp -r local_directory username@remote_host:/remote/directory
# 启动SFTP会话
sftp username@hostname
# 常用SFTP命令
get remote_file # 下载文件
put local_file # 上传文件
ls # 列出远程目录
lls # 列出本地目录
# 将本地端口8080转发到远程服务器的80端口
ssh -L 8080:localhost:80 username@remote_host
# 将远程端口3306转发到本地数据库的3306端口
ssh -R 3306:localhost:3306 username@remote_host
# 创建SOCKS代理(本地端口1080)
ssh -D 1080 username@remote_host
# 执行单条命令
ssh username@hostname "command"
# 执行多条命令
ssh username@hostname "command1; command2"
# 执行本地脚本
ssh username@hostname < local_script.sh
# 常用安全配置选项
Port 2222 # 更改默认端口
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码认证
AllowUsers user1 user2 # 只允许特定用户登录
MaxAuthTries 3 # 最大认证尝试次数
ClientAliveInterval 300 # 客户端活动检查间隔
ClientAliveCountMax 3 # 客户端活动检查次数
修改配置后需重启SSH服务:
sudo systemctl restart sshd
Host myserver
HostName server.example.com
User myusername
Port 2222
IdentityFile ~/.ssh/myserver_key
ServerAliveInterval 60
# 使用更安全的Ed25519算法
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或者使用RSA (至少4096位)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 传统方法
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@hostname
# 手动方法
cat ~/.ssh/id_ed25519.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 启动ssh-agent
eval "$(ssh-agent -s)"
# 添加密钥到agent
ssh-add ~/.ssh/id_ed25519
# 列出已加载密钥
ssh-add -l
双因素认证:
Fail2Ban集成:
# 安装fail2ban
sudo apt install fail2ban # Debian/Ubuntu
sudo yum install fail2ban # RHEL/CentOS
# 配置SSH防护
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
证书认证:
# 使用parallel-ssh工具
pssh -h hosts.txt -l username -A -i "uptime"
# 使用for循环
for server in $(cat servers.list); do
ssh $server "command"
done
# 使用Ansible(基于SSH)
ansible all -m ping
ansible-playbook deploy.yml
# 通过跳板机连接目标服务器
ssh -J jumpuser@jumphost:port targetuser@targethost
# 多跳转连接
ssh -J user1@host1:port1,user2@host2:port2 user3@host3
# 启用连接复用
Host *
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
ControlPersist 1h
# 详细输出模式
ssh -vvv username@hostname
# 检查SSH服务状态
sudo systemctl status sshd
# 检查日志
sudo journalctl -u sshd
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo tail -f /var/log/secure # RHEL/CentOS
# 启用压缩(低带宽环境)
ssh -C username@hostname
# 调整加密算法
Host *
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
可能原因及解决方案:
1. DNS反查问题:在sshd_config中设置UseDNS no
2. GSSAPI认证问题:客户端配置GSSAPIAuthentication no
3. IPv6问题:尝试-4
强制IPv4
通过深入理解和熟练应用SSH,Linux系统管理员可以高效、安全地管理分布式系统基础设施。