kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp

高精度定时器示例

这样设置会更好???

1
nohz=off highres=off

http://blog.chinaunix.net/uid-361890-id-257337.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/hrtimer.h>
#include <linux/jiffies.h>

static struct hrtimer timer;
ktime_t kt;

static enum hrtimer_restart hrtimer_handler(struct hrtimer *timer)
{
	//kt = ktime_set(1, 10);
	printk(" ------ I am in hrtimer -----\n");
	hrtimer_forward(timer, timer->base->get_time(), kt);
	return HRTIMER_RESTART;
}

static int __init test_init(void)
{
	pr_info("timer resolution: %lu\n", TICK_NSEC);
	kt = ktime_set(1, 10); /* 1 sec, 10 nsec */
	hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	//hrtimer_set_expires(&timer, kt);
	hrtimer_start(&timer, kt, HRTIMER_MODE_REL);
	timer.function = hrtimer_handler;

	printk("\n-------- test start ---------\n");
	return 0;
}

static void __exit test_exit(void)
{
	hrtimer_cancel(&timer);
	printk("-------- test over ----------\n");
	return;
}

MODULE_LICENSE("GPL");

module_init(test_init);
module_exit(test_exit);

编译:

1
2
3
4
5
6
7
8
9
10
name = test.o
obj-m := $(name)

KERNELDIR := /home/tangyt/tmp/linux-2.6-cloud.p1020/

default:
	make -C $(KERNELDIR) M=$(shell pwd) modules

clean:
	make -C $(KERNELDIR) M=$(shell pwd) clean

perf 火焰图分析程序性能

https://www.cnblogs.com/happyliu/p/6142929.html

使用火焰图展示结果

1、Flame Graph项目位于GitHub上:https://github.com/brendangregg/FlameGraph

2、可以用git将其clone下来:git clone https://github.com/brendangregg/FlameGraph.git

我们以perf为例,看一下flamegraph的使用方法:

1、第一步

1
sudo perf record -e cpu-clock -g -p 28591

Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data.

2、第二步

用perf script工具对perf.data进行解析

1
perf script -i perf.data &> perf.unfold

3、第三步

将perf.unfold中的符号进行折叠:

1
./stackcollapse-perf.pl perf.unfold &> perf.folded

4、最后生成svg图:

1
./flamegraph.pl perf.folded > perf.svg

Ubuntu+SS

Shadows启动报错undefined symbol EVP_CIPHER_CTX_cleanup

vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py

cleanup替换为reset

测试socks5命令:

curl –socks5 192.168.8.107:8388 http://www.baidu.com/


https://www.codetd.com/article/1418936

1 安装

1
2
sudo apt-get install python-pip
pip install shadowsocks

2 配置

vim config.json

1
2
3
4
5
6
7
8
9
10
{
	"server":"0.0.0.0",
	"port_password": {
		"8388": "your_password1",
		"8389": "your_password2"
	},
	"timeout":600,
	"method":"aes-256-cfb",
	"fast_open": false
}

3. 启动

1
2
3
4
ssserver -c config.json start

ssserver -c config.json -d start
ssserver -c config.json -d stop

4. server

vim /etc/systemd/system/shadowsocks.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Shadowsocks
After=network.target

[Service]
Type=forking
PIDFile=/run/shadowsocks/server.pid
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /run/shadowsocks
ExecStartPre=/bin/chown root:root /run/shadowsocks
ExecStart=/usr/local/bin/ssserver --pid-file /var/run/shadowsocks/server.pid -c /etc/shadowsocks/config.json -d start
Restart=on-abort
User=root
Group=root
UMask=0027

[Install]
WantedBy=multi-user.target

设置文件权限:

1
chmod 755 /etc/systemd/system/shadowsocks.service

启动服务:

1
2
systemctl start shadowsocks
systemctl enable shadowsocks

5. 客户端

https://github.com/shadowsocks/shadowsocks-qt5/releases

ShadowSocks原理

https://my.oschina.net/moziBlog/blog/3190520

ssh tunnel

1、首先用户和服务器基于 ssh 建立起一条加密的通道

2、用户通过建立起的隧道进行代理,通过 ssh server 向真实的服务发起请求

3、服务通过 ssh server,再通过创建好的隧道返回给用户

ssh 本身就是基于RSA 加密技术,无法获取数据传输的过程中的加密数据内容。但由于ssh本身的特征是明显的,所以通过分析连接的特征能得出是ss。

shadowsocks

shadowsocks将原来ssh创建的 Socks5协议拆开成 server 端和 client 端

1、客户端发出的请求基于Socks5协议跟 ss-local 端进行通讯,返个 ss-local 一般是本机或是代理服务器

2、ss-local 和 ss-server两端通过多种可选的加密方法进行通讯,用常规的 TCP包。

3、ss-server 将收到的加密数据进行解密,还原原来的请求,再发送到用户需要访问的服务,获得响应原路返回

SOCKS5 协议

http://www.moye.me/2017/08/03/analyze-socks5-protocol/

SOCKS5 协议并不负责代理服务器的数据传输环节,此协议只是在C/S两端真实交互之间,建立起一条从客户端到代理服务器的授信连接。来看看细节:

协议流程

从流程上来说,SOCKS5 是一个C/S 交互的协议,交互大概分为这么几步:

1
2
3
4
5
6
7
客户端发送认证协商
代理服务器就认证协商进行回复(如拒绝则本次会话结束)
	如需GSSAPI或用户名/密码认证,客户端发送认证信息
	代理服务器就对应项进行鉴权,并进行回复或拒绝
客户端发送希望连接的目标信息
代理服务器就连接信息进行确认或拒绝
【非协议内容】:代理服务器连接目标并 pipe 到客户端

协议细节

1. 认证

认证方法:

1
2
3
4
5
6
0x00: NO AUTHENTICATION REQUIRED
0x01: GSSAPI
0x02: USERNAME/PASSWORD
0x03: to X’7F’ IANA ASSIGNED
0x80: to X’FE’ RESERVED FOR PRIVATE METHODS
0xFF: NO ACCEPTABLE METHODS

1.1 客户端 -> 代理服务器,请求认证:

版本号(1字节)可供选认证方法(1字节)选择的方法(1~255字节)
固定为5选了多少种都有上表中哪些方法

1.2 代理服务器 -> 客户端,响应认证:

版本号(1字节)确认认证的方法
固定为5认证方法列表的某项:
0x00,则无需客户端发送进一步认证的信息
0x01,则需要客户端进行进一步认证,细节见 RFC1929
0x01,则需要客户端进行进一步认证,细节见RFC2743
0xFF,则相当于拒绝请求,客户端只能关闭连接

2. 请求信息

2.1 客户端 -> 代理服务器,发送目标信息:

版本号(1字节)命令(1字节)保留(1字节)请求类型(1字节)地址(不定长)端口(2字节)
固定为50x01: CONNECT
0x02: BIND
0x03: UDP ASSOCIATE
固定为 0x000x01: IP V4 地址
0x03: 域名
0x04: IP V6 地址
如果请求类型是域名,
第个1字节为 域名的长度

命令字段说明:

1
2
3
CONNECT:  用于客户端请求服务器进行代理
BIND:  用于客户端向服务器上报自己的反向连接监听地址(应用场景如 FTP 下载,客户端需要接受来自服务器的连接
UDP ASSOCIATE:用于请求建立到 UDP 数据报中继的连接

2.2 代理服务器 -> 客户端,确认连接:

版本号(1字节)确认回应(1字节)保留(1字节)响应类型(1字节)地址(不定长)端口(2字节)
固定为50x00: succeeded
0x01: general SOCKS server failure
0x02: connection not allowed by ruleset
0x03: Network unreachable
0x04: Host unreachable
0x05: Connection refused
0x06: TTL expired
0x07: Command not supported
0x08: Address type not supported
0x09: to X’FF’ unassigned
固定为 0x00 仅用于响应客
户端BIND命令:
0x01: IP V4 地址
0x03: 域名
0x04: IP V6 地址
仅用于响应客
户端BIND命令:
如果请求
类型是域名,
第个1字节为
域名的长度
仅用于响应客
户端BIND命令

可以看出,在代理服务器确认回应为 0x00 时,此次 SOCKS5 协议协商部分顺利完成,宣告进入到数据传输阶段(也可以说,这之后发生的事已经与SOCKS5协议无关)。