1.
准备与前提检查
- 步骤A:记录VPS基础信息:运营商(台湾机房)、公网IP、控制面板(如SolusVM)、操作系统(Debian/Ubuntu/CentOS)、内核版本(uname -r)。
- 步骤B:备份:执行完整快照或rsync备份(示例:rsync -avz /etc/ root@backup:/srv/backups/$(date +%F)/)。
- 步骤C:建立应急访问:在控制面板开通KVM或控制台,确保防护误配置时能恢复。
2.
第一步:SSH加固(强烈推荐立即执行)
- 步骤1:创建非root用户并添加sudo:adduser deploy && usermod -aG sudo deploy。
- 步骤2:配置公钥登录:在服务器~/.ssh/authorized_keys放入本地公钥,chmod 600 ~/.ssh/authorized_keys。
- 步骤3:编辑/etc/ssh/sshd_config关键项并重启:PermitRootLogin no,PasswordAuthentication no,PubkeyAuthentication yes,Port 22022(可选更改)。重启:systemctl restart sshd。
3.
第二步:系统内核与网络参数硬化
- 步骤1:编辑/etc/sysctl.d/99-hardening.conf,添加:net.ipv4.tcp_syncookies=1;net.ipv4.tcp_max_syn_backlog=2048;net.ipv4.ip_forward=0;net.ipv4.conf.all.rp_filter=1。
- 步骤2:限制ICMP和日志设置:net.ipv4.icmp_echo_ignore_all=0(可改为1视场景),net.ipv4.icmp_ratelimit=100。
- 步骤3:使配置生效:sysctl --system。
4.
第三步:防火墙基础(ufw/iptables/nftables)
- 步骤1:如果使用ufw(Ubuntu),开启并只允许必要端口:ufw default deny incoming; ufw allow 22022/tcp; ufw allow 80,443/tcp; ufw enable。
- 步骤2:更细粒度使用iptables示例(Debian/CentOS):iptables -F; iptables -P INPUT DROP; iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT; iptables -A INPUT -p tcp --dport 22022 -m conntrack --ctstate NEW -j ACCEPT; iptables -A INPUT -p tcp --dport 80 -j ACCEPT; iptables -A INPUT -i lo -j ACCEPT; 保存规则:iptables-save >/etc/iptables.rules。
- 步骤3:考虑使用nftables作为替代,便于管理集合(sets)。
5.
第四步:使用ipset与iptables组合应对大量IP的DDoS
- 步骤1:安装ipset并创建集合:ipset create badips hash:net maxelem 100000。
- 步骤2:将集合用于iptables快速丢弃:iptables -I INPUT -m set --match-set badips src -j DROP。
- 步骤3:批量导入或自动更新黑名单:curl https://example.org/blklist.txt | xargs -n1 -I{} ipset add badips {}(配合crontab定期更新)。
6.
第五步:速率限制与连接数限制(防SYN/连接耗尽)
- 步骤1:启用SYN Cookies(见第3段sysctl)。
- 步骤2:iptables限制新连接率示例:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT --reject-with tcp-reset(限制每IP并发连接)。
- 步骤3:使用hashlimit模块限制建立速率:iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 20/second --hashlimit-mode srcip --hashlimit-name http_rate -j ACCEPT。
7.
第六步:Fail2Ban与登录暴力防护
- 步骤1:安装并启用:apt install fail2ban。
- 步骤2:创建本地配置/etc/fail2ban/jail.d/local.conf,示例:[sshd] enabled = true; port = 22022; maxretry = 3; bantime = 3600。
- 步骤3:自定义filter拦截Nginx/Apache异常请求并封禁异常IP。
8.
第七步:Web层限流与WAF(以Nginx为例)
- 步骤1:Nginx限流配置放在http{}:limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s。
- 步骤2:在server或location中应用:limit_conn addr 20; limit_req zone=req burst=10 nodelay;。
- 步骤3:部署WAF(modsecurity+OWASP规则或云WAF),并配置返回429或直接封禁恶意请求。
9.
第八步:监控与流量异常检测
- 步骤1:安装基础工具:iftop、vnstat、netstat、ss、tcpdump。
- 步骤2:常用检测命令:ss -s 查看连接状态;netstat -anp | grep SYN_RECV;tcpdump -n -i eth0 'tcp[tcpflags] & (tcp-syn) != 0' -c 100。
- 步骤3:建议部署Zabbix/Prometheus+Grafana监控带宽与连接数,并设置告警阈值。
10.
第九步:应急脚本与自动化响应
- 步骤1:编写简单脚本检测高连接并自动加入ipset(示例伪码):if ss -nt state syn-recv | wc -l > 1000 then run detection & ipset add badips IP。
- 步骤2:结合fail2ban-action或自定义systemd服务在触发条件下执行。
- 步骤3:测试脚本在非高峰时间演练,确认不会误伤正常流量。
11.
第十步:与机房/运营商协同防护
- 步骤1:联系台湾机房支持,确认是否提供带外清洗或上游黑洞(null-route)服务。
- 步骤2:在攻击时请求BGP流量清洗或临时转流至CDN/WAF。
- 步骤3:保留攻击流量样本(tcpdump)供运营商分析并用于规则精细化。
12.
第十一步:日志审计与长期策略
- 步骤1:集中日志:rsyslog/Fluentd + ELK,过滤并建立可搜索警报。
- 步骤2:定期更新系统与规则(内核、iptables/ipset、WAF规则)。
- 步骤3:制定恢复流程:回滚快照、切换到备用服务或托管CDN。
13.
问:台湾机房的VPS遭遇DDoS,能否单靠服务器本身完全防住?
答:单靠VPS本身难以应对大规模带宽型DDoS(如数Gbps流量)。服务器端可缓解小规模连接耗尽/应用层攻击,但遇到上游饱和需依赖机房/上游清洗、CDN或DDoS清洗服务。
14.
问:如何快速判断是否为DDoS而不是业务暴增?
答:观察来源IP分布(是否大量单一IP或随机分布)、流量类型(大量SYN/UDP/ICMP为DDoS)、连接状态(大量SYN_RECV/NEW)及并发连接数急剧增加。结合访问日志看是否为正常页面请求。
15.
问:我现在时间紧迫,先执行哪三步能迅速降低风险?
答:第一:立即启用iptables/ufw基础默认拒绝策略并允许必要端口;第二:启用SSH密钥登录并禁止root与密码登录;第三:部署ipset并临时加入异常IP/网段,同时联系机房申请流量清洗或黑洞支持。
来源:大连vps台湾服务器安全加固与DDoS防护实操要点