wenqiang li

Results 130 issues of wenqiang li

### 概述 [chisel](https://github.com/jpillora/chisel) go编写的隧道工具,支持tcp/udp。 官方介绍是“a fast TCP/UDP tunnel, transported over HTTP, secured via SSH.” 编译后只有一个chisel,同时支持客户端和服务端。 ``` chisel -h Usage: chisel [command] [--help] Version: 0.0.0-src (go1.19.6) Commands: server - runs chisel...

### 概述 bpf可以跟踪内核函数,并打出调用栈。例如我们可以跟踪`socket()`的创建。 跟踪`nc`这个程序的`socket`调用。 ```zsh $ objdump -tT /bin/nc |grep socket 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 socket ``` socket 这个函数是定义在glibc的,ldd看下依赖: ```zsh ldd /bin/nc |grep libc.so libc.so.6 => /lib64/libc.so.6 (0x00007f045d4b2000) ```...

### 概述 ebpf是什么,有什么作用在前面的笔记中已经做了记载。 本篇学习[cilium/ebpf](https://github.com/cilium/ebpf)项目。 ### 运行 先跑起来。。。 ebpf需要在比较新的内核才支持。我本地ubuntu22.10,内核是5.19.0。 本项目建议不要折腾centos了,clang和llvm很难找到源。 ubuntu先安装clang、llvm、golang, 我本地clang和llvm是15,golang是1.19。 cilium/ebpf项目编译还需要安装docker。 ```sh $ apt-cache search clang $ apt-cache search llvm $ apt-cache search golang $ apt-cache search docker.io $...

### 概述 学习和使用Linux系统的时候总会遇到一些问题,而有的问题可能会遇到不止一次,本篇就是为了积累这些会遇到多次的问题的。 便于回看。 ### 问题 #### dmesg: net_ratelimit: N callbacks suppressed 表示内核阻止了N条syslog消息,这是因为系统重复的日志过多(频率过高),太快输出,被内核中的net_ratelimit()限制了syslog消息。代码参考 [___ratelimit](http://fxr.watson.org/fxr/ident?v=linux-2.6;i=___ratelimit) 。这个rate limit也是Linux为了避免DoS攻击的一种机制,避免每个消息都被记录(会导致存储空间撑爆)。当内核记录消息,使用printk()通过这种机制来检查是否输出日志。 这个限制可以通过`/proc/sys/kernel/printk_ratelimit`和`/proc/sys/kernel/printk_ratelimit_burst`来调优。默认配置(RHEL6)分别是5和10。也就是说,内核允许每5秒记录10条消息。超过这个限制,内核就会抛弃日志,并记录ratelimit N: callbacks suppressed 然而,在内核的网络代码中有自己的限制配置(逻辑相同,但是是独立的配置) `/proc/sys/net/core/message_cost`和`/proc/sys/net/core/message_burst`,默认配置也是5和10。这里message_cost也是日志采样时间。 如果要关闭ratelimit机制,也就是允许每个消息都记录下来,则可以设置message_cost值为0 `sysctl -w net.core.message_cost=0` 不过,一旦关闭ratelimit,系统就可能存在被日志攻击的风险。 ### 问题 ####...

### 概述 #### BPF是什么? `BPF`全称是伯克利包过滤器(Berkeley Packet Filter),最早是伯克利大学发明用于内核实现网络数据包过滤的。 因设计理念新和性能高,发展到现在名称升级为`eBPF`(extended Berkeley Packet Filter),同时功能也支持的更多,不再仅仅是网络分析,可以基于`eBPF`开发性能分析、系统追踪、网络优化等。 eBPF 由 执行字节码指令、存储对象 和 辅助函数 组成。 #### BPF有什么作用? 有时候需要改动Linux内核实现一些功能,首先要考虑 “安全性”,不能允许不可信的代码运行在内核中,其次还要考虑“高性能”和“持续交付”。 我们可以通过开发Linux模块实现,但是需要有一定的Linux内核基础,并且随着Linux版本迭代,开发的Linux模块可能需要改动才能运行,搞不好就把Linux内核搞挂了。而BPF很好的解决了上述问题: * 强安全:BPF验证器(verifier)会保证每个程序能够安全运行,它会去检查将要运行到内核空间的程序的每一行是否安全可靠,如果检查不通过,它将拒绝这个程序被加载到内核中去,从而保证内核本身不会崩溃,这是不同于开发内核模块的。 * 高性能:一旦通过了BPF验证器,那么它就会进入JIT编译阶段,利用Just-In-Time编译器,编译生成的是通用的字节码,它是完全可移植的,可以在x86和ARM等任意球CPU架构上加载这个字节码,这样我们能获得本地编译后的程序运行速度,而且是安全可靠的。 * 持续交付:通过JIT编译后,就会把编译后的程序附加到内核中各种系统调用的钩子(hook)上,而且可以在不影响系统运行的情况下,实时在线地替换这些运行在Linux内核中的BPF程序。 #### BPF是怎么工作的?...

### 概述 error log 记录了nginx系统日志,区别于业务日志。 封装成ngx_errlog_module模块,代码在文件core/ngx_log.h|c中。 ngx_errlog_module 属于核心模块NGX_CORE_MODULE,提供了`error_log`配置指令。 ### 代码分析 涉及到的结构体: ```c // 封装打开的文件结构体 定义在core/ngx_conf_file.h 文件中 struct ngx_open_file_s { ngx_fd_t fd; // 打开的文件描述符 ngx_str_t name; void (*flush)(ngx_open_file_t *file, ngx_log_t *log);...

nginx
Linux

Can use `SSL_set_options` and `SSL_set_cipher_list` to modify `ssl_protocols` and `ssl_ciphers` in the `ssl_certificate_by_lua_*` phase? Maybe the `ssl_protocols` modification is invalid, have way?

@spacewander TBR

## 概述 每个语言都有自己的错误处理,例如:C的errno、C++的try-catch、golang的error interface。 rust也有自己的错误处理,考虑自身语言的特点和几种错误处理的情况,rust使用`Error`这个trait结合`Result`这个枚举类型实现。 ## 实现 ### std::result::Result 用作函数的返回,通过`match`、`unwrap`、 `unwrap_or `、 `?` 处理结果。 ```rust pub enum Result { Ok(T), Err(E), } ``` ### std::error::Error ```rust // 调试用 pub trait...

## 概念 并行:多个cpu并行的执行多个任务。 并发: 一个cpu交替的执行多个任务。 CPU密集型:占用cpu资源的任务。 IO密集型:占用IO资源的任务。IO密集型的任务使用并发异步编程可以更好的利用CPU提升性能。 简单的rust多线程程序: ```rust use std::thread; use std::thread::sleep; use std::time::Duration; fn main() { println!("===0===="); let h1 = thread::spawn(|| { let s = test_1(); println!("===1=== {}",...