更换🇭🇰服务器优化线路,遇 DDoS 则切 Argo Tunnel

cmcc

traceroute to 120.192.227.114( 陕西省西安市 移动) (120.192.227.114( 陕西省西安市 移动)), 30 hops max, 60 byte packets
1 * * *
2 223.165.7.220( 印度尼西亚 ) (223.165.7.220( 印度尼西亚 )) 1.407 ms 1.412 ms 1.404 ms
3 206.148.24.124( 美国 ) (206.148.24.124( 美国 )) 1.310 ms 206.148.24.172( 美国 ) (206.148.24.172( 美国 )) 1.387 ms 206.148.24.124( 美国 ) (206.148.24.124( 美国 )) 1.321 ms
4 * * 206.148.24.172( 美国 ) (206.148.24.172( 美国 )) 1.269 ms
5 223.121.3.9( 中国 移动) (223.121.3.9( 中国 移动)) 32.529 ms 8.244.4.17( 美国 ) (8.244.4.17( 美国 )) 65.180 ms 65.188 ms
6 * 223.121.3.9( 中国 移动) (223.121.3.9( 中国 移动)) 31.528 ms 223.120.22.69( 广东省广州市 中国移动骨干网广东省节点 (AS9808)) (223.120.22.69( 广东省广州市 中国移动骨干网广东省节点 (AS9808))) 32.255 ms
7 * * *
8 * * 223.120.3.186( 中国 移动) (223.120.3.186( 中国 移动)) 57.569 ms
9 221.183.89.174( 海南省海口市 移动) (221.183.89.174( 海南省海口市 移动)) 58.422 ms 221.183.89.33( 海南省海口市 移动) (221.183.89.33( 海南省海口市 移动)) 58.246 ms *
10 221.183.89.14( 海南省海口市 移动) (221.183.89.14( 海南省海口市 移动)) 61.278 ms * 221.183.89.50( 海南省海口市 移动) (221.183.89.50( 海南省海口市 移动)) 59.860 ms
11 221.183.40.146( 海南省海口市 移动) (221.183.40.146( 海南省海口市 移动)) 87.385 ms 221.183.89.46( 海南省海口市 移动) (221.183.89.46( 海南省海口市 移动)) 59.538 ms 221.183.40.146( 海南省海口市 移动) (221.183.40.146( 海南省海口市 移动)) 87.483 ms
12 221.183.40.146( 海南省海口市 移动) (221.183.40.146( 海南省海口市 移动)) 87.874 ms 93.724 ms *
13 * * *
14 120.192.202.6( 陕西省西安市 移动) (120.192.202.6( 陕西省西安市 移动)) 86.498 ms 89.990 ms 90.013 ms
15 120.192.227.114( 陕西省西安市 移动) (120.192.227.114( 陕西省西安市 移动)) 86.433 ms 87.769 ms 86.399 ms

telecom

traceroute to 1.85.33.66( 陕西省西安市 电信) (1.85.33.66( 陕西省西安市 电信)), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 e32-25.spine1.nrt04.jp.misaka.io (199.119.64.131( 美国 弗吉尼亚州阿什本 Misaka Network)) 74.739 ms 74.757 ms 74.781 ms
4 e50-11-bbt.cr1a.eqty8.nrt4.jp.917.as (199.119.64.117( 美国 弗吉尼亚州阿什本 Misaka Network)) 74.771 ms 74.820 ms 74.777 ms
5 bbtower.cr1a.eqty8.nrt4.jp.917.as (199.119.64.116( 美国 弗吉尼亚州阿什本 Misaka Network)) 75.446 ms 75.420 ms 75.392 ms
6 * * *
7 * * *
8 as3258.xe-0-1-7.tedge0504.newote.bbtower.ad.jp (211.14.4.221( 日本 东京 BroadBand Tower Inc.)) 75.536 ms 75.518 ms 75.559 ms
9 xe-0-1-7.tedge0503.newote.bbtower.ad.jp (211.14.4.178( 日本 东京 BroadBand Tower Inc.)) 75.597 ms 75.466 ms xe-0-1-7.tedge0504.newote.bbtower.ad.jp (211.14.4.222( 日本 东京 BroadBand Tower Inc.)) 75.352 ms
10 * * *
11 210.138.130.225( 日本 IIJ) (210.138.130.225( 日本 IIJ)) 75.699 ms 75.679 ms 75.739 ms
12 tky001bb00.IIJ.Net (58.138.98.49( 日本 东京 Internet Initiative Japan 公司)) 75.695 ms 75.928 ms 104.770 ms
13 tky001ix55.IIJ.Net (58.138.101.58( 日本 东京 Internet Initiative Japan 公司)) 75.658 ms tky001ix55.IIJ.Net (58.138.101.62( 日本 东京 Internet Initiative Japan 公司)) 75.685 ms tky001ix55.IIJ.Net (58.138.100.206( 日本 东京 Internet Initiative Japan 公司)) 75.626 ms
14 203.215.236.65( 日本 中国电信 CN2 节点) (203.215.236.65( 日本 中国电信 CN2 节点)) 88.532 ms 89.070 ms 89.043 ms
15 * 202.97.70.29( 中国 电信骨干网) (202.97.70.29( 中国 电信骨干网)) 100.929 ms 100.944 ms
16 202.97.74.2( 中国 电信骨干网) (202.97.74.2( 中国 电信骨干网)) 87.124 ms 202.97.91.25( 中国 电信骨干网) (202.97.91.25( 中国 电信骨干网)) 98.911 ms 98.876 ms
17 202.97.94.141( 中国 电信骨干网) (202.97.94.141( 中国 电信骨干网)) 99.653 ms 202.97.62.157( 中国 电信骨干网) (202.97.62.157( 中国 电信骨干网)) 100.211 ms 202.97.62.101( 中国 电信骨干网) (202.97.62.101( 中国 电信骨干网)) 101.939 ms
18 * 202.97.13.122( 中国 电信骨干网) (202.97.13.122( 中国 电信骨干网)) 127.842 ms *
19 117.36.240.170( 陕西省西安市 电信) (117.36.240.170( 陕西省西安市 电信)) 129.347 ms 117.36.240.238( 陕西省西安市 电信) (117.36.240.238( 陕西省西安市 电信)) 141.394 ms *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *

教育网 - 上交

traceroute to 111.186.58.212( 上海市 上海交通大学) (111.186.58.212( 上海市 上海交通大学)), 30 hops max, 60 byte packets
1 _gateway (103.69.128.1( 印度尼西亚 )) 18.525 ms 18.435 ms 18.411 ms
2 * * *
3 e32-25.spine1.nrt04.jp.misaka.io (199.119.64.131( 美国 弗吉尼亚州阿什本 Misaka Network)) 75.518 ms 75.545 ms 75.598 ms
4 e50-11-bbt.cr1a.eqty8.nrt4.jp.917.as (199.119.64.117( 美国 弗吉尼亚州阿什本 Misaka Network)) 75.525 ms 75.567 ms 75.545 ms
5 softbank.cr1a.eqty8.nrt4.jp.917.as (199.119.64.118( 美国 弗吉尼亚州阿什本 Misaka Network)) 76.397 ms 76.372 ms 76.349 ms
6 * * *
7 * * *
8 * * *
9 211.15.32.121( 日本 ) (211.15.32.121( 日本 )) 76.296 ms 76.706 ms 76.721 ms
10 * * *
11 * * *
12 ae-31.r01.tokyjp08.jp.bb.gin.ntt.net (203.105.72.61( 日本 NTT 通讯公司互联节点)) 77.080 ms 77.045 ms 77.090 ms
13 * * *
14 ae-1.r33.tokyjp05.jp.bb.gin.ntt.net (129.250.5.54( 日本 NTT 通信公司骨干网)) 77.171 ms * ae-2.r26.tkokhk01.hk.bb.gin.ntt.net (129.250.2.51( 美国 NTT 公司美国节点)) 53.499 ms
15 * * *
16 * ae-0.a01.chwahk03.hk.bb.gin.ntt.net (129.250.4.247( 日本 NTT 通信公司骨干网)) 66.526 ms ae-7.r23.kslrml02.my.bb.gin.ntt.net (129.250.2.169( 美国 NTT 公司美国节点)) 80.196 ms
17 * 203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点) (203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点)) 56.225 ms 54.712 ms
18 * * *
19 * * 203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点) (203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点)) 80.699 ms
20 101.4.114.221( 北京市 赛尔网络有限公司网络运行部) (101.4.114.221( 北京市 赛尔网络有限公司网络运行部)) 118.366 ms 101.4.115.114( 北京市 赛尔网络有限公司网络运行部) (101.4.115.114( 北京市 赛尔网络有限公司网络运行部)) 83.141 ms 203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点) (203.131.254.214( 香港 日本 NTT 通讯亚洲公司互联节点)) 81.629 ms
21 * 101.4.117.101( 北京市 赛尔网络有限公司网络运行部) (101.4.117.101( 北京市 赛尔网络有限公司网络运行部)) 116.440 ms 101.4.115.202( 北京市 赛尔网络有限公司网络运行部) (101.4.115.202( 北京市 赛尔网络有限公司网络运行部)) 113.411 ms
22 * * 101.4.117.57( 北京市 赛尔网络有限公司网络运行部) (101.4.117.57( 北京市 赛尔网络有限公司网络运行部)) 111.879 ms
23 101.4.115.202( 北京市 赛尔网络有限公司网络运行部) (101.4.115.202( 北京市 赛尔网络有限公司网络运行部)) 113.413 ms * *
24 * 101.4.115.249( 北京市 赛尔网络有限公司网络运行部) (101.4.115.249( 北京市 赛尔网络有限公司网络运行部)) 113.618 ms 101.4.117.57( 北京市 赛尔网络有限公司网络运行部) (101.4.117.57( 北京市 赛尔网络有限公司网络运行部)) 112.017 ms
25 202.112.27.14( 中国 教育网) (202.112.27.14( 中国 教育网)) 128.140 ms 101.4.117.57( 北京市 赛尔网络有限公司网络运行部) (101.4.117.57( 北京市 赛尔网络有限公司网络运行部)) 138.845 ms *
26 * * *
27 101.4.117.57( 北京市 赛尔网络有限公司网络运行部) (101.4.117.57( 北京市 赛尔网络有限公司网络运行部)) 139.050 ms * 202.112.27.14( 中国 教育网) (202.112.27.14( 中国 教育网)) 207.433 ms
28 * * *
29 * * *
30 * * *

unicom

traceroute to 221.11.0.70( 陕西省西安市 联通) (221.11.0.70( 陕西省西安市 联通)), 30 hops max, 60 byte packets
1 * * *
2 192.168.43.1 (192.168.43.1) 87.076 ms 87.051 ms 87.028 ms
3 e32-25.spine1.nrt04.jp.misaka.io (199.119.64.131( 美国 弗吉尼亚州阿什本 Misaka Network)) 76.030 ms 76.036 ms 76.070 ms
4 e50-11-bbt.cr1a.eqty8.nrt4.jp.917.as (199.119.64.117( 美国 弗吉尼亚州阿什本 Misaka Network)) 76.074 ms 76.133 ms 76.100 ms
5 bbtower.cr1a.eqty8.nrt4.jp.917.as (199.119.64.116( 美国 弗吉尼亚州阿什本 Misaka Network)) 76.668 ms 76.644 ms 76.619 ms
6 * * *
7 * * *
8 as3258.xe-0-1-7.tedge0504.newote.bbtower.ad.jp (211.14.4.221( 日本 东京 BroadBand Tower Inc.)) 75.754 ms 75.753 ms 75.724 ms
9 xe-0-1-7.tedge0504.newote.bbtower.ad.jp (211.14.4.222( 日本 东京 BroadBand Tower Inc.)) 75.623 ms xe-0-1-7.tedge0503.newote.bbtower.ad.jp (211.14.4.178( 日本 东京 BroadBand Tower Inc.)) 75.379 ms 75.363 ms
10 * * *
11 210.138.130.225( 日本 IIJ) (210.138.130.225( 日本 IIJ)) 77.268 ms 77.273 ms 90.116 ms
12 * * *
13 * * *
14 202.232.1.158( 日本 IIJ) (202.232.1.158( 日本 IIJ)) 125.692 ms 125.669 ms 137.813 ms
15 219.158.24.57( 中国 联通骨干网) (219.158.24.57( 中国 联通骨干网)) 159.029 ms 150.887 ms 219.158.13.217( 中国 联通骨干网) (219.158.13.217( 中国 联通骨干网)) 141.671 ms
16 219.158.113.134( 中国 联通骨干网) (219.158.113.134( 中国 联通骨干网)) 121.019 ms 113.077 ms 219.158.6.157( 中国 联通骨干网) (219.158.6.157( 中国 联通骨干网)) 151.930 ms
17 219.158.113.105( 中国 联通骨干网) (219.158.113.105( 中国 联通骨干网)) 128.438 ms 219.158.7.125( 中国 联通骨干网) (219.158.7.125( 中国 联通骨干网)) 160.635 ms 149.888 ms
18 219.158.112.34( 中国 联通骨干网) (219.158.112.34( 中国 联通骨干网)) 154.199 ms 182.574 ms 137.886 ms
19 * * *
20 221.11.0.70( 陕西省西安市 联通) (221.11.0.70( 陕西省西安市 联通)) 152.721 ms 149.776 ms 136.968 ms
[0 running job(s)] {history#7135} 12:26:36 2024-05-31root@xmh ~ # #

教育网-

traceroute to 202.117.13.1( 陕西省西安市 西安交通大学教育网) (202.117.13.1( 陕西省西安市 西安交通大学教育网)), 30 hops max, 60 byte packets
1 * * *
2 223.165.7.220( 印度尼西亚 ) (223.165.7.220( 印度尼西亚 )) 0.630 ms 0.656 ms 0.679 ms
3 206.148.24.124( 美国 ) (206.148.24.124( 美国 )) 0.134 ms 0.154 ms 0.131 ms
4 * ce-2-3-3.a00.newthk04.hk.bb.gin.ntt.net (203.131.241.145( 香港 日本 NTT 通讯亚洲公司互联节点)) 1.007 ms 0.976 ms
5 * * ae-19.r27.tkokhk01.hk.bb.gin.ntt.net (129.250.5.134( 香港 NTT 通信公司国际互联节点)) 4.022 ms
6 ae-0.a01.chwahk03.hk.bb.gin.ntt.net (129.250.4.247( 日本 NTT 通信公司骨干网)) 2.060 ms 6.265 ms *
7 223.120.3.86( 中国 移动) (223.120.3.86( 中国 移动)) 32.414 ms 31.604 ms 32.397 ms
8 223.118.2.229( 香港 中国移动国际有限公司) (223.118.2.229( 香港 中国移动国际有限公司)) 57.720 ms 223.119.81.94( 香港 中国移动国际有限公司) (223.119.81.94( 香港 中国移动国际有限公司)) 2.387 ms 223.118.2.229( 香港 中国移动国际有限公司) (223.118.2.229( 香港 中国移动国际有限公司)) 56.665 ms
9 101.4.114.221( 北京市 赛尔网络有限公司网络运行部) (101.4.114.221( 北京市 赛尔网络有限公司网络运行部)) 37.652 ms 36.180 ms 223.118.2.214( 香港 中国移动国际有限公司) (223.118.2.214( 香港 中国移动国际有限公司)) 33.033 ms
10 223.119.81.94( 香港 中国移动国际有限公司) (223.119.81.94( 香港 中国移动国际有限公司)) 3.018 ms 2.917 ms 101.4.114.169( 北京市 赛尔网络有限公司网络运行部) (101.4.114.169( 北京市 赛尔网络有限公司网络运行部)) 34.708 ms
11 101.4.114.221( 北京市 赛尔网络有限公司网络运行部) (101.4.114.221( 北京市 赛尔网络有限公司网络运行部)) 35.668 ms 35.621 ms 35.595 ms
12 101.4.112.66( 北京市 赛尔网络有限公司网络运行部) (101.4.112.66( 北京市 赛尔网络有限公司网络运行部)) 52.474 ms 101.4.114.169( 北京市 赛尔网络有限公司网络运行部) (101.4.114.169( 北京市 赛尔网络有限公司网络运行部)) 35.515 ms 101.4.112.66( 北京市 赛尔网络有限公司网络运行部) (101.4.112.66( 北京市 赛尔网络有限公司网络运行部)) 52.585 ms
13 101.4.117.161( 北京市 赛尔网络有限公司网络运行部) (101.4.117.161( 北京市 赛尔网络有限公司网络运行部)) 35.735 ms 35.867 ms 101.4.112.29( 北京市 赛尔网络有限公司网络运行部) (101.4.112.29( 北京市 赛尔网络有限公司网络运行部)) 67.916 ms
14 101.4.112.66( 北京市 赛尔网络有限公司网络运行部) (101.4.112.66( 北京市 赛尔网络有限公司网络运行部)) 52.843 ms 53.279 ms 101.4.117.53( 北京市 赛尔网络有限公司网络运行部) (101.4.117.53( 北京市 赛尔网络有限公司网络运行部)) 75.791 ms
15 101.4.112.17( 北京市 赛尔网络有限公司网络运行部) (101.4.112.17( 北京市 赛尔网络有限公司网络运行部)) 69.485 ms 101.4.112.29( 北京市 赛尔网络有限公司网络运行部) (101.4.112.29( 北京市 赛尔网络有限公司网络运行部)) 68.601 ms 101.4.112.17( 北京市 赛尔网络有限公司网络运行部) (101.4.112.17( 北京市 赛尔网络有限公司网络运行部)) 69.683 ms
16 101.4.117.53( 北京市 赛尔网络有限公司网络运行部) (101.4.117.53( 北京市 赛尔网络有限公司网络运行部)) 76.187 ms 101.4.117.177( 北京市 赛尔网络有限公司网络运行部) (101.4.117.177( 北京市 赛尔网络有限公司网络运行部)) 69.549 ms 70.631 ms
17 * * *
18 101.4.117.177( 北京市 赛尔网络有限公司网络运行部) (101.4.117.177( 北京市 赛尔网络有限公司网络运行部)) 70.363 ms * *
19 * * *
20 * * *
21 13h1.xjtu.edu.cn (202.117.13.1( 陕西省西安市 西安交通大学教育网)) 71.048 ms * 74.942 ms
[0 running job(s)] {history#7136} 12:27:20 2024-05-31root@xmh ~ # #

tl;dr

服务器位于 Equinix HK1 机房。
回程线路:
电信、联通绕日,走 IIJ 回程,延迟 < 150ms
移动、下交教育网直连回程,延迟 < 70ms
上交教育网::hong_kong::jp: → cernet(塞尔网络)

之前的 NetCup 的线路:
Anexia retn :de::cn: ,延迟 > 200ms,电信晚高峰丢包率 10%

如遇 DDoS,当守护进程监测 CPU 负载高于 90% 持续 5s 且 5s 内 GET 无响应,自动停止 web server 并 调用 CF API 更新 DNS record 通过反向连接的隧道接入:

curl -X PUT "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \
     -H "X-Auth-Email: user@example.com" \
     -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
     -H "Content-Type: application/json" \
     --data '{"type":"CNAME","name":"xjtu.app","content":"5a1d1078-ba77-40d1-85b5-6322b80d556d.cfargotunnel.com","ttl":{},"proxied":true}'

由于服务器上的 cloudflared 已经运行,因而切换是无感的。在某个时间间隔后自动切换回未攻击时的 record.

看网速测试挺完美的:
https://pagespeed.web.dev/analysis/https-xjtu-men/t8l18iwzob?form_factor=mobile

4 Likes

好快的速度

写了一个监控服务可用性,自动切换线路 / 启停 vulnerable caddy server 的脚本,理应很简单的,但我水平太差,不知道在后台运行着会不会出问题,懂的进,帮我找找逻辑漏洞修改修改。

import os
import time
from time import sleep

# import psutil

INTERVAL_BETWEEN_CHECK = 20
INTERVAL_GET = 3
GET_TIMEOUT = 3
INTERVAL_DDOS_RECOVER = 300  # 5min
# INTERVAL_DDOS_RECOVER = 70
# CPU_THRES = 90
GET_CHECK_URL = 'https://xjtu.app/faq'


def get_current_route():
    try:
        cdn_cgi_url = 'https://xjtu.app/cdn-cgi/trace'
        response = requests.request("GET", cdn_cgi_url)
        res = 'direct' if response.status_code == '404' else 'argo'
        print(f'we are using {res}')
        return res
    except Exception as e:
        print(f'assume we are in direct anyway, as {e}')
        return 'direct'

import json
import requests


class AttrDict(dict):
    __setattr__ = dict.__setitem__
    __getattr__ = dict.__getitem__


zone_id = ''  # xjtu.app
url_list_all_dns_in_zone = f'https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records'
headers_brr = {
    "Authorization": "Bearer ",
}
headers_eml = {
    "Content-Type": "application/json",
    "X-Auth-Email": ".com",
    "X-Auth-Key": "",
}
target_dns_record_id = ''  # xjtu.app


def switch_to_cf_argo():
    current_route = get_current_route()
    if current_route == 'argo':
        print(f'skip as we already in {current_route}')
        return
    print('switch to argo')
    domain, proxied = 'adeba3a2-0d62-4a07-a9c0-c5cdbfcd5843.cfargotunnel.com', True
    print('stop caddy')
    os.system('sudo systemctl stop cd')
    send_payload_to_cf(domain, proxied)


def switch_to_direct():
    current_route = get_current_route()
    if current_route == 'direct':
        print(f'skip as we already in {current_route}')
        return
    print('switch to direct')
    domain, proxied = 'direct.xjtu.app', False
    os.system('sudo systemctl start cd')
    print(f'sleep 3s for caddy to be up')
    sleep(3)
    send_payload_to_cf(domain, proxied)



def send_payload_to_cf(domain, proxied):
    payload = {
        "content": domain,
        "name": 'xjtu.app',
        "proxied": proxied,
        "type": "CNAME",
        # "comment": "Domain verification record",
        # "tags": ["owner:dns-team"],
        "ttl": 60,
        # "ttl": 1,
    }
    url_subdomain_dns_record = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{target_dns_record_id}"

    response = requests.request("PATCH", url_subdomain_dns_record, json=payload, headers=headers_brr)

    parsed = json.loads(response.text)
    parsed = AttrDict(parsed)
    if not parsed.success:
        print('set cname target failed')
    else:
        print(f'successfully set cname to {domain}')



flag_switch_to_argo = os.environ.get('SWITCH') == 'argo'
flag_switch_to_direct = os.environ.get('SWITCH') == 'direct'
if flag_switch_to_direct:
    switch_to_direct()
    exit(3)
if flag_switch_to_argo:
    switch_to_cf_argo()
    exit(4)

under_ddos = False
last_ddos_time = None
while True:
    # cpu_percent = psutil.cpu_percent()
    # if cpu_percent > CPU_THRES:
    #     sleep(INTERVAL_CPU)
    #     cpu_percent = psutil.cpu_percent()
    # if cpu_percent > CPU_THRES:
    #     print(f'high cpu, will check if GET will fail')
    try:
        response = requests.request("GET", GET_CHECK_URL, timeout=GET_TIMEOUT)
        status = str(response.status_code)
        if status.startswith('2') or status.startswith('3'):
            print(f'GET result is OK: {status}')
        elif status == '403' and 'Just a moment' in response.text:
            print(f'reached CF browser check')
            if not under_ddos:
                under_ddos = True
                last_ddos_time = time.time()
        else:
            print(f'GET result is bad: {status}, will retry in {INTERVAL_GET}s')
            response = requests.request("GET", GET_CHECK_URL, timeout=GET_TIMEOUT)
            status = str(response.status_code)
            if not (status.startswith('2') or status.startswith('3')):
                switch_to_cf_argo()
                under_ddos = True
                last_ddos_time = time.time()
    except (requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout):
        print(f'GET timeout in {GET_TIMEOUT}s, will try another time')
        try:
            response = requests.request("GET", GET_CHECK_URL, timeout=GET_TIMEOUT)
            status = str(response.status_code)
            if not (status.startswith('2') or status.startswith('3') or (
                    status == '403' and 'Just a moment' in response.text)):
                print(f'GET result is bad: {status}, will retry in {INTERVAL_GET}s')
                response = requests.request("GET", GET_CHECK_URL, timeout=GET_TIMEOUT)
                status = str(response.status_code)
                if not (status.startswith('2') or status.startswith('3')):
                    switch_to_cf_argo()
                    under_ddos = True
                    last_ddos_time = time.time()
        except (requests.exceptions.Timeout, requests.exceptions.ConnectionError,
                requests.exceptions.ConnectTimeout):
            switch_to_cf_argo()
            under_ddos = True
            last_ddos_time = time.time()
    if under_ddos:
        print('❌', end='')
    else:
        print('✔️', end='')
    if under_ddos:
        time_from_last_ddos_switch = time.time() - last_ddos_time
        if time_from_last_ddos_switch > INTERVAL_DDOS_RECOVER:
            print(f'{time_from_last_ddos_switch} (>{INTERVAL_DDOS_RECOVER}) passed since last DDOS switch, switch back to direct')
            switch_to_direct()
            under_ddos = False
        else:
            print(f'{time_from_last_ddos_switch}s elapsed since last DDOS switch')
    sleep(INTERVAL_BETWEEN_CHECK)


os.system 中直接 sudo 可能会被要求输入密码?

3 Likes

感觉这两天这个 hosthatch 家的 :hong_kong: 服务器用起来很爽,但愿不要被 mjj 冲烂。

最近没 ddos 也没法检验我的脚本的有效性,有点难受,希望 ddos 我的兄弟看到这条记得尽快 d 一下。

2 Likes