Recent Posts
-
May 11, 2024
Linux连接跟踪表的实现conntrack
我一直以为linux内核的conntrack是默认启动的,昨天才发现不是的。经过反复测试阅读源码才知道是“按需”启动的。通过反复测试和核对系统的 连接跟踪表,发现只有“ iptables -t nat -A POSTROUTING ” 创建了snat规则,这个ct才开始运行的。cat /proc/sys/net/netfilter/nf_conntrack_countconntrack -L -f ipv6conntrack -Lkprobe 给ipv4_conntrack_in 函数设...
-
May 04, 2024
Intel的cpu汇编bmi2指令集的pext指令和完美哈希函数
参考:https://www.chessprogramming.org/BMI2 https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=pext&ig_expand=5088 https://gcc.gnu.org/onlinedocs/gcc/x86-Built-in-Functions.htmlpext 指令是 “Parallel Bits Extract” 的意思, 作用就...
-
April 30, 2024
Gcc的128位整数__int128
根据gcc的文档 https://gcc.gnu.org/onlinedocs/gcc/extensions-to-the-c-language-family/128-bit-integers.html是有扩展支持__int128类型的,但默认会用 64位的整数了模拟出来。参考下面这两篇文章:“GCC扩展中的int128相关运算在底层是如何实现的?”https://www.zhihu.com/question/311373755“__int128 的安全使用”https://zhuanla...
-
December 11, 2023
Linux发送网络包前的网卡特性检查
发现tcpdump的 ‘host ' 这样表达式有时不支持vlan 802.1q的包,如果网卡支持vlan硬件加速,那ip过滤的还能抓到吧。如果网卡不支持vlan硬件加速,__vlan_hwaccel_push_inside 处理过后改了包头的话, dev_queue_xmit_nit -> deliver_skb PACKET_OUTGOING ->packet_rcv 就处理不了这种带了vlan头的解析了。bpf那里不支持vlan 协议解析。__dev_queue_...
-
September 14, 2023
Linux内核conntrack的helper和expect
helper是一些连接跟踪的辅助,可以认为是dpi的功能,会深入解析协议细节比如 nf_conntrack_pptp.c 就是PPTP协议的dpi解析,解析PPTP里面的call_id 和 其他会话建立过程等等,然后nf_nat_pptp可以替换pptp包里面call id,避免内网多个用户使用同一个call-id冲突,这样NAT内网的用户也正常PPTP拨号。这些辅助模块,主要通过 nf_conntrack_helper_register 注册内核helper模块, conntrack在合...
-
July 27, 2023
Linux内核网络包结构sk_buff的rxhash
sk_buff 有几个字段是标识了这条网络连接(流)的hash。 * @hash: the packet hash * @l4_hash: indicate hash is a canonical 4-tuple hash over transport * ports. * @sw_hash: indicates hash was computed in software stack这里通常是网卡硬件在硬件里面计算出来的了。使用ethtool命令可以查看和设置 网卡用哪些字段来计算哈希。...
-
July 26, 2023
调试linux协议栈丢包等问题的利器pwru和perf Probe
https://github.com/cilium/pwru可以把满足“ tcpdump 抓包语法的” 网络包经过的 内核函数都打印出来,很直观的看到内核里面处理这个网络包的流程。perf probe 利用kprobe可以 在任意函数的含行号上打印变量,可以定位到某个函数的执行流程吧。Usage: ./pwru [options] [pcap-filter] Availble pcap-filter: see "man 7 pcap-filter" Availble opt...
-
July 21, 2023
Linux的组播路由实现pim Sm
由pimd这样的后台应用程序和内核交互,控制内核里面的组播路由转发表吧。https://flylib.com/books/en/3.475.1.88/1/https://www.man7.org/linux/man-pages/man8/ip-mroute.8.htmlhttps://github.com/troglobit/pimd/tree/masterhttps://elixir.bootlin.com/linux/latest/source/include/uapi/linux/m...
-
July 21, 2023
Btf版本不匹配导致内核模块加载失败的问题
rocky linux 9上面,内核编译设置默认打开了DEBUG_INFO_BTF_MODULES,这样所有模块里面都带有BTF信息。运行时内核的BTF这个机制,如果模块缺少BTF信息(ELF的BTF段)那可以加载成功,但如果BTF的版本不匹配就拒绝加载。使用源码自己编译内核时,虽然内核源码是一样的但生成的BTF还是不匹配的。 这样自己使用内核源码目录( 不是系统的/lib/modules/uname -r/build )编译一个模块出来, 在rocky linux的官方内核系统里面就没法...
-
May 09, 2023
Linux的蓝牙socket编程
关键字bluez libbluetooth AF_BLUETOOTH RFCOMM SDP参考资料 “An Introduction to Bluetooth Programming” Albert Huang https://people.csail.mit.edu/albert/bluez-intro/ 讲了基本概念和c语言例子代码都有 Bluez的文档 https://git.kernel.org/pub/scm/bluetooth/bluez.git...