自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Netfilter,iptables/OpenVPN/TCP guard:-(

我不会编程,但也不是一点都不会,我稍微会一些 :-)

原创 systemtap迷惑别人抓包,修改或者损坏数据包

一般遇到莫名其妙的网络问题时,第一反应就是抓包分析,然而抓取的数据包真的可信吗?抓包会不会帮倒忙,让事情更加微妙从而火上浇油呢?我让你抓,抓个毛线啊!完全正确,只要做一点手脚即可,这次我用systemtap。我希望的效果是,只要你抓包,显示的都是127.0.0.1到本机的包,哈哈,无论怎样都是这种数据包,从而迷惑程序员的判断。stap的脚本代码如下:#! /usr/bin/stap -g%{#include <linux/if_ether.h>#include <linu

2020-07-30 23:47:18 462

原创 ncurses实现一个会滚动的圆圈

我一直想知道sl蒸汽机小火车是怎么做的,我惊奇于它那烟囱里冒出的炫酷的烟,以及车轮的滚动:于是我想自己试一试,我就做一个滚动的圆就不错了,也不奢望能有什么好看的效果,就类似下面的样子(我故意usleep(500000);调了慢速):12个字母在一个圆上轮转,以展示滚动的效果,我这些是完全算出来的:一个list_head双链表模拟圆周的点。二维平面逐行扫描顺序转换为圆周顺序。每次删除表头插入表尾以模拟转动。遍历链表展示效果。我的代码非常简单,如下所示:#include <ncur

2020-07-28 23:11:03 441 1

原创 用netcat,SSH构建IP层Tunnel

【关于题外话在最后】写作本文主要基于两点,首先是因为我前段时间写了几篇关于XXN的新解,收到了很多的邮件反馈,我也思考了很多,另一个方面是因为很多人问我怎么用QQ,P2P搭建一个IP层的Tunnel,我的回答是“我也不知道”。我确实不知道,根本就没有试过,只是有个这样那样的想法…我主要是没有动力和能力去Hack这些非Linux上的东西…所以说,我写这篇文章,用UNIX的方法 “将多个小工具结合起来” 实现我的那些没有实现的想法,抛砖引玉一下。声明:本文没有技术含量,甚至不会有什么代码,本文只是一些Li

2020-07-28 18:04:21 452

原创 合并N个有序链表与FQ公平调度

下大雨了,于是就想表达一些只有下雨才能表达的东西。夜半酒酣惊觉起,使我流泪忆江南…前天晚上下班带着小小在暴雨中狂奔,非常舒服,其实也算是流言终结者吧。反驳一下几千年来在我国北方通过长辈代代相传的淋雨和感冒之间的因果关系。  昨天早上很早起来,听雨作文,今天早上继续,文章不算太长。合并两个有序链表这是一道超级常见的课后作业题或者面试题,网上答案一搜一箩筐,我自己也写了一个不会编程版: ...

2020-07-28 17:35:54 11691 3

原创 Linux FQ 队列实现原理浅析

又到了周六早上,依然是后半夜属于自己的时间。起床,读了几篇古文,准备梳理一下Linux FQ和RPS方面的原理,正好昨天也有人问到我。本文先从FQ开始。enqueue入队过程上一张图: 详细描述了fq队列的入队过程,其中着重理解几个数据结构:sock作为键的红黑树:用于关联skb和flownext_time作为键的红黑树:用于保存未来被调度的flow,并决定timer唤醒时间...

2020-07-28 17:29:33 11420 4

原创 80行C代码实现ncurses版贪吃蛇!

事情是这样的,周末我在家打开电脑排查现网问题,安德森先生对这个电脑非常感兴趣,凑过来非要看看,我给他演示了sl小火车。小小和疯子也都在旁边看着。我说这个sl小火车是一个现成的程序,然后就被小小和疯子鄙视了,她们以为这个小火车是我自己做的…搞了半天是下载的现成的东西…我觉得我得自己做点可以玩的小东西,哪怕再简单的,只要看起来像回事就行,以挽回面子。还是贪吃蛇最简单,这个东西以前我写过不止一版了:https://blog.csdn.net/dog250/article/details/5303351h

2020-07-27 22:22:12 2102 4

原创 实例演示如何在公共互联网构建overlay实现SDWAN

overlay网络并不是什么高端的技术,我们使用了几十年的互联网本身就是一张层叠的overlay网络,列举下面的点对点聊天网络:4个用户点对点聊天,它们并未意识到底层IP传输网络的存在,在它们看来,彼此之间是直连的,如蓝色虚线所示,4个用户连接成了一张full mesh网络。如果能构建上述结构的实例,那么实现SDWAN就是一件很简单的事了,而实现一个点对点聊天程序程序早在2006年就是一个大专(注意,是大专)毕业设计被选烂了的课题,这意味着它并不困难。我简单写了一个聊天程序代码:https://g

2020-07-24 17:20:54 597 1

原创 假期跟我一起写一个点对点overlay-SimpleUOM详解

自从上周写了几篇关于BadVPN的文章后,收到很多的邮件前来询问细节。其中最多的不外乎两类,一类是询问怎么使用的,另一类则是要求我写几篇源码分析。先来一个一个说。1.关于BadVPN的使用问题和OpenVPN相反,BadVPN几乎没有除了配置隧道之外的任何东西,这些被排除了内容中最重要的应该就是路由了。OpenVPN中就有关于路由的很多配置,还可以从服务端往客户端推送路由,这简直太方便了,但同时也

2020-07-22 17:12:47 16692 5

原创 真实网络中间链路对端到端的影响

分层的网络模型是一个理想的模型,但现实从来就没有理想过。在理想模型中,IP地址和传输层TCP/UDP都是端到端的,中间路由器根据目标IP地址逐跳将数据包送达目的地。但在现实中,我们会面临:出口NAT。状态防火墙。Anycast/ECMP。设备GRO/LRO。IPv4在面临处理上述问题时会遭遇很多疑难杂症,比方说,NAT机制会关联应用层协议,比如FTP,这意味着NAT需要修改协议载荷,这需要IP分片在NAT设备完成重组而不是目的地。状态防火墙需要保存流Session,流Session往

2020-07-19 10:45:34 694

原创 C语言未初始化的局部变量是多少?

C语言中,未初始化的局部变量到底是多少?答案往往是:与编译器有关。可能但不保证初始化为0。未确定。总之,全部都是些一本正经的形而上答案,这很令人讨厌。但凡一些人给你滔滔不绝地扯编译器,C库,处理器体系结构却给不出一个实际场景复现问题的时候,这人大概率在扯淡。又是周五回家时,大巴车上作短文一篇。其实,这个问题本身就是错误的问法,说全了能讲10万字,我们只要能在特定场景下确定其特定行为就OK了,当然,这就需要设计一个比较OK的实验。在演示一个实际代码行为之前,先给出一个知识, CPU不

2020-07-17 17:41:15 894 6

原创 如何用二叉树改造cBPF程序提高BPF执行效率

在前一篇文章里,我描述了tcpdump的内置BPF程序处理非常多的匹配项时是何等的不堪:https://blog.csdn.net/dog250/article/details/107367725文中我列举了实验的过程和结果,最后我给出了建议, 预处理BPF程序,采用相对高效的匹配方式替换遍历式匹配。 然后写了些形而上的吐槽,文章就结束了。记得在很早以前我在优化iptables规则以及路由查找的时候,就提出过类似的思路,即 预处理规则集 。但从始至终都没能看到一行代码,看起来相当得有破无立。但这是一个

2020-07-16 23:03:56 570

原创 从tcpdump看cBPF/eBPF程序设计

It’s a pleasure to pour cold water on the revellers, and you’ll thank me.我在2016年写过一篇关于tcpdump对Linux网络协议栈性能影响的文章:https://blog.csdn.net/dog250/article/details/52502623大概的结论是 当skb的字段匹配项的filter数量非常大的时候,BPF过滤程序将严重影响收包性能。当时我并没有展开说,部分原因是当时BPF尚未得到普遍关注,所以在就事论事之

2020-07-15 22:47:59 718 2

原创 Linux网络数据转发平面的变迁-从内核协议栈到DPDK/XDP

昨晚读了一篇Paper:https://penberg.org/parakernel-hotos19.pdf大意是说,随着IO设备的进化,它们的存取/传输速率已经超过了CPU到内存的存储/传输速率,再也不再是慢速 外设 了,所以,对这些快速设备的管理和操作要发生改变才能适应,从这个意义上讲,几乎一成不变的Linux kernel在很多方面确实阻滞了性能的优化。这可能是现如今人们纷纷转向DPDK/netmap或者XDP的本质原因了。怎么说呢?周末回上海前,发一篇感想。在人们的印象中,一台标准的计算机包

2020-07-10 17:06:53 14391 16

原创 从SO_REUSEPORT服务器的一个弊端看多队列服务模型

在进入关于REUSEPORT的讨论之前,先看一张图,下图描述了单队列服务和多队列服务的区别:单队列典型实例:银行业务叫号,机场火车站出排队坐租车等。多队列典型实例:超市排队结账,医院挂号收费等。到底哪一种好呢?很多人估计会想当然选择多队列,但我个人更倾向于单队列。在计算机领域,人们似乎总是倾向于并行化,这背后似乎有着对同步锁的笃恨,比方说,只要你把一个数据结构设计成单链表,那么肯定会有一大堆人跳出来说你这个在多线程环境会很大的锁开销。当多线程操作同一数据结构时,饱受诟病的就是它的同步开销。

2020-07-09 22:00:24 851

原创 cBPF/eBPF如何处理reuseport的吐槽和示例
原力计划

我想用eBPF或者至少cBPF实现一个功能:根据来源和目标IP地址来选择同一个reuseport组的socket。比方说,我的服务器上有4个IP地址分别是10.0.0.1,10.0.0.2,10.0.0.3,10.0.0.4,我的服务侦听0.0.0.0:1234,分别有4个reuseport socket提供,我希望的select算法是:访问10.0.0.1的分派给sk1。访问10.0.0.2的分派给sk2。访问10.0.0.3的分派给sk3。访问10.0.0.4的分派给sk4。不要

2020-07-08 23:23:24 890

原创 UDP的epoll并发框架-UDP Listener解决OpenUOM的并发问题

UDP具有是一种很好的封装协议,比如OpenVPN使用UDP封装会比TCP好很多,现在越来越多的业务采用UDP传输,然后自己定义按序到达以及流控逻辑,然而就我个人的使用经验来看,UDP太难做并发,大多数情况下,使用UDP会让epoll等高性能event机制优势全无。本文以OpenVPN为例,说明一下我是怎么解决UDP并发问题的。异步并发模型与epoll和apache相比,nginx采用异步的处理方

2020-07-05 11:42:29 9132 4

原创 SR(Segment Routing)不是MPLS的优化和升级

From the engineer’s point of view, technology itself is not suitable to be discussed at a metaphysical level, but it is only at a metaphysical level that a thorough understanding of technology can be achieved without becoming its slave.看到SR(Segment Routi

2020-07-05 11:18:26 829

原创 理解Segment Routing和SDWAN
原力计划

作为一项新技术,Segment Routing(SR)最近几年非常火爆,它和另一个概念SDN有效结合,成就了一些非常有意思的东西,比如说SR-TE。但其实,SR理解起来其实是SDN/SDWAN发展到一定阶段自然而然的思路。SDWAN中非常重要的一啪就是 “如何自定义一条任意节点到任意节点的路径。”自定义路径可以在传统的基于链路度量值的IGP选路之外更加灵活地进行最短路径度量和选择,为繁复业务提供体验更好的传输服务。实现自定义路径不外乎下面的方式:隧道方式。松散源路由方式(loose sourc

2020-07-03 17:07:35 1072 3

原创 如何检测猥琐的私有SDWAN隧道协议

在前面的一篇文章中,我给出了一种创建相对猥琐的假TCP隧道的POC:https://blog.csdn.net/dog250/article/details/107025091在运营商网络上玩overlay,有多种玩法。在私有协议之外,当然首选TCP,毕竟运营商待见啊!私有协议搞不好会被限制的。所以TCP协议大有文章可做,传统的观点是对TCP做加法,比如优化其CC算法,增加其丢包探测等,但是这玩意儿有技术门槛啊,不如做减法!把TCP掏空到只剩下运营商设备能认出来的一个空壳子…这种隧道可以欺骗中

2020-07-01 23:48:10 1084 4

原创 彻底征服Windows上OpenUOM客户端的源地址选择问题

一个问题困扰了我多年,相信也困扰了很多人多年!那就是Windows上使用OpenVPN时,通过隧道的包的源IP地址总是OpenVPN虚拟网卡网段的IP地址,由于Windows的路由选择是自动进行的,除非你在应用程序中bind一个地址,否则它选什么你用什么,配置路由时,你无法指定Linux的iproute2的src参数。因此只要是要通过TAP-Win32网卡走的包,其源地址均是TAP-Win32网卡

2020-07-01 17:35:15 14327 17

原创 OpenUOM的按需连接实现

万恶的心跳!只是证明自己还活着...为何不能到有事情来的时候再做,没事情时就休息呢?何必一直保持心跳呢?上帝按照自己的形象,造出了人,人按照自己的喜好,造出了计算机,计算机也都有心跳。操作系统靠时钟中断这种心跳来推进机器的时间,然而后来Linux实现了NOHZ,即没有事情的时候,不再无谓地触发时钟中断,而是彻底halt,有事请来的时候,其它的中断会将机器唤醒,继续心跳。这种nohz机制节省了资源,

2020-07-01 17:28:41 7607 2

原创 OpenUOM移动性改造-靠新的session iD而不是IP/Port识别客户端

设备移动性的挑战1.设备会经常由于小区或模式切换而更改IP地址。这种地址更新是移动网络的正常行为,不应作为故障或事故看待,因此理应对应用程序透明,应用不应被此类事件打扰,更无责做善后处理。2.移动设备存在多张3G/4G/2.75G网卡时,希望这些网卡同时收发数据。由于这些网卡一般属于不同运营商网络,其网络架构又不同,一般要求数据包携带本运营商网卡的IP地址作为源(这一般是为了在该运营商核心网终点处

2020-07-01 17:24:47 4133

提示
确定要删除当前文章?
取消 删除