分类目录归档:云乞讨

iptables 转发流量 2021-11-07

使用iptables转发流量的命令语法,简单示例一个TCP转发

iptables -A PREROUTING -p tcp -m tcp --dport 中转服务器入口端口号 -j DNAT --to-destination 目标服务器IP地址:目标服务器端口号

iptables -A POSTROUTING -d 目标服务器IP地址/32 -p tcp -m tcp --dport 目标服务器端口号 -j SNAT --to-source 中转服务器本地IP地址

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 中转服务器入口端口号 -j ACCEPT
Donate
云乞讨

Python3框架FLASK知识点 2021-11-2

基础安装

# apt-get update
# apt-get install python3-pip python3 python3-gevent

基础的一个示例

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2021-11-02 
# Dasmz  

import flask

app = flask.Flask(__name__)

@app.route('/', methods=['GET'])
def index():
        return '<p>Hello World!</p>'

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=41012) 


# 服务端 
root@cafe560b8380:~# python3 1102-1634.py 
 * Serving Flask app '1102-1634' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.3:41012/ (Press CTRL+C to quit)
x.×.12.211 - - [02/Nov/2021 08:34:42] "GET / HTTP/1.1" 200 -
x.x.12.211 - - [02/Nov/2021 08:34:42] "GET /favicon.ico HTTP/1.1" 404 -
x.x.12.211 - - [02/Nov/2021 08:35:16] "GET / HTTP/1.1" 200 -
# 客户端,验证请求
curl http://198.*.*.196:41012/
<p>Hello World!</p>
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2021-11-02 
# Dasmz

import flask

app = flask.Flask(__name__)

# 主路由
@app.route('/', methods=['GET'])
def index():
        return '<p>Hello World!</p>\n'

# 增加一个名称的路径参数
@app.route('/home/<name>', methods=['GET'])
def home(name):
        return '<p>Hello World!<br><br> Hi, <b>{}</b>.</p>\n'.format(name)
        
if __name__ == "__main__":
    app.run(host='0.0.0.0',port=41012) 



#  curl http://IPv4:41012/
#  curl http://IPv4:41012/home/david
#  curl http://IPv4:41012/home/J.J.HarrySon
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2021-11-02 
# Dasmz

import flask

app = flask.Flask(__name__)

# 主路由
@app.route('/', methods=['GET'])
def index():
        return '<p>Hello World!</p>\n'

# 增加一个名称的路径参数
@app.route('/home/<name>', methods=['GET'])
def home(name):
        return '<p>Hello World!<br><br> Hi, <b>{}</b>.</p>\n'.format(name)

# 增加API,返回客户端的UA
@app.route('/API/getUA', methods=['GET'])
def getUserAgent():
        return '{}\n'.format(flask.request.headers.get('User-Agent'))
        
if __name__ == "__main__":
    app.run(host='0.0.0.0',port=41012) 



#  curl http://IPv4:41012/
#  curl http://IPv4:41012/home/david
#  curl http://IPv4:41012/home/J.J.HarrySon
#  curl http://IPv4:41012/API/getUA

收集的测速链接地址 更新于2021-10-31

从网络收集到的一些测速链接的地址,酌情选用

波兰 http://waw.lg.webhorizon.in/50MB.test
英国OVH http://51.195.146.211/LookingGlass/25MB.test
英国OVH http://51.195.146.211/LookingGlass/50MB.test
英国OVHhttp://51.195.146.211/LookingGlass/100MB.test
荷兰 http://lg-nl.viridweb.com/25MB.test
荷兰 http://lg-nl.viridweb.com/50MB.test
荷兰 http://lg-nl.viridweb.com/100MB.test
荷兰 http://lg.hostslim.nl/LookingGlass/100M.test
美国-Spokane-WA  https://wa.hostodo.com/10MB.test
美国-Spokane-WA  https://wa.hostodo.com/100MB.test
美国-Las-Vegas-NV https://lv.hostodo.com/10MB.test
美国-Las-Vegas-NV https://lv.hostodo.com/100MB.test
美国-Miami-FL https://mia.hostodo.com/10MB.test
美国-Miami-FL https://mia.hostodo.com/50MB.test
美国-Miami-FL https://mia.hostodo.com/100MB.test
荷兰-Lelystad-The-Netherlands http://lg.hostslim.nl/LookingGlass/100M.test
日本-Equinix-TY8-Japan http://tyo.lg.webhorizon.in/50MB.test
荷兰-Naaldwijk https://lg-nl.incognet.io/10MB.test
荷兰-Naaldwijk https://lg-nl.incognet.io/100MB.test
芬兰-Helsinki https://lg-fin.incognet.io/10MB.test
芬兰-Helsinki https://lg-fin.incognet.io/100MB.test
英国-Kent https://looking-glass.cloudxtiny.co.uk/25MB.test
德国-Niederlande https://lg.nl.haendler.it/100MB.test
荷兰-Wormer-Netherlands http://ams-test.softshellhosting.com/25MB.test
澳大利亚-Sydney https://lg.quantumcore.com.au/15MB.test
澳大利亚-Sydney https://lg.quantumcore.com.au/25MB.test
澳大利亚-Sydney https://lg.quantumcore.com.au/50MB.test
罗马尼亚-Bacau http://proof.hazi.ro/100MB.test
Donate
云乞讨

在Ubuntu桌面环境下,通过dd给树莓派写入镜像到TF/SD卡 2021-10-10

需求

手头有一个上古时期的树莓派,型号是B+ V1.2,可以给它一个镜像,用来当作玩具。

镜像官网: https://www.raspberrypi.com/software/operating-systems/

一、我这里,只是需要最简单的服务器环境,故而,选择下载

https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip

二、哈希校验

c5dad159a2775c687e9281b1a0e586f7471690ae28f2f2282c90e7d59f64273c

# sha256sum  2021-05-07-raspios-buster-armhf-lite.zip 
c5dad159a2775c687e9281b1a0e586f7471690ae28f2f2282c90e7d59f64273c  2021-05-07-raspios-buster-armhf-lite.zip

三、解压,文件大小约为1.8GB,所以至少需要容量为2GB的TF/SD存储卡

# unzip 2021-05-07-raspios-buster-armhf-lite.zip
# ls -lh 2021-05-07-raspios-buster-armhf-lite.img
-rw-r--r-- 1 fd fd 1.8G May  7 23:00 2021-05-07-raspios-buster-armhf-lite.img

四、写入,我这里选择的一个16GB的TF/SD卡

# fdisk -l
Disk /dev/sda: 15 GiB, 16110321664 bytes, 31465472 sectors
Disk model: STORAGE DEVICE  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6c586e13

# dd bs=1M if=2021-05-07-raspios-buster-armhf-lite.img  of=/dev/sda
1788+0 records in
1788+0 records out
1874853888 bytes (1.9 GB, 1.7 GiB) copied, 203.858 s, 9.2 MB/s

五、在boot分区下,写入一个空白的名称为SSH文件

六、TF/SD卡插入树莓派,接上网线,接上电源

OBS初始化设置 2021-9-27

OBS设置

  1. 设置,通用,语言,简体中文
  2. 设置,通用,主题,System
  3. 输出,串流,视频比特率 4000Kbps
  4. 输出,录像,路径,D:/OBS/
  5. 输出,录像,质量,近似无损的质量
  6. 输出,录像,格式,MP4
  7. 输出,录像,编码器,硬件
  8. 视频,基础分辨率,输出分辨率,都选择1920*1080
  9. 热键,开始录制,F1
  10. 热键,结束录制,F2

软路由 x86的CPU Openwrt LEDE使用教程 2021-9-23

简单描述配置x86软路由的过程,我自己的笔记本电脑为Linux系统

步骤一、格式化SSD固态硬盘

设备,
* 2.5英寸 USB3.0外置硬盘盒 1个
* 2.5英寸 120GB SATA接口的固态硬盘 1个

一般30GB的固态硬盘容量足够安装Openwrt,我这个是闲置的一块SSD,把SSD固态硬盘,通过外置的USB盒子连接到自己的电脑,打开终端,通过fdisk命令找到该盘的盘符
# fdisk -l   
 
执行格式化的操作
# fdisk /dev/sda
格式化SSD硬盘

步骤二、自己编译Openwrt的镜像或者下载网络上现成的镜像

图省事的,可以直接选用Koolshare固件,http://fw.koolcenter.com/

2021-9-23

当前的x86版本的固件下载地址 http://fw.koolcenter.com/LEDE_X64_fw867/openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img.gz

使用命令解压

gzip -d openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img.gz

// 自己编译Openwrt固件的教程,不在这篇文章里描述,将来另开章节

步骤三、将固件的image文件dd进硬盘

直接使用dd命令,进行镜像数据的写盘,最好用root用户执行dd,参考命令,其中/dev/sda,需根据实际的写。

root@pc:~# dd bs=1M if=./openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img  of=/dev/sda
700+1 records in
700+1 records out
734527488 bytes (735 MB, 700 MiB) copied, 2.98561 s, 246 MB/s
root@pc:~# 

// bs 参数 是每次写入的块的大小,一般1MB可以了

// if 参数 是输入的文件,这里是镜像文件

// of 参数 是输出的设备,这里是我那块120G的固体硬盘,我这里是/dev/sda,你们根据实际的写。

步骤四、设备安装

将刚刚写入镜像数据的盘,从硬盘盒中取出,连接进软路由设备中,一般就是SATA数据和电源供电,两根线的连接,很简单。

步骤四、软路由的初始化配置

配置自己的电脑网口到192.168.1.10,用网线连接到软路由的LAN口,在软路由的离线状态,修改的内容如下,WEB登录192.168.1.1 默认用户root 默认密码koolshare

  • 修改,system,system,Language语言设置,简体中文
  • 修改,系统,系统,常规设置,主机名,GWCU
  • 修改,系统,管理权,SSH访问,接口,LAN
  • 修改,网络,接口,确认LAN/WAN端口工作于哪个物理端口,贴标签纸
    // 本次,我这里,eth0-LAN, eth1-WAN
    // 因为软路由设备性能超赞,故而,WAN口使用拨号桥接到光猫
  • 修改,网络,接口,协议,PPPoE,输入自己的宽带账号,宽带密码
  • 修改,网络,负载均衡,这个如果多宽带运营商WAN接入的,可以配置
  • 修改,系统,进阶设置,配置网络,直接修改LAN的ipaddr,到10.X.X.X的内网网段,这个可以不设置,我自己用10的段,习惯了。
  • 修改,酷软,离线安装,v.2.3.7版本的客户端
  • 系统,关机
设置语言为简体中文

步骤五、软路由连接到光猫

软路由的WAN1 到联通光猫的LAN1
软路由的WAN2 到电信光猫的LAN1
软路由的LAN1 到千兆交换机的LAN

// 一般光猫,有的只有LAN1是千兆口,LAN2是IPTV,其他是缩配的百兆口

// 网线,推荐使用六类的网线,家用足够

开机,Power On,骑上我的小骆驼,高速稳定的家庭数据的核心,软路由就上线了。

Donate
云乞讨

Python3 的协程 asyncio 2021-9-22

asyncio 资料备忘

CPU Bound -- Multi Processing

I/O Bound
Fast I/O
Limited Number of Connections -- Multi Threading

I/O Bound
Slow I/O
Many Connections -- Asyncio

协程 coroutine

import asyncio
import datetime

async def getNow():
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")


async def getRuntime():
    v =  await getNow()
    print(v)


asyncio.run(getRuntime())

# 使用async关键字 声明异步方法
# 使用await关键字 等待协程执行完成
# 使用asyncio.run(某个async方法) 执行

Python3 多线程 threading 2021-9-22

Python3 多线程 threading 备忘录

t.setDaemon(True)  // 线程声明为守护线程,必须在start() 方法调用之前设置
t.start()  // 开始线程活动
t.join()  // 在子线程完成运行之前,这个子线程的父线程将一直被阻塞
方法与属性 描述
current_thread() 返回当前线程
active_count() 返回当前活跃的线程数,1个主线程+n个子线程
get_ident() 返回当前线程
enumerate() 返回当前活动 Thread 对象列表
main_thread() 返回主 Thread 对象
settrace(func) 为所有线程设置一个 trace 函数
setprofile(func) 为所有线程设置一个 profile 函数
stack_size([size]) 返回新创建线程栈大小;或为后续创建的线程设定栈大小为 size
TIMEOUT_MAX Lock.acquire(), RLock.acquire(), Condition.wait() 允许的最大超时时间
对于Thread类,它的定义如下:

threading.Thread(self, group=None, target=None, name=None,
     args=(), kwargs=None, *, daemon=None)

# 参数group是预留的,用于将来扩展;
# 参数target是一个可调用对象,在线程启动后执行;
# 参数name是线程的名字。默认值为“Thread-N“,N是一个数字;
# 参数args和kwargs分别表示调用target时的参数列表和关键字参数
Thread类定义了以下常用方法与属性:

方法与属性 : 说明
start() : 启动线程,等待CPU调度

run() : 线程被cpu调度后自动执行的方法

getName()、setName()和name : 用于获取和设置线程的名称

setDaemon() : 设置为后台线程或前台线程(默认是False,前台线程)。如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止。如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程执行完成后,程序才停止

ident : 获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None

is_alive() : 判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断这段时间内,线程是激活的

isDaemon()方法和daemon属性 : 是否为守护线程

join([timeout]) : 调用该方法将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。
Python在threading模块中定义了几种线程锁类,分别是:

    Lock 互斥锁
    RLock 可重入锁
    Semaphore 信号
    Event 事件
    Condition 条件
    Barrier 阻碍
Donate
云乞讨

采集网络公开的shadowsocks线路 2021-9-13

需求描述,

采集网络公开的shadowsocks线路,玩具类型,项目编号P1SS

技术分析

一般情况下,一个普通的shadowsocks文件如下
ss://YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3#US

1. ss://是协议标识
2. YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3是信息内容正文
3. #US是注释内容

将信息正文的内容转码

YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3
-->
b'aes-256-cfb:123456!@#$:@101.79.55.201:8087'

可以发现是一个bytes类型的字符串

既然得到一个字符串,则可以对字符串,进行切割,获得其中的数据

// 最后一个@字符进行切分字符串
>>> s = 'aes-256-cfb:123456!@#$:@101.79.55.201:8087'
>>> s.rsplit('@',1)
['aes-256-cfb:123456!@#$:', '101.79.55.201:8087']

// 可以切分得到1 加密算法:密码
// 可以切分得到2 IP:端口
// 切分 加密算法:密码
>>> s = 'aes-256-cfb:123456!@#$:'
>>> s.split(':',1)
['aes-256-cfb', '123456!@#$:']
>>> 

// 切分 IP:端口
>>> s = '101.79.55.201:8087'
>>> s.split(':',1)
['101.79.55.201', '8087']
>>> 

通过3步的字符串的切分,即可以获取到需要的4个数据信息,校验一下,就可以进行入库的操作

采集源头,分类
1. ss list,一个包含JSON数据信息的列表
[
{
  "remarks": "NL1",
  "server": "5.253.207.85",
  "server_port": "49396",
  "method": "aes-256-gcm",
  "password": "BdRWC38L5JUDMTYNNxJGcUwB",
  "plugin": "",
  "plugin_opts": {}
},
{
  "remarks": "NL2",
  "server": "5.253.207.86",
  "server_port": "49396",
  "method": "aes-256-gcm",
  "password": "BdRWC38L5JUDMTYNNxJGcUwB",
  "plugin": "",
  "plugin_opts": {}
},
...
]

2. ss sub,一个base64转码的字符串
base64encode(
ss://238917498723...\n
ss://238472938749...\n
...
)

3. ss content,一个字符串,其中包含一段ss://298739879287的字符

架构为 前/后/库 分离

数据库 <==> API服务器 <== invoker采集服务器 <==> 采集跳板 <==> 数据源1/2/3/...
数据库 <==> API服务器 <==> checker检测服务器 <==> 检测跳板 <==> 检测站CN1/US1
数据库 <==> API服务器 ==> publish发布服务器 <==> 发布跳板 <==> WEB站Web1/Web2
Donate
云乞讨