CG-spring/vps-security-pro
GitHub: CG-spring/vps-security-pro
一份面向运维人员的VPS安全加固进阶指南,涵盖SSH加固、防火墙、入侵防御、DDoS防护和监控告警的完整脚本与配置方案。
Stars: 0 | Forks: 0
# VPS 安全防护进阶指南
[](LICENSE)
[](https://github.com/CG-spring/vps-security-pro/stargazers)
**中文** | **[English](README_EN.md)**
## 目录
- [为什么需要进阶安全防护?](#为什么需要进阶安全防?
- [SSH 高级加固](#ssh-高级加固)
- [企业级防火墙配置](#企业级防火墙配置)
- [fail2ban 高级配置](#fail2ban-高级配置)
- [DDoS 防护方案](#ddos-防护方案)
- [安全监控与告警](#安全监控与告?
- [安全脚本集合](#安全脚本集合)
- [常见问题](#常见问题)
## 为什么需要进阶安全防护?
### 普通防?vs 企业级防?
| 防护层级 | 普通方?| 企业级方?|
|----------|----------|------------|
| SSH 加固 | 修改端口 | 密钥+IP白名?|
| 防火?| 基础端口 | 复杂规则+限流 |
| 入侵检?| ?| 行为分析+告警 |
| 日志分析 | ?| 集中日志+分析 |
| 备份 | 手动 | 自动+异地 |
### 常见攻击类型
| 攻击类型 | 危害 | 防御方案 |
|----------|------|----------|
| SSH 暴力破解 | 盗取服务?| 密钥+fail2ban |
| DDoS 攻击 | 服务不可?| 流量清洗+限?|
| 供应链攻?| 植入后门 | 安全更新 |
| 0day 漏洞 | 未知风险 | 最小化暴露?|
## SSH 高级加固
### 1. 双因素认?(2FA)
# 安装 Google Authenticator
apt install -y libpam-google-authenticator
# 配置 PAM
vim /etc/pam.d/sshd
# 添加以下?auth required pam_google_authenticator.so
# 配置 SSH
vim /etc/ssh/sshd_config
# 修改以下配置
ChallengeResponseAuthentication yes
AuthenticationMethods password,keyboard-interactive
# 重启 SSH
systemctl restart sshd
### 2. SSH 密钥 + 密钥短语
# 生成带密钥短语的密钥?ssh-keygen -t ed25519 -f ~/.ssh/vps_master -C "vps-master-key"
# 密钥短语:使用密码管理器保存
# 上传公钥
ssh-copy-id -i ~/.ssh/vps_master.pub admin@your-vps-ip
# 配置 SSH 使用特定密钥
vim ~/.ssh/config
Host your-vps-ip
IdentityFile ~/.ssh/vps_master
### 3. IP 白名?+ 地理封锁
# 只允许特?IP 访问 SSH
vim /etc/hosts.allow
sshd: 1.2.3.4 :allow
sshd: 10.0.0.0/8 :allow
vim /etc/hosts.deny
sshd: ALL :deny
# 或者使?UFW 地理封锁
ufw deny from 某些国家 to any port 22
## 企业级防火墙配置
### 1. UFW 高级规则
# 基础配置
ufw default deny incoming
ufw default allow outgoing
# 开放指?IP ?SSH (推荐)
ufw allow from 1.2.3.4 to any port 22 proto tcp
# 限流规则 - 防止暴力破解
ufw limit from any to any port 22 proto tcp
# 开?HTTP/HTTPS
ufw allow 80/tcp
ufw allow 443/tcp
# 开放常用服务端?ufw allow 3306/tcp comment 'MySQL'
ufw allow 5432/tcp comment 'PostgreSQL'
ufw allow 6379/tcp comment 'Redis'
ufw allow 27017/tcp comment 'MongoDB'
# 启用防火?ufw enable
### 2. iptables 高级规则
# 基础防护脚本
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH 限流 (每分?10 ?
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 防止 Ping 洪水
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 开放服务端?iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
### 3. 自动防御脚本
#!/bin/bash
# 自动封锁攻击?IP
LOG_FILE="/var/log/auth.log"
BLOCKED_IPS="/tmp/blocked_ips.txt"
# 获取过去 1 小时尝试登录失败?IP
BLOCKED=$(grep "Failed password" $LOG_FILE | grep "$(date -d '1 hour ago' +'%b %d')" | awk '{print $11}' | sort | uniq -c | awk '$1>10 {print $2}')
# 封锁 IP
for IP in $BLOCKED; do
if ! grep -q $IP $BLOCKED_IPS; then
echo $IP >> $BLOCKED_IPS
ufw insert 1 deny from $IP to any comment "Auto-blocked"
echo "$(date): Blocked $IP (failed login attempts)"
fi
done
## fail2ban 高级配置
### 1. 多监狱配?
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
destemail = admin@your-domain.com
sender = fail2ban@your-domain.com
action = %(action_mwl)s
# SSH 监狱
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
# HTTP 暴力破解
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
# WordPress 保护
[wp-login]
enabled = true
port = http,https
filter = wp-login
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 7200
# vsFTPd 保护
[vsftpd]
enabled = true
port = ftp,ftp-data,21
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 5
### 2. 自定义过滤器
# /etc/fail2ban/filter.d/wp-login.conf
[Definition]
failregex = ^ - - \[.*\] "POST /wp-login.php
ignoreregex =
## DDoS 防护方案
### 1. 应用层防?
# Nginx DDoS 防护配置
# 限制连接?limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
# 连接数限? limit_conn addr 10;
# 请求频率限制
limit_req zone=one burst=20 nodelay;
# 请求体大小限? client_max_body_size 10M;
# 超时设置
client_body_timeout 10s;
client_header_timeout 10s;
# 防盗? valid_referers none blocked your-domain.com;
if ($invalid_referer) {
return 403;
}
}
### 2. 系统级防?
# /etc/sysctl.conf DDoS 防护
# 防止 SYN 洪水
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# 限制连接?net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_tw_buckets = 2000
net.ipv4.tcp_max_syn_backlog = 8192
# ICMP 限制
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 应用配置
sysctl -p
## 安全监控与告?
### 1. 实时安全仪表?
#!/bin/bash
# VPS 安全状态仪表板
echo "=========================================="
echo " VPS 安全监控仪表?
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
# SSH 连接状?echo "[SSH 安全状态]"
echo "-----------------------------"
echo "当前 SSH 连接? $(who | wc -l)"
echo "SSH 失败登录 (今天): $(grep -c "$(date +%b\ %d)" /var/log/auth.log | head -1)"
echo "fail2ban 封禁 IP ? $(fail2ban-client banned | wc -l)"
echo ""
# 网络连接
echo "[网络连接状态]"
echo "-----------------------------"
echo "TCP 连接? $(netstat -an | grep tcp | wc -l)"
echo "UDP 连接? $(netstat -an | grep udp | wc -l)"
echo "ESTABLISHED: $(netstat -an | grep ESTABLISHED | wc -l)"
echo ""
# 端口扫描检?echo "[可疑端口]"
echo "-----------------------------"
netstat -tuln | awk '{print $1,$4,$6}' | grep LISTEN
echo ""
# 防火墙状?echo "[防火墙状态]"
echo "-----------------------------"
ufw status | head -10
echo ""
# 最近安全事?echo "[最近安全事件]"
echo "-----------------------------"
tail -5 /var/log/auth.log | grep -i "failed\|error\|attack"
echo ""
echo "=========================================="
### 2. Telegram 告警机器?
#!/bin/bash
# 安全告警通知脚本
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID"
send_alert() {
MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
-d "chat_id=$TELEGRAM_CHAT_ID&text=$MESSAGE&parse_mode=HTML"
}
# 使用示例
send_alert "⚠️ VPS 安全告警%0A检测到 SSH 暴力破解攻击%0AIP: 192.168.1.100%0A尝试次数: 50"
## 安全脚本集合
### 完整安全加固脚本
#!/bin/bash
# VPS 企业级安全加固脚?
echo "=========================================="
echo " VPS 企业级安全加固脚?
echo "=========================================="
# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y
# 2. 安装安全工具
echo "[2/8] 安装安全工具..."
apt install -y ufw fail2ban curl wget vim git net-tools
# 3. SSH 加固
echo "[3/8] SSH 加固..."
read -p "请输入新 SSH 端口: " SSH_PORT
sed -i "s/^#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
# 4. 配置防火?echo "[4/8] 配置防火?.."
ufw default deny incoming
ufw default allow outgoing
ufw allow $SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# 5. 配置 fail2ban
echo "[5/8] 配置 fail2ban..."
cat > /etc/fail2ban/jail.local <> /etc/sysctl.conf <
VPSVIP |
ClashVIP |
ClashHub
标签:0day漏洞防御, 2FA, CISA项目, DDoS防护, fail2ban, GitHub Advanced Security, IT运维, Socks5代理, SSH, VPS, 企业级防火墙, 双因素认证, 后端开发, 安全加固, 安全脚本, 应用安全, 服务器配置, 流量清洗, 白名单, 系统运维, 网络安全, 隐私保护, 高级安全指南