kayoch1n's blog

「願いは誰にも 撃ち落とせない」

用容器模拟组建网络

一键自动化

用 docker-compose 组建容器的网络有很多好处: 首先,这个方法不需要准备多个真机和路由器,只要在单个运行Linux的机器上就能实现; 其次是得益于Linux namespace的隔离特性,变更路由或者修改防火墙等网络设置只会影响到单一容器而不影响宿主机; 还有就是便于执行自动化任务。在节点上执行命令其实就是在宿主机上执行 docker exec;配合 tc 可以实...

关于IP包长度超过MTU这件事

sudo tcpdump -n -v -i eth0 'tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)' 抓取 tls handshake message。这条filter的解释可以见这里 tcpdump: listening on eth0, link-type EN10MB (Ethernet...

暗度陈仓:Linux TUN 接口

一个简单的 VPN demo

/dev/net/tun 是个特殊的文件,它是个字符设备(character special)(/dev/urandom 也是个字符设备),可按照字节流读取or写入 IP packets(L3)。上一篇笔记提到,通过 fd 写入 tun 接口的数据,会被视为操作系统从 tun 接口接收到的 IP packets。与之对应,当 IP packets 离开 netfilter 时,如果 OUT ...

Linux iptables 防火墙”

一个使用 tun 接口实现 ping 的demo

这篇笔记要从一个 demo 说起。原程序是 github上面一个开源的rust网络通信组件的example,可以使用 tun 接口进行ping。因为我对 tun 接口以及 netfilter 的了解几乎是零,所以就有了这篇学习笔记,这篇笔记的主题是 netfilter,tun 接口的相关笔记在下一篇文章。 改写成 Python 例子 用 Python 改写了下这个 example,下文简...

从一次DNS失效看 Ubuntu DNS 机制

桥接实验结束之后通过iproute2手动恢复多网卡。发现原先的 DNS 不管用了 ubuntu@VM-0-5-ubuntu:~/project$ curl qq.com curl: (6) Could not resolve host: qq.com 众所周知DNS用的端口是53,所以用tcpdump抓包任意网卡(>=2.2内核)并过滤53端口,结果显示DNS查询发往了127.0...

Linux routing

多网卡配置路由

Linux route 选择 给主机绑定多个物理网卡之后,需要正确配置路由表和RPDB才能让主机通过多网卡发包。在配置之前需要了解linux系统在将一个packet发往网卡的时候是如何选择路由的。所谓路由route,就是一条让系统知道应该将packet发到哪个网卡的记录。路由的选择过程涉及三个数据结构: 路由缓存 (route cache); RPDB(routing poli...

RISCV64 Virtual Memory

在RISCV64 RCORE OS 的虚拟内存之前的章节中,rcore存在以下问题: 程序内存大小受限制。程序数量越多,单个程序能使用的内存就越少; 无法保证数据安全。假如一个程序存在BUG或者安全漏洞,可能破坏另一个程序甚至是内核的内存区域。 虚拟内存的意义在于将上述问题“转嫁”到内核:由内核为程序提供一个大小远超物理内存的、不同程序的读写相互隔离的地址空间,同时禁止程序直...

String Encoding

string encoding TL;DR 编码(encoding)是将字符串变成一种用于进程间通信的格式的过程。 所谓的进程间通信包括但不限于文件I/O,网络I/O,共享内存。从这个角度上看有那么一点序列化的意思。字符串类型是编程语言意义上的概念,这些类型的变量需要经过编码才能进行传输。 编码需要解决的一个问题是,如何区分不同的字符。 ...

数论学习笔记 - Group, ring and field

己を信じ、貫け

Group, ring and field 这几个概念的条件是逐渐叠加的: Group 定义: a set with an operation $\cdot:G\times G\to G$ associativity identity $e$: $\exists e\in G\forall a\in G\implies a\cdot e=e\cdot a=a$ inve...

数论学习笔记 - RSA算法的数学原理

誰かを救う光でありたい

RSA算法 RSA是一种非对称的算法,也就是加密所用的私钥和解密的公钥不同。给定明文 $x$,公钥为 $m$ 和 $e$,密文为 $y$,那么加密过程用函数 $\text{encrypt}(x)$表示: \[y=\text{encrypt}(x)=x^{e}\pmod {m}\] 对于公钥 $m$,用于解密的私钥为 $d$,那么解密过程用函数 $\text{decrypt}(x)$表示...