SSH on Virtual Hosting: The Complete Guide to Secure Server Management
安全外壳 (SSH) 是任何系统管理员工具库中最强大和最必要的工具之一。无论您是在管理小型个人项目还是运行生产 Web 应用程序,SSH 都能为您提供加密、经过身份验证的远程服务器访问 — 让您可以执行命令、传输文件和配置服务,而无需接触物理机器。
本综合指南涵盖了在虚拟主机环境中使用 SSH 所需了解的所有内容:从首次连接到强化设置以防止暴力攻击。
目录
- 什么是 SSH 以及为什么重要?
- 连接前的先决条件
- 如何通过 SSH 访问您的服务器
- 用于服务器管理的基本 SSH 命令
- 强化您的 SSH 配置
- SSH 密钥身份验证:正确的登录方式
- 使用 SCP 和 SFTP 安全传输文件
- SSH 故障排除提示
- 结论
1. 什么是 SSH 以及为什么重要? {#what-is-ssh}
SSH(安全外壳)是一种加密网络协议,可在您的本地机器(客户端)和远程服务器之间创建加密隧道。与 Telnet 或 FTP 等较旧的协议不同,SSH 加密所有流量 — 包括凭据 — 使攻击者几乎不可能在传输过程中拦截敏感数据。
SSH 是以下方面的标准方法:
- 远程命令行访问 — 在您的服务器上运行任何 Linux/Unix 命令,就像您坐在它前面一样
- 安全文件传输 — 使用 SCP 或 SFTP 在机器之间移动文件
- 隧道和端口转发 — 通过 SSH 连接安全地路由其他协议
- 自动化部署和脚本 — CI/CD 管道、cron 作业和备份脚本都依赖于 SSH
- 管理 Web 服务器和应用程序 — 配置 Nginx、Apache、MySQL 等
如果您运行的是 VPS 主机计划或 专用服务器,SSH 几乎肯定是您日常管理的主要界面。
2. 连接前的先决条件 {#prerequisites}
在建立首次 SSH 连接之前,请确保您具有以下内容:
| 要求 | 详情 |
|---|---|
| 服务器 IP 地址 | 在您的主机控制面板或欢迎电子邮件中提供 |
| SSH 用户名 | 对于新鲜 VPS 通常为 root,或在托管环境中为自定义用户 |
| SSH 密码或密钥 | 在配置期间设置或通过电子邮件发送 |
| SSH 客户端 | 内置于 Linux/macOS;Windows 上为 PuTTY 或 Windows 终端 |
| SSH 端口 | 默认为 22,但可能会为了安全而自定义 |
> 注意:如果您使用的是 共享 Web 主机计划,SSH 访问可能受到限制或需要在控制面板中明确激活。请与您的提供商联系。
3. 如何通过 SSH 访问您的服务器 {#accessing-via-ssh}
步骤 1:打开您的终端或 SSH 客户端
- Linux / macOS:打开内置的终端应用程序
- Windows 10/11:使用 Windows 终端、PowerShell 或命令提示符(都包含本机 SSH 客户端)
- Windows(旧版):下载 PuTTY 作为免费 SSH 客户端
步骤 2:连接到您的服务器
使用以下语法:
ssh username@your_server_ip示例:
ssh root@203.0.113.45如果您的服务器使用非标准端口(稍后会详细介绍为什么应该更改它),请使用 -p 标志指定它:
ssh username@your_server_ip -p 2222步骤 3:验证主机指纹
首次连接到新服务器时,SSH 将显示如下消息:
The authenticity of host '203.0.113.45 (203.0.113.45)' can't be established.
ED25519 key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no/[fingerprint])?输入 yes 并按 Enter。SSH 将服务器的指纹保存到您的 ~/.ssh/known_hosts 文件。在将来的连接中,它将自动验证服务器的身份 — 如果有任何变化,将向您发出警报(这可能表示中间人攻击)。
步骤 4:身份验证
出现提示时输入您的密码。请注意,终端在您输入时不会显示任何字符 — 这是出于安全原因的正常行为。
身份验证后,您将看到服务器的命令提示符,通常类似于:
root@hostname:~#您现在已连接,可以开始管理您的服务器。
4. 用于服务器管理的基本 SSH 命令 {#essential-commands}
连接后,您可以完全访问 Linux 命令行。以下是用于管理虚拟主机环境的最重要命令:
文件和目录操作
# List files and directories with details
ls -la
# Change to a specific directory
cd /var/www/html
# Create a new directory
mkdir my_project
# Remove a file
rm filename.txt
# Remove a directory and its contents
rm -rf /path/to/directory
# Copy a file
cp source.txt destination.txt
# Move or rename a file
mv oldname.txt newname.txt查看和编辑文件
# View file contents
cat /etc/nginx/nginx.conf
# View large files page by page
less /var/log/nginx/access.log
# Edit a file with nano (beginner-friendly)
nano /etc/ssh/sshd_config
# Edit a file with vim (advanced)
vim /etc/nginx/sites-available/default系统监控
# Check disk usage (human-readable)
df -h
# Check memory usage
free -m
# Real-time process monitor
top
# Enhanced process monitor (install if needed)
htop
# Check running services
systemctl status nginx
# View recent system logs
journalctl -xe包管理 (Ubuntu/Debian)
# Update package list
sudo apt update
# Upgrade installed packages
sudo apt upgrade -y
# Install a package
sudo apt install package-name
# Remove a package
sudo apt remove package-name网络诊断
# Check open ports and listening services
ss -tulnp
# Test connectivity to a host
ping google.com
# Trace the network route to a host
traceroute google.com
# Check your server's public IP
curl ifconfig.me5. 强化您的 SSH 配置 {#hardening-ssh}
默认 SSH 配置在功能上是可行的,但在安全性方面并不是最优的。由于 SSH 暴露在互联网上,它是自动暴力攻击的持续目标。以下步骤显著减少了您的攻击面。
所有更改都在 SSH 守护进程配置文件中进行:
sudo nano /etc/ssh/sshd_config进行任何更改后,始终重新加载 SSH 服务:
sudo systemctl reload sshd> ⚠️ 关键警告:在对 SSH 配置进行更改之前,始终保持第二个终端会话打开并连接。如果您错误配置 SSH 并失去访问权限,您可能需要使用您的主机提供商的应急控制台来恢复。
步骤 1:更改默认 SSH 端口
端口 22 是默认 SSH 端口,不断被自动机器人扫描。将其更改为高的、非标准的端口不会阻止坚定的攻击者,但会大大减少来自自动扫描的噪音。
在 /etc/ssh/sshd_config 中,找到并修改:
# Before:
#Port 22
# After:
Port 2222删除 # 以取消注释该行,并设置您选择的端口(使用 1024 到 65535 之间的任何未使用的数字)。
重要:如果您运行防火墙(您应该运行),请在重新加载 SSH 之前允许新端口:
# UFW (Ubuntu/Debian)
sudo ufw allow 2222/tcp
sudo ufw deny 22/tcp
# firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload步骤 2:禁用 Root 登录
直接以 root 身份通过 SSH 登录是一个重大的安全风险。相反,创建一个常规用户帐户并使用 sudo 进行管理任务。
在 /etc/ssh/sshd_config 中:
# Before:
PermitRootLogin yes
# After:
PermitRootLogin no禁用 root 登录之前,请确保您已:
- 创建了非 root 用户:
adduser myuser - 授予 sudo 权限:
usermod -aG sudo myuser - 验证您可以在单独的会话中以该用户身份登录
步骤 3:限制登录尝试
添加这些指令以减少暴力破解的有效性:
# Maximum authentication attempts per connection
MaxAuthTries 3
# Maximum concurrent unauthenticated connections
MaxStartups 10:30:60
# Disconnect idle sessions after 5 minutes
ClientAliveInterval 300
ClientAliveCountMax 2步骤 4:将 SSH 访问限制为特定用户
如果只有某些用户需要 SSH 访问,请明确将其列入白名单:
AllowUsers myuser deployuser步骤 5:禁用密码身份验证(设置 SSH 密钥后)
配置 SSH 密钥身份验证后(请参阅下一部分),完全禁用基于密码的登录:
PasswordAuthentication no
ChallengeResponseAuthentication no这个单一的更改消除了整个密码暴力攻击类别。
6. SSH 密钥身份验证:正确的登录方式 {#ssh-key-authentication}
SSH 密钥是加密密钥对 — 保留在本地机器上的私钥和驻留在服务器上的公钥。身份验证的工作原理是证明您拥有私钥,而无需传输它。这比密码安全得多。
步骤 1:生成 SSH 密钥对
在您的 本地机器上运行此命令(不是服务器):
ssh-keygen -t ed25519 -C "your_email@example.com"> 为什么是 Ed25519?它比较旧的 RSA 算法更快、更安全。如果您的系统不支持它,请改用 ssh-keygen -t rsa -b 4096。
系统将提示您:
- 选择文件位置 — 按 Enter 接受默认值(
~/.ssh/id_ed25519) - 设置密码短语 — 强烈推荐;这会加密您的私钥,使其在被盗时无用
这会创建两个文件:
~/.ssh/id_ed25519— 您的 私钥(永远不要共享)~/.ssh/id_ed25519.pub— 您的 公钥(这放在服务器上)
步骤 2:将公钥复制到您的服务器
最简单的方法:
ssh-copy-id username@your_server_ip或手动,如果 ssh-copy-id 不可用:
# On your local machine, display your public key:
cat ~/.ssh/id_ed25519.pub
# On the server, add it to the authorized keys file:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "your_public_key_content" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys步骤 3:使用您的 SSH 密钥连接
# Standard port
ssh username@your_server_ip
# Custom port
ssh username@your_server_ip -p 2222SSH 将自动使用您的密钥。如果您设置了密码短语,系统会提示您输入(这是您的本地密码短语,而不是您的服务器密码)。
步骤 4:使用 SSH 配置文件简化连接
如果您管理多个服务器,请创建 SSH 配置文件以避免输入长命令:
nano ~/.ssh/config添加如下条目:
Host myserver
HostName 203.0.113.45
User myuser
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host staging
HostName 203.0.113.100
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519现在您可以简单地连接:
ssh myserver7. 使用 SCP 和 SFTP 安全传输文件 {#file-transfers}
SSH 支持两种安全文件传输方法:SCP(安全复制协议)用于快速传输,SFTP(SSH 文件传输协议)用于交互式会话。
SCP — 快速文件传输
将文件从本地机器复制到服务器:
scp /path/to/local/file.txt username@your_server_ip:/path/to/remote/directory/将文件从服务器复制到本地机器:
scp username@your_server_ip:/path/to/remote/file.txt /path/to/local/directory/递归复制整个目录:
scp -r /path/to/local/folder username@your_server_ip:/path/to/remote/使用自定义端口:
scp -P 2222 file.txt username@your_server_ip:/destination/> 注意:SCP 使用 -P(大写)表示端口,与 SSH 使用 -p(小写)不同。
SFTP — 交互式文件管理
SFTP 提供交互式 shell 来浏览和管理远程文件:
sftp username@your_server_ip连接后,使用这些命令:
# List remote files
ls
# List local files
lls
# Change remote directory
cd /var/www/html
# Change local directory
lcd ~/Downloads
# Upload a file
put localfile.txt
# Download a file
get remotefile.txt
# Exit
bye对于图形 SFTP 客户端,FileZilla 或 Cyberduck 等工具通过 SFTP 连接并提供拖放界面 — 如果您不喜欢使用命令行进行文件管理,这是理想的选择。
8. SSH 故障排除提示 {#troubleshooting}
| 问题 | 可能的原因 | 解决方案 |
|---|---|---|
Connection refused | SSH 未运行、端口错误或防火墙阻止 | 检查 systemctl status sshd、验证端口、检查防火墙规则 |
Connection timed out | 防火墙阻止连接 | 验证防火墙规则允许您的 SSH 端口 |
Permission denied (publickey) | 密钥错误、用户错误或密钥未授权 | 检查 ~/.ssh/authorized_keys 权限;验证正在使用正确的密钥 |
Host key verification failed | 服务器指纹已更改 | 删除旧条目:ssh-keygen -R your_server_ip |
Too many authentication failures | SSH |
