分类 工作&技术 下的文章

手里一大把vps,不过为了省力省心也是省钱,还是€1一年的虚拟主机走起。因为这样心里不会有浪费的负罪感,拿着大杀器跑一天几个几十个IP的站过份了。
做站不做刑法上的东西现在感觉真的是已经没前途了。
这个博客我全部手搓原创,半年了,访问量和收录量都是一塌糊涂。我已经绝望了,就自己写着看着玩玩,防止老年痴呆吧。

eu1.jpg

不知道从哪天开始,但1-2个月肯定有了,我访问cloudflare就很卡很卡,上套了cf的网页也是时不时的抽一下。我一直觉得是我本地的cf节点有了问题,因为我从其它地方访问都没问题,我忍!
今天晚上,我例行上blog检查一下,结果直接chrome跳出来了ERR_QUIC_PROTOCOL_ERROR的错,完全上不去。换了多台服务器去curl,都没问题,就是我本机的chrome上不去,就是这个QUIC错!突然灵光一闪,关了chrome的QUIC,瞬间就可以上了,速度飞起,再试试上cloudflare,速度也起飞了! 好吧,我明白了,QUIC/UDP出问题了。。。 我居然忍了这么久才意识到。至于具体是宽带QOS还是我用的Clash出问题还得继续检查一下,大概率是后者。(我常年clash通过香港反向入墙)
顺便记录下二个解决这问题的操作。
一、关闭chrome的quic支持。就是自己不再用quic。
q1.jpg
二、关闭cloudflare的QUIC支持。就是别人访问自己网站时不会用quic。
q2.jpg

404攻击,就是不存在的文件攻击了。攻击者大量的向服务器请求不存在的每次都不相同的链接,cdn/waf将会将所有的请求回源,因为cdn并没有此请求的cache,也无法验证此请求的合法性。404攻击基本可以穿透所有的cdn,当然,也包括cf。
一个404请求无所谓,但是,如果同一时间几千几万个ip并发过来然后每秒10次8次,源服务器也就被回源崩了。(不要对cf等的rate limit有幻想,它只是限制单ip的频率。) 现在的后端系统,比如各php框架和应用,喜欢将所有请求接管,包括404,而不是使用nginx等直接处理,更上雪上加霜。
基于上面的分析,404是无法在cdn层面用普通方式拦截的,所以,必须在源服务器上进行处理,在源服务器还没有被打死前,发现404攻击,然后做出相应对策。在套用cf的前提下,就是直接启用5秒盾,识别不了,就全拦掉,总比挂了好。
下面的代码可以参考:

main.go

这个一个后台进程,它建立一个本地web服务器, http://127.0.0.1:8080/handle_404,如果应用系统接收到404时,就调用此链接。这个进程,它会判断404的频率,在例子中,10秒内超过了100次404,就会激活5秒盾5分钟。
之所以将其单独出来而不是写入应用逻辑,是为了结构和通用性方面的原因。
比如,如果nginx没有特殊设定, 那么可以在nginx的location中,将404错误重写到此链接,而在本博客的typecho中,当捕获到错误时,只需要修改/usr/themes/default/404.php即可:

$url = "http://172.17.0.1:8080/handle_404";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
?>

好了,这下基本随便404了,超了100/10就5秒盾挡一会,完事。。 当然,我设置的10秒100次其实限制很紧,稍微大些都不是问题,因为404攻击会远远超过这频率,大一点防止误报更好。

以前用了这个从nodeseek上看到的脚本小改后来使用,结果今天不出意外的出了意外。跨月挂了。
分析了下代码,它的进出流量是取的 interface[0].traffic.total.tx和rx,这个是网卡累计总流量。在第一个月的时候是正确的,统计到的总流量就是当月流量嘛。但第二个月,就把前一个月的也包含进来了。
json里其实是应该取 interface[0].traffic.month[n].tx和rx,上面的下标n就是month里最大的那个,因为是按照时间升序排列的,下标最大的一个即为当前月。
修正后代码如下:

#!/bin/bash

# 设置网卡名称
INTERFACE="eth0"

# 设置流量限制(单位:GB)
LIMIT=195

# 获取当前月份的索引
MONTH_INDEX=$(vnstat -i $INTERFACE --json | jq '.interfaces[0].traffic.month | length - 1')

# 获取当月流量数据(单位:KB)
TX=$(vnstat -i $INTERFACE --json | jq --argjson idx "$MONTH_INDEX" '.interfaces[0].traffic.month[$idx].tx')
RX=$(vnstat -i $INTERFACE --json | jq --argjson idx "$MONTH_INDEX" '.interfaces[0].traffic.month[$idx].rx')

# 计算总流量(单位:GB)
GB1=$(echo "scale=2; $TX / 1024 / 1024 / 1024" | bc)
GB2=$(echo "scale=2; $RX / 1024 / 1024 / 1024" | bc)
GB1=$(printf "%.2f" $GB1)
GB2=$(printf "%.2f" $GB2)
echo "Total traffic out: $GB1 GB"
echo "Total traffic in: $GB2 GB"

# 比较并选择较大的流量值(共享带宽包)
if (( $(echo "$GB2 > $GB1" | bc -l) )); then
  GB=$GB2
else
  GB=$GB1
fi

echo "CBWP traffic: $GB GB"

# 检查是否超过流量限制
if (( $(echo "$GB >= $LIMIT" | bc -l) )); then
  echo "Traffic limit exceeded. Disabling network interface."
  ip link set $INTERFACE down
fi

科普下使用方式,时不时有朋友和我说我说得太简略了。。好吧,我假定0基础。
安装必要软件包 apt install bc jq vnstat
设置vnstat开机启动(奇大怪,正常apt install都会做这个,但vnstat似乎没有) systemctl enable vnstat
nano /usr/local/bin/checkcdt.sh 然后输入上面代码,然后 ctrl-x 存盘退出啦,有YES就YES,有默认值就默认值
chmod +x /usr/local/bin/checkcdt.sh
crontab -e 然后选择1,即 nano,如果第一次用的话。 然后在最后加上一行,

*/1 * * * * /usr/local/bin/checkcdt.sh 

,然后ctrl-x退出。 搞定。
它会每分钟检查一次流量,如果到达了195G时就把网卡断了。不说复杂了,下个月的时候重启下机器就活过来了。

在忙一个展会,有场专门活动的入场券需要二维码分发,因为只是个临时活动,不进票务系统和过检票闸机,所以得用户入场时做一个单独的验票(码)的H5小玩意,客服妹子们入场时用手机去扫票验码。
老板觉得这小东西叫上产品、UI,前端什么的一帮子人动静也太大,所以这工作就交给我这苦力了。
接到这要求第一反应是,我就一个后端啊,做页面也太难为人了,而且这页面还要扫码什么的,晕。。。硬着头皮一问gpt,好简单!

引入二维码库(html5-qrcode)

<script src="https://xxxxxx/html5-qrcode.min.js"></script> 

扫码

const html5QrCode = new Html5Qrcode("reader");
html5QrCode.start(
  { facingMode: "environment" }, 
   {
      fps: 20,    
      qrbox: { width: 300, height: 300 } 
   },
     onScanSuccess, //成功
     onScanFailure  // 失败
);

扫到了二维码

function onScanSuccess(decodedText, decodedResult) {  
   ... decodeText用ajax发送给后端API,然后后端提示是否允许入场等
}

当然,还有点简单的html和css,也包括ajax什么的,这些全是gpt完成,ai独自完成度100%。
至于后端api,这个自己码下代码太容易了,后端基本功,不值一提。
总共花了一个小时不到,交工,看上去象模象样蛮有成就感的。