这一次的程序设计速度和防攻思路

王志勇 发表于 2026年10月02日 09:15

(本文含最新作品,部分程序截图的珍贵留念,含VPS自动“软关机”的关键语句,防止超大规模的攻击) 这一次其实是日常的开发速度,说快就很快,说慢也慢。所不同的是,这次实现的功能十分特殊:实现一个防止DDoS攻击的特大工程。没想到3天的时间,就完成了,都是手工编程,这种功能不可能由AI实现,因为AI编程无法做到那样细致,有很多细节必须人工完成。除去数据库部分,主体的程序文件目前仅3.08K,这几天又改了很多次。这个程序涵盖了判断针对访问日志里,多种攻击类型的识别。(非隔开法链接的判断类型,是写在数据库里,可实时在线更新,在程序里没有体现。)

这个程序设计实现的功能是判断用户的访问,是否为非隔开法行为、正常访问,非隔开法行为则立刻自动启动iptables,阻止继续疯狂刷新,高峰时可能高达1秒钟100次以上的刷新。攻击者会在链接添加参数,或者空链接,这都是非隔开法访问。编程的语言,使用“第三方语言+Shell命令”。第三方语言,主要是编程者熟悉的语言,可以是PHP、Node.js、Java、Python、Golang、CGI(Perl),只要是能运行于Linux系统下的任何语言。

Shell程序本来也能实现大部分的功能,虽然Shell命令无比强大,能实现很多系统级(不可思议)的功能,但用于编程的话,Shell程序的语法真的太啰嗦,如果过段时间,再次回读Shell程序的时候,会十分困难,真的有一种崩溃感。

用Shell编程的方法来实现这些功能,花费的时间,至少是第三方语言的10倍~20倍,纯粹是因为语法的简洁性、可读性。

我个人熟悉的语言是PHP,所以使用“PHP+Shell命令”的方式,本质上属于0开销,不额外占用任何资源,因为这个实例里,不需要再安装任何依赖包,只要有PHP即可,本质上就是一个普通的PHP页面。

这个程序需要嵌套到所有的PHP文件,甚至是需要用Rewrite把静态文件自动转成PHP动态文件,实现嵌套这个防护程序。实测所有的文件类型的静态文件,甚至是MP3文件,也能嵌套,嵌套后的静态非文本文件测试SHA256和SHA1的值均正常,但前提是嵌套非文本文件的PHP程序,不能有任何文本输出、不能有报错。不能预留一点被攻击的窗口。

(静态文件自动转成PHP动态文件,除了用Rewrite,也可以用.htaccess+404错误页(改成200代码),作用相同,但404错误页更省资源,因为少调用一个Rewrite模块。)

这次的程序设计,预计可能需要15~30天完成,实际操作起来,用时3天,后面再做精细的修改、功能升级和完善,又用了2天。这个防DDoS的程序,目前来说功能相对还是比较全面的,当然欠缺的是对于要求不能断线关机的服务器、例如网络游戏的服务器,暂时解决不了。

因为攻击者的很多访问来源,在访问日志里可以看到是模拟真实的访问,无论是访问页面、还是UA,都像是真实访问。但从短期内出现大量的这类访问记录,80%的可能性又像是在攻击,这类攻击是采用一个访问,使用一个IP地址,所以对这类访问进行自动封禁,会出现误伤,出现大面积的不能正常访问。

所以对于个人网站、个人博客、小型企业网站,我采用的规则是当短时间内出现超大量的这种攻击,一个访问、一个IP地址的这种,1秒钟的请求达到100次以上,进行统一自动白名单,也就是“软关机”。(这个规则的程序编写和调试、测试,实际大约用5个多小时完成。)

这个“软关机”的高危参数,是总访问量,而非个人的刷新次数, 因为每次的IP地址不同,所以只能从总访问量着手,实际的参数设定阀值,对于博客、小型网站,要远低于1秒钟100次,例如1秒钟10次,这种设定会出现误伤,所以改为2秒钟20次、3秒钟30次类似的宽限范围,能大大减少误伤,维持博客的正常访问。

3秒钟30次是属于访问量比较大的大型博客,我设定为1分钟200次这个值更加安全,因为要按照实际的日常访问量。大型网站可设定为1分钟2000次。这个阀值设定越高,当攻击出现的时候,浪费的流量就越多。阀值设定越低,越安全。

这些阀值,都设置为可修改参数,可以在线随时修改,随时改变安全级别。

否则,这种攻击能在短时间内消耗远超10Gbps以上的流量,流量的消耗完全取决于VPS、或独立主机的带宽,是30Mbps,还是100Mbps,还是1Gbps,美国主机普遍是1G带宽。

就以30Mbps的VPS为例,1秒钟的峰值上行/下行流量总和是30Mbps,1分钟就能达到1.8Gbps。但由于VPS有一定的抗压能力,或者有单位时间的峰值限制,1G流量消耗可能实际需要10分钟~15分钟左右。

出现这种攻击的时候,博主会发现自己的博客会特别卡,我就是这样发现的,已经消耗了将近1G的流量,于是手动关机。

如果不手动关机,流量会一直消耗下去。自动“软关机”,就是代替手动关机,且非常及时,一旦异常,立刻断开流量,非常灵敏。

并在程序设计里做一个日志,查看什么时候曾经“软关机”。

截图珍贵留念
这是这个程序的部分截图珍贵留念,程序完成的作品就是这样模块化的风格。在实际的程序开发中,程序书写顺序并不是像写文章一样,从前到后,而是有大量的“插播”,很多后面需要的变量、或者需要经过处理的数据,都是需要的时候,在前面插播。正是由于这种被迫的“插播”方式,使程序的开发思路,较难被完全读懂,别人这样写,我也看不懂。

这些程序将来都是完全公开的,即使源代码全部公开,一旦放置在服务器上,无法被破解、攻击,因为绝大多数的语句都是赋值、或者处理、调用,没法破解、攻击,实在是个别需要加强隐私的参数,可以添加个参数、或者稍微加密一下即可降低可读性,数据库是禁止访问、不可修改的:

VPS自动“软关机”的关键语句,防止超大规模的DDoS攻击:

本博客的博客首页源代码
本博客的博客首页源代码,在5年前公布,如前文《秒会+实战PHP程序设计(1-2):auiou.com的源代码》,我不介意公开自己的源代码。永远不能公开的是用户的隐私数据,这是超级红线。

当时公开的这个首页源代码,就是首页的全部核心程序代码,就是这么简单,现在是用PHP写的,这个博客程序是2010年重新重构,改为PHP程序,大约用了4天完成整个前后台程序,从0人工编写。

我的中文博客本来可以在2005年的时候上线,但正如现在一样,真的有很多事情压着,所以一直拖到2006年才正式上线。

我的英文博客是在2005年过年的时候上线,那时候必须做这个英文博客,当时是随机注册只要有一点含义就可以,是属于急需注册,那个博客的作用是跳板作用,内容也全部是自己的原创文章,偏技术话题为主。

为什么说是跳板作用?因为当时国内个人网站的PR值最高是4,极少数人是5。而当时的英文博客,PR值普遍都是6以上,最低都是5,有几十个PR值为7的英文博客,全球也有个位数的英文博客PR值达到8,例如simplebits,mikeindustries,总数不超过5个。

英文博客的PR值特别高,主要是因为互相的友情链接。

当时的大多数英文博客还没有启用nofollow,这些英文博客很多单篇的PR值都达到6、或者5,甚至7,这些单页PR值高的原因是按月存档的链接,只要在这些英文博客上留言,留个链接,自己的博客的PR值能轻易到达5。

后来过了几年,Wordpress、Typecho,启用了nofollow,这个快速提升PR值的方法也就失效了。

我的中文博客是由于当时的网络环境,主要原因也还是由于中文博客的PR值也特别高,所以在2005年秋天在我原有的个人主页上,做了一个博客的二级目录,这个博客其实是一个真正的博客。

但是,我在2005年秋天建的中文博客,以及2005年过年建的英文博客,这2个博客,是全静态的HTML页,那时候还没想出怎么写博客程序。

当时这种强制搭建的全静态HTML博客站,更新是非常吃力的,所有的关联页面都是手动修改、再用FTP上传,仅仅是每次写文章,而造成的手动修改,就需要额外10多分钟,一点都不夸张,这导致当时的博客非常低产,我只写了4篇博客。

不像后来,有了博客程序,博客一键发布,所有的关联页面全部自动更新,每次都能节省10多分钟。

经过了整整半年的思考,我终于想出了博客程序的设计方法,就是列表,每篇文章为一个数据库,首页提取10个数据库,就是像上述截图这样。

第一个程序其实是用ASP编写的,用了整整10天,程序从0编写完成,在2006年5月底完成。

由于ASP的语法太啰嗦,同样的程序,PHP的开发速度至少是ASP的3~5倍,PHP开发速度快,纯粹是因为语法简洁。

“软关机”功能的改进
由于开发时间急促,对于短时间内的超高频的DDos攻击,我采用“软关机”一段时间的方法,限制所有人访问。普通的非隔开法链接、高频刷新,采用部分限制。

其实可以改进,将来有时间再改吧,改成“软降速”,把原来的30M带宽,让程序自动调为1M,过一小段时间再自动调回来,至少博客、网站还能勉强访问,这些都是依赖PHP+Shell命令完成。

但是,“软降速”可能效果没那么好,博客还是不能访问,因为这仅有的1M带宽,被DDoS占着,干脆还是不如“软关机”。

功能总结
这种防止超大规模的DDoS攻击的程序,最简单的设计原理就是制作一个计数器,对于博客,如果近期的30秒内的访问次数达到100次,或者60秒内的访问次数达到200次,则自动启动iptables的白名单语句(Shell命令里的iptables),并写入sleep命令,设定为20分钟、或30分钟后自动解除白名单,实现自动“软开机”。

这个计数器由于是高频写入数据,需要用高速缓存,建立虚拟硬盘,Linux系统建立虚拟硬盘比Windows容易得多,一条Shell命令就能建立,百度关键词:Debian ramdisk

有了这个自动“软关机”的功能,能抵挡超大量的DDoS攻击,迅速自动关闭所有的流量消耗,实现“高枕”的功能,博主能安心地去睡觉、安心地随时出行、安心地K歌,是真正的“高枕”牌防护程序,是居家、旅行的必备良药,敬请观看《唐伯虎点秋香》。

0条评论:

抱歉,评论已关闭。

王志勇:1980-09-26 (46周岁)

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2025年-2026年03月(10)
2024年(13)
2023年 +

2022年 +
2021年 +
2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2026 auiou.com All rights reserved.
此Blog程序由王志勇编写