VPS安全加固完整手册2026:Fail2Ban、防火墙、SSH密钥、端口敲门实战

引言

VPS安全是每位服务器管理员必须重视的核心问题。根据2026年全球网络安全报告,平均每天有超过50万台VPS遭受暴力破解、DDoS攻击或恶意入侵。一次成功的安全入侵可能导致数据泄露、服务中断、甚至法律责任。本文将通过Fail2Ban、防火墙配置、SSH密钥认证、端口敲门(Port Knocking)四大实战技术,为您构建全方位的VPS安全防护体系。

VPS面临的主要安全威胁

1. 暴力破解攻击(Brute Force Attack)

攻击者使用自动化脚本尝试大量用户名和密码组合,试图登录您的VPS。

统计数据
- SSH默认端口22每天遭受数千次暴力破解尝试
- 弱密码在10分钟内可被破解
- 使用密码认证的VPS90%会在30天内被入侵

2. DDoS攻击

分布式拒绝服务攻击通过大量恶意流量淹没服务器,导致服务不可用。

3. 漏洞利用

操作系统或应用程序的未修补漏洞被攻击者利用。

4. 恶意软件和勒索软件

植入恶意代码、加密文件索要赎金。

5. 中间人攻击(MITM)

在网络传输过程中窃听或篡改数据。

安全加固第一层:SSH密钥认证

为什么要用SSH密钥替代密码?

SSH密钥认证相比密码认证有以下优势:

  1. 安全性更高:256位或更长密钥几乎无法被暴力破解
  2. 防止暴力破解:没有密码可猜
  3. 自动化友好:适合脚本和自动化工具
  4. 便捷性:一次配置,无需每次输入密码

生成SSH密钥对

在本地计算机生成密钥(Windows PowerShell)

# 生成ED25519密钥(推荐)
ssh-keygen -t ed25519 -C "your-email@example.com"

# 或使用RSA 4096位密钥(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

交互提示说明
- Enter file in which to save the key:按回车使用默认路径(推荐)
- Enter passphrase:建议设置密钥密码(可选但推荐)
- Enter same passphrase again:再次输入密钥密码

生成的文件说明

  • 私钥~/.ssh/id_ed25519(保密,不可泄露)
  • 公钥~/.ssh/id_ed25519.pub(可以放到服务器)

将公钥上传到VPS

方法一:使用ssh-copy-id(推荐)

# 上传公钥到VPS
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@vps-ip

# 如果SSH端口不是22
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@vps-ip

方法二:手动上传

# 在本地计算机查看公钥内容
cat ~/.ssh/id_ed25519.pub

# 复制输出的内容,然后在VPS上执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

禁用密码登录(关键步骤)

编辑SSH配置文件

sudo nano /etc/ssh/sshd_config

修改以下配置

# 禁用密码认证
PasswordAuthentication no

# 禁用空密码登录
PermitEmptyPasswords no

# 禁用root直接登录
PermitRootLogin no

# 仅允许密钥认证
AuthenticationMethods publickey

# 可选:修改默认SSH端口(降低暴力破解概率)
Port 2222

# 禁用SSHv1协议
Protocol 2

# 设置连接超时
ClientAliveInterval 300
ClientAliveCountMax 2

重启SSH服务

# Ubuntu/Debian
sudo systemctl restart ssh

# CentOS/RHEL
sudo systemctl restart sshd

测试密钥登录

# 在本地计算机测试新连接
ssh -p 2222 user@vps-ip

# 如果能成功登录,说明配置正确

SSH安全加固额外措施

1. 使用SSH Agent转发

# 在本地启动SSH Agent
eval $(ssh-agent -s)

# 添加私钥到Agent
ssh-add ~/.ssh/id_ed25519

# 登录VPS时启用Agent转发
ssh -A user@vps-ip

2. 限制SSH访问IP

# 编辑/etc/hosts.allow
sudo nano /etc/hosts.allow

# 添加允许的IP(示例)
sshd: 1.2.3.4
sshd: 192.168.1.

# 编辑/etc/hosts.deny
sudo nano /etc/hosts.deny

# 拒绝其他所有IP
sshd: ALL

3. 使用Google Authenticator双因素认证

# 安装Google Authenticator
sudo apt install -y libpam-google-authenticator

# 运行配置向导
google-authenticator

# 按照提示配置(推荐回答:y, y, y, n, y)

修改SSH配置启用2FA

sudo nano /etc/ssh/sshd_config

# 添加或修改
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

修改PAM配置

sudo nano /etc/pam.d/sshd

# 添加以下行
auth required pam_google_authenticator.so

安全加固第二层:防火墙配置

UFW防火墙(Ubuntu/Debian推荐)

UFW(Uncomplicated Firewall)是iptables的简化前端,易于使用。

安装和启用UFW

# 安装UFW
sudo apt update && sudo apt install -y ufw

# 设置默认策略(拒绝所有入站,允许所有出站)
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许SSH(如果修改了端口,记得改数字)
sudo ufw allow 2222/tcp

# 允许HTTP和HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用UFW
sudo ufw enable

# 查看状态
sudo ufw status verbose

UFW高级配置

# 限制SSH连接速率(防暴力破解)
sudo ufw limit 2222/tcp

# 允许特定IP访问SSH
sudo ufw allow from 1.2.3.4 to any port 2222

# 允许特定子网访问
sudo ufw allow from 192.168.1.0/24 to any port 80

# 拒绝特定IP
sudo ufw deny from 5.6.7.8

# 删除规则
sudo ufw delete allow 80/tcp

# 重置所有规则
sudo ufw reset

Firewalld防火墙(CentOS/RHEL推荐)

Firewalld是CentOS/RHEL的默认防火墙管理工具。

安装和启用Firewalld

# 安装Firewalld
sudo yum install -y firewalld

# 启动并启用开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 查看状态
sudo firewall-cmd --state

Firewalld基本配置

# 查看当前活动区域
sudo firewall-cmd --get-active-zones

# 允许SSH端口
sudo firewall-cmd --permanent --add-port=2222/tcp

# 允许HTTP和HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 重载配置
sudo firewall-cmd --reload

# 查看所有规则
sudo firewall-cmd --list-all

Firewalld富规则(Rich Rules)

# 限制SSH连接速率
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="5/m" accept'

# 允许特定IP访问SSH
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" port protocol="tcp" port="2222" accept'

# 拒绝特定IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="5.6.7.8" drop'

# 重载配置
sudo firewall-cmd --reload

iptables防火墙(高级用户)

iptables是Linux内核的包过滤框架,功能最强大但也最复杂。

基础规则配置

# 清除现有规则
sudo iptables -F
sudo iptables -X

# 设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立和相关的连接
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许SSH
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 允许HTTP和HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许ICMP(ping)
sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

# 记录丢弃的包(可选)
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "

防DDoS规则

# 限制单个IP的新连接速率
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 20/minute --limit-burst 100 -j ACCEPT

# 限制SYN洪水攻击
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 限制ping洪水
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

保存iptables规则

# Ubuntu/Debian
sudo iptables-save | sudo tee /etc/iptables/rules.v4

# CentOS/RHEL
sudo service iptables save

安全加固第三层:Fail2Ban入侵防御

Fail2Ban工作原理

Fail2Ban通过监控日志文件,检测异常行为(如多次登录失败),然后自动更新防火墙规则以阻止可疑IP。

安装Fail2Ban

# Ubuntu/Debian
sudo apt update && sudo apt install -y fail2ban

# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y fail2ban

配置Fail2Ban

主配置文件

# 复制默认配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
sudo nano /etc/fail2ban/jail.local

全局配置([DEFAULT]段)

[DEFAULT]
# 忽略的IP列表(白名单)
ignoreip = 127.0.0.1/8 ::1 1.2.3.4

# 封禁时间(秒),-1表示永久封禁
bantime = 3600

# 检测时间窗口(秒)
findtime = 600

# 最大重试次数
maxretry = 3

# 使用的防火墙后端
banaction = iptables-multiport

# 邮件通知设置(可选)
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s

SSH防护配置

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

Nginx防护配置

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600

[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 3600

WordPress防护配置

[wordpress-hard]
enabled = true
filter = wordpress-hard
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 86400

启动和监控Fail2Ban

# 启动Fail2Ban
sudo systemctl start fail2ban

# 设置开机自启
sudo systemctl enable fail2ban

# 查看运行状态
sudo systemctl status fail2ban

# 查看被封禁的IP
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 手动解封IP
sudo fail2ban-client set sshd unbanip 1.2.3.4

# 手动封禁IP
sudo fail2ban-client set sshd banip 5.6.7.8

自定义Fail2Ban过滤器

# 创建自定义过滤器
sudo nano /etc/fail2ban/filter.d/custom.conf

过滤器内容示例

[Definition]
failregex = ^<HOST> - - .*"GET /wp-login.php HTTP/1.1" 200
ignoreregex =

安全加固第四层:端口敲门(Port Knocking)

什么是端口敲门?

端口敲门是一种通过特定顺序访问一系列端口来动态开放防火墙端口的技术。它隐藏了服务的真实端口,大幅降低被扫描和攻击的风险。

安装和配置 knockd

# Ubuntu/Debian
sudo apt install -y knockd

# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y knock

配置knockd

sudo nano /etc/knockd.conf

配置文件示例

[options]
    UseSyslog

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 10
    command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 10
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

启动knockd

# 编辑/etc/default/knockd
sudo nano /etc/default/knockd

# 修改以下行
START_KNOCKD=1

# 启动服务
sudo systemctl start knockd
sudo systemctl enable knockd

使用端口敲门

在客户端敲门

# 方法一:使用knock工具
knock -v vps-ip 7000 8000 9000

# 方法二:使用nc(netcat)
for port in 7000 8000 9000; do nc -z vps-ip $port; done

# 方法三:使用bash
for port in 7000 8000 9000; do (echo > /dev/tcp/vps-ip/$port) 2>/dev/null; done

测试SSH连接

# 敲门后测试SSH连接
ssh -p 2222 user@vps-ip

安全加固第五层:系统级安全配置

1. 禁用root登录

# 创建普通用户
sudo adduser adminuser

# 授予sudo权限
sudo usermod -aG sudo adminuser

# 测试新用户能否sudo
su - adminuser
sudo whoami

2. 自动安全更新

# Ubuntu/Debian
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# CentOS/RHEL
sudo yum install -y yum-cron
sudo systemctl enable yum-cron
sudo systemctl start yum-cron

3. 安装和配置AIDE(入侵检测)

# 安装AIDE
sudo apt install -y aide

# 初始化数据库
sudo aideinit

# 定期检查(添加到cron)
sudo aide --check

4. 禁用不必要的服务

# 查看运行的服务
sudo systemctl list-units --type=service --state=running

# 禁用不必要的服务(示例)
sudo systemctl disable bluetooth
sudo systemctl disable cups

5. 配置sysctl安全参数

sudo nano /etc/sysctl.conf

添加以下安全参数

# 禁用IP转发
net.ipv4.ip_forward = 0

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0

# 启用SYN cookies(防SYN洪水)
net.ipv4.tcp_syncookies = 1

# 禁用ICMP重定向接受
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# 启用反向路径过滤(防IP欺骗)
net.ipv4.conf.all.rp_filter = 1

# 禁用IPv6(如果不使用)
net.ipv6.conf.all.disable_ipv6 = 1

应用配置

sudo sysctl -p

安全监控与日志分析

1. 安装和配置Logwatch

# 安装Logwatch
sudo apt install -y logwatch

# 配置每日邮件报告
sudo nano /etc/cron.daily/00logwatch

# 添加以下内容
/usr/sbin/logwatch --output mail --mailto admin@example.com --detail high

2. 使用PSAD检测端口扫描

# 安装PSAD
sudo apt install -y psad

# 配置PSAD
sudo nano /etc/psad/psad.conf

# 启动PSAD
sudo systemctl start psad

3. 监控异常登录

# 查看最近登录记录
last
lastb  # 查看失败登录尝试

# 实时监控auth.log
sudo tail -f /var/log/auth.log

安全加固检查清单

完成以下检查清单,确保VPS安全:

  • [ ] 禁用密码登录,仅使用SSH密钥
  • [ ] 修改默认SSH端口(22 → 自定义端口)
  • [ ] 配置防火墙(UFW/Firewalld/iptables)
  • [ ] 安装并配置Fail2Ban
  • [ ] 配置自动安全更新
  • [ ] 禁用root直接登录
  • [ ] 删除不必要的用户和组
  • [ ] 配置文件权限(/etc/passwd, /etc/shadow等)
  • [ ] 安装入侵检测系统(AIDE)
  • [ ] 配置日志监控和告警
  • [ ] 定期备份配置文件
  • [ ] 使用端口敲门隐藏SSH端口(可选)

结论

VPS安全加固是一个持续的过程,而非一次性任务。通过本文介绍的SSH密钥认证、防火墙配置、Fail2Ban入侵防御、端口敲门四大安全层,您可以大幅提升VPS的安全性。

核心建议
1. 最小权限原则:仅开放必要的端口和服务
2. 深度防御:多层安全措施互为补充
3. 持续监控:定期检查日志和异常行为
4. 及时更新:保持系统和软件最新
5. 定期审计:每季度进行一次安全审计

记住:安全不是产品,而是过程

相关文章推荐


本文详细介绍VPS安全加固实战技术,转载请注明出处。如有安全问题,欢迎在评论区讨论!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。