自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

redwingz的博客

Linux内核网络、虚拟化

  • 博客(557)
  • 资源 (5)
  • 论坛 (1)
  • 收藏
  • 关注

原创 IPv6地址有效性检测

IPv6地址检测和DAD冲突检测使用的都是addrconf_wq队列,其在addrconf_init函数中创建。int __init addrconf_init(void){ struct inet6_dev *idev; ... addrconf_wq = create_workqueue("ipv6_addrconf"); if (!addrconf_wq) { err = -ENOMEM; goto out_nowq; }

2021-02-26 23:23:19 20

原创 IPv6地址自动配置

默认情况下,配置项autoconf都是1,即开启地址自动配置。$ cat /proc/sys/net/ipv6/conf/all/autoconf 1$ cat /proc/sys/net/ipv6/conf/default/autoconf 1$ cat /proc/sys/net/ipv6/conf/ens33/autoconf 1$ cat /proc/sys/net/ipv6/conf/all/accept_ra_pinfo1$ cat /proc/s

2021-02-24 23:41:48 16

原创 IPv6使能开关

默认情况下,IPv6是开启状态,即PROC文件disable_ipv6的值为零。$ cat /proc/sys/net/ipv6/conf/all/disable_ipv60$ cat /proc/sys/net/ipv6/conf/default/disable_ipv60$ cat /proc/sys/net/ipv6/conf/ens33/disable_ipv60如下代码所示,默认情况下all和default中的disable_ipv6配置值都为0。static struct ip

2021-02-23 22:05:01 22

原创 IPv6地址stable private

对于链路本地地址和自动配置地址,内核支持4种生成方式,默认情况下使用EUI64方式,可通过PROC文件:/proc/sys/net/ipv6/conf/ens33/addr_gen_mode进行修改。enum in6_addr_gen_mode { IN6_ADDR_GEN_MODE_EUI64, IN6_ADDR_GEN_MODE_NONE, IN6_ADDR_GEN_MODE_STABLE_PRIVACY, IN6_ADDR_GEN_MODE_RANDOM,}

2021-02-19 22:07:09 32

原创 clamav安装使用

clamav-0.103.1安装环境:$ cat /etc/issueUbuntu 20.04 LTS \n \l安装依赖库$ sudo apt-get install libssl-dev$ sudo apt-get install zlib1g zlib1g-dev$ sudo apt-get install libcurl4-openssl-dev$ sudo apt-get install libpcre3 libpcre3-dev下载clamav,配置选项–disable-cl

2021-02-18 21:33:33 352

原创 DAD报文控制

PROC文件accept_dad控制DAD(Duplicate Address Detection)报文的接收,内核中根据目录all和接口(ens33)名称目录下的accept_dad的两个值中的最大值来决定最终的值。accept_dad的取值有以下三个:0 - 关闭DAD1 - 开启DAD2 - 开启DAD,并且,在基于MAC地址的本地链路地址检测到冲突时,关闭IPv6功能。$ cat /proc/sys/net/ipv6/conf/all/accept_dad0$ cat /proc/sys

2021-02-09 22:18:24 67

原创 IPv6接口自动配置的地址数量

默认情况下,每个接口最大可自动配置16个地址。如下PROC文件max_addresses中的值,如果设置为0,将不限制地址数量。$ cat /proc/sys/net/ipv6/conf/all/max_addresses 16$ cat /proc/sys/net/ipv6/conf/default/max_addresses16$ cat /proc/sys/net/ipv6/conf/ens33/max_addresses 16ipv6_devconf和ipv6_devconf

2021-02-07 22:58:47 24

原创 IPv6设备配置选项

IPv6子系统中的三个全局配置:ipv6_devconf、ipv6_devconf_dflt和ipv6_defaults:static struct ipv6_devconf ipv6_devconf __read_mostly = { .forwarding = 0, .hop_limit = IPV6_DEFAULT_HOPLIMIT, ...}static struct ipv6_devconf ipv6_devconf_dflt __read_mostly

2021-02-06 21:49:52 35

原创 网桥本地链路组播控制group_fwd_mask

在创建网桥时,可指定组播转发掩码值group_fwd_mask,如下0xff00。掩码中的位表示的为链路本地地址(01:80:C2:00:00:0X)的最后一个4位的值,即X的值,其范围为0到15,所以,group_fwd_mask的值为16比特。网桥下的子接口可以设置自身的group_fwd_mask掩码值。$ sudo ip link add name br1 type bridge group_fwd_mask 0xff00$ $ cat /sys/devices/virtual/net/br

2021-02-04 23:02:27 31

原创 路由FIB通知链

在网络命名空间初始化时,初始化fib通知链操作链表。static int __net_init fib_notifier_net_init(struct net *net){ struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id); INIT_LIST_HEAD(&fn_net->fib_notifier_ops); ATOMIC_INIT_NOTIFIER_HEAD(&amp

2021-01-31 22:27:22 44

原创 命名空间设备地址标识dev_addr_genid

对于IPv4,在初始化时,为命名空间的设备地址标识赋于一个随机值。static __net_init int rt_genid_init(struct net *net){ atomic_set(&net->ipv4.rt_genid, 0); atomic_set(&net->fnhe_genid, 0); atomic_set(&net->ipv4.dev_addr_genid, get_random_int()); retu

2021-01-28 22:07:03 31

原创 命名空间接口序号dev_base_seq

网络命名空间初始化时,将序号dev_base_seq赋值为1。static __net_init int setup_net(struct net *net, struct user_namespace *user_ns){ /* Must be called with pernet_ops_rwsem held */ const struct pernet_operations *ops, *saved_ops; int error = 0; LIST_HEAD(net

2021-01-25 21:30:50 32

原创 多径路由选择

以函数ip_route_input_slow为例,在fib查询之后,由函数ip_mkroute_input创建路由缓存项。static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev, struct fib_result *res){ err = fib_lookup(net, &fl4,

2021-01-05 22:05:24 63

原创 内核earlyprintk选项

通过设置early_printk选项,可以在内核串口设备初始化之前,看到打印输出,对于调试内核早期的启动问题非常有帮助。如下可在grub命令行中,手动加载启动内核,增加内核参数:grub> grub> linux \(hd0,msdos2)/vmlinuz earlyprintk=ttyS0,115200grub> grub> bootgrub> 对于x86平台,内核函数setup_early_printk处理earlyprintk选项,解析earlyprintk

2020-12-28 21:42:59 95

原创 rtnetlink组数量与设置

在文件include/uapi/linux/netlink.h中定义了,目前共有32个组,除去第一个RTNLGRP_NONE,即31个组。/* RTnetlink multicast groups */enum rtnetlink_groups { RTNLGRP_NONE,#define RTNLGRP_NONE RTNLGRP_NONE RTNLGRP_LINK,#define RTNLGRP_LINK RTNLGRP_LINK... RTN

2020-12-24 22:24:00 80

原创 rtnetlink的portid选择

在iproute2-5.9.0的文件lib/libnetlink.c中,创建netlink套接口时,地址结构sockaddr_nl,即rth->local没有对其成员nl_pid赋值,仅赋值了nl_family和nl_groups,由内核完成nl_pid的选取。int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, int protocol){ memset(rth,

2020-12-20 20:40:29 69

原创 TCP合法RST报文

RESET报文的接收和检查处理。客户端握手阶段对于TCP客户端,在发送完SYN报文之后,如果接收到的回复报文同时设置了ACK和RST标志,在检查完ACK的合法性之后,处理RST标志,关闭套接口。对于ACK确认序号,其应当大于第一个未确认序号(snd_una),并且,确认序号不应大于未发送数据的序号(snd_nxt)。通常情况下ACK确认序号应当等于snd_una加一(SYN占用一个序号),但是,如果SYN报文中带有数据(例如:TFO),ACK确认序号会更大。以上情况向对端发送reset报文,但是,如果

2020-12-12 20:33:14 197

原创 TCP复位报文的发送

内核发送reset报文的函数为tcp_v4_send_reset,如下其赋值给了tcp_request_sock_ops结构的成员send_reset。struct request_sock_ops tcp_request_sock_ops __read_mostly = { .family = PF_INET, ... .send_reset = tcp_v4_send_reset,监听套接口不存在如下tcp_v4_rcv函数中,__inet_lookup_

2020-12-10 21:41:10 131

原创 X710网卡链路状态控制

驱动版本i40e-2.10.19.82,在ifconfig将网口down的时候,发现链路并没有断开,网卡的指示灯还是亮的。如下为控制网卡shutdown的函数:/** * i40e_down - Shutdown the connection processing * @vsi: the VSI being stopped **/void i40e_down(struct i40e_vsi *vsi){ int i; /* It is assumed that the call

2020-12-06 19:49:06 158

原创 iptables不能初始化filter表问题

错误如下所示:# iptables -Liptables v1.8.1 (legacy): can't initialize iptables table `filter': No chain/target/match by that namePerhaps iptables or your kernel needs to be upgraded.参考网上的说法,应该是filter表模块iptable_filter没有加载成功,或者内核编译选项根本就没有选上此功能。但是手动加载filter模块,没

2020-12-03 22:36:52 437

原创 邻居表的proxy_qlen长度和proxy_delay延时参数

proxy_qlen控制邻居代理缓存的报文数量,proxy_delay定义处理需要代理的arp报文的时间间隔。对于arp协议,内核默认的proxy_qlen为64,proxy_delay为80。通过PROC文件proxy_qlen可查看和修改其值。$ cat /proc/sys/net/ipv4/neigh/ens33/proxy_qlen 64$ cat /proc/sys/net/ipv4/neigh/ens33/proxy_delay 80在arp邻居表arp_tbl中将NEIGH_VA

2020-11-24 22:52:23 125

原创 邻居表项的unres_qlen_bytes长度

对于每个未解析的邻居地址,变量unres_qlen和unres_qlen_bytes分别控制可换成的报文数量和报文字节数量,其中前者unres_qlen在内核linux-3.3版本已经废弃,应使用后一个变量unres_qlen_bytes,其默认值为SK_WMEM_MAX(即net.core.wmem_default),内核建议此值的设置应能够容纳256个中型长度的报文。通过PROC文件unres_qlen和unres_qlen_bytes可查看和修改其值。$ cat /proc/sys/net/ipv

2020-11-19 20:04:14 242

原创 邻居表项的回收控制

内核中存在3个阈值控制邻居表项的回收:gc_thresh1 表示最小可保留的表项数量,如果表项数量小于此值GC(Garbage collector)不进行回收操作,默认为128;gc_thresh2 当表项数量超过此值时,GC将会清空大于5秒的表项,默认为512;gc_thresh3 最大可允许的非永久表项数量。如果系统拥有庞大的接口数量,或者直连了大量的设备,应增大此值。默认值为1024。另外,gc_interval不太清楚有什么用处,默认值为30秒钟。对于IPv4,可通过以下PROC

2020-11-14 07:08:35 185

原创 邻居表项的retrans_time时长

retrans_time控制在发送过邻居地址探测报文之后,经过多长时间检测邻居表项的变化,如果检测不成功,进行重新探测,对于arp协议,内核默认的retrans_time为1秒钟。通过PROC文件retrans_time可查看和修改其值,单位时USR_HZ(100),PROC文件的内容为毫秒值,这里为默认的1000ms。$ cat /proc/sys/net/ipv4/neigh/ens33/retrans_time100$ cat /proc/sys/net/ipv4/neigh/ens33/re

2020-11-12 20:15:49 164

原创 邻居表项的ucast_solicit数量

ucast_solicit控制使用单播发送邻居地址探测报文的次数,对于arp协议,内核默认的ucast_solicit为3。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/ucast_solicit 3 $ echo 1 > /proc/sys/net/ipv4/neigh/ens33/ucast_resolicit在arp邻居表arp_tbl中将NEIGH_VAR_UCAST_PROBES索

2020-11-10 20:35:31 164

原创 邻居表项的mcast_solicit数量

mcast_solicit和mcast_resolicit控制使用多播发送邻居地址探测报文的次数,对于arp协议,内核默认的mcast_solicit为3。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/mcast_solicit 3 $ cat /proc/sys/net/ipv4/neigh/ens33/mcast_resolicit 0在arp邻居表arp_tbl中将NEIGH_VAR_MC

2020-11-05 22:24:44 157 2

原创 邻居表项的app_solicit数量

app_solicit控制上层应用发送邻居地址探测报文的数量,对于arp协议,内核默认的app_solicit为零,在arp邻居表arp_tbl中没有对NEIGH_VAR_APP_PROBES索引所对应的表项赋值,即将app_solict对于的值设置为了零,如果上层应用可完成地址探测,可将app_solicit修改为非零。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/app_solicit 0 $ e

2020-11-04 23:03:10 116

原创 邻居表项的delay_probe_time时长

delay_probe_time控制首次发送邻居请求报文的等待时长,对于arp协议,内核默认的delay_probe_time时长为5秒钟。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), .hash = arp_hash, .key_eq = arp_key_eq, .co

2020-11-03 22:39:41 239 1

原创 GARP(Gratuitous ARP)

内核函数arp_is_garp判断ARP报文是否为GARP,先决条件是发送者IP和目标IP地址相同,另外,对于ARP回复(REPLAY)报文,要求如果目标硬件地址存在,需要与发送者硬件地址相等。最后,要求ARP报文的发送者IP为单播地址,否则,判定报文不是garp。static bool arp_is_garp(struct net *net, struct net_device *dev, int *addr_type, __be16 ar_op, __b

2020-10-29 20:30:47 191

原创 邻居表项的locktime时长

如果内核在locktime时间内接收到多个ARP报文,仅首个报文生效。对于arp协议,内核默认的locktime时长为1秒钟,可通过PROC文件或者ip命令进行修改。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), .hash = arp_hash, .key_eq = arp_ke

2020-10-28 20:31:30 173

原创 邻居表项的STALE状态超时时间

对于arp协议,内核默认的STALE状态超时时长为60秒钟。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), ... .id = "arp_cache", .parms = { ... .data = { ...

2020-10-21 19:36:45 329

原创 内核的中断分布

对于x86架构,定义位于arch/x86/include/asm/irq_vectors.h文件中,linux每可使用的有256个IDT(Interrupt Descriptor Table)表项,64位架构每个CPU有一个IDT表,32位架构共享一个IDT表,其分布如下: * Vectors 0 ... 31 : system traps and exceptions - hardcoded events 系统陷阱和异常中断向量 * V

2020-10-20 20:06:06 164

原创 FQ队列detached流管理

对于FQ中的流结构,如果其没有任何要发送的报文,即其为空,将其设置为detached状态,这样的流结构即不在new_flow链表,也不在old_flow链表。在detach设置函数中,不仅将其next指向固定的地址(静态变量detached的地址),而且,记录下其进入detached状态的时间戳。/* special value to mark a detached flow (not on old/new list) */static struct fq_flow detached, throttle

2020-10-19 20:23:30 149

原创 FQ队列throttled流管理

FQ队列中对发送时间未到的流结构单独存放在delayed红黑树中,这样的流结构即不在new_flow链表,也不在old_flow链表,其next指针执行一个特定的值:throttled。内核函数通过检查流结构的next指针,来判断流是否处于throttled状态。new_flow链表中的流结构的优先级高于old_flows中的流。/* special value to mark a detached flow (not on old/new list) */static struct fq_flow

2020-10-17 23:06:18 124

原创 X710网卡接收丢包

通过ethtool命令看到是rx_dropped一项有数值。/ # ethtool -S eth0 | moreNIC statistics: rx_packets: 88037562 tx_packets: 66028257 rx_bytes: 7461153935 tx_bytes: 5612351710 rx_errors: 0 tx_errors: 0 rx_dropped: 372 tx_dropped: 0

2020-10-16 21:30:43 297

原创 使用git sendmail发送补丁

这里使用iproute2工程为例,以下命令安装git-email工具。$ sudo apt-get install git-emailiproute2当前版本是5.8.0,其中文件tc/q_fq.c中有一处笔误。修改完成之后,使用如下命令生成patch文件:$ git format-patch HEAD^0001-tc-fq-clarify-the-length-of-orphan_mask.patch$ 接下来设置git-email相关配置,这里以126邮箱为例:$ git config

2020-10-14 21:09:35 142

原创 FQ队列对quantum的处理

quantum 表示每次出队列轮询的信用值(credit),例如,每个流每次可允许出队列的字节数量。此值设置的较大意味值下一个流等待服务的时间更长,默认为2倍的接口MTU值。static int fq_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct fq_sched_data *q = qdisc_priv(sch); int err; sch->lim

2020-10-12 20:09:53 151

原创 内核红黑树-II

还是先列一下红黑树的5个准则。A node is either red or black节点的颜色非红即黑The root is black根节点为黑色All leaves (NULL) are black所有的叶子(NULL)节点都为黑色Both children of every red node are black红色节点的子节点都为黑色Every simple path from root to leaves contains the same number of black n

2020-09-23 20:30:48 122

原创 内核红黑树-I

内核中许多部分使用到红黑树,比如tcp的乱序队列out_of_order_queue,TC中fq公平队列的流表等。以下为红黑树的5个准则:A node is either red or black节点的颜色非红即黑The root is black根节点为黑色All leaves (NULL) are black所有的叶子(NULL)节点都为黑色Both children of every red node are black红色节点的子节点都为黑色Every simple path f

2020-09-19 06:37:35 90

原创 FQ队列流结构回收

在FQ队列中,如果流结构队列为空,并且超过3秒(FQ_GC_AGE)没有接收到相应的报文,系统将其进行回收,如下判断函数fq_gc_candidate。但是在每次fq_gc回收函数执行时,最大释放8个(FQ_GC_MAX)流结构。/* limit number of collected flows per round */#define FQ_GC_MAX 8#define FQ_GC_AGE (3*HZ)static bool fq_gc_candidate(const struct fq_fl

2020-09-17 19:34:32 83

IKEv2-camellia.pcap

IKEv2协议使用camellia加密算法的协商报文,交互流程。

2019-10-28

WEB Portal 认证完整的交互报文

web认证交互报文,包括WLAN controller与portal server的认证与注销,AC与radius 服务器的认证报文。

2018-04-24

IKEv2-rw-cert2.pcap

strongswan使用linux内核的af_alg加密接口配置,IKEv2协议交互报文。

2019-10-28

libssh2-1.8.0 and ssh2_batch example

ssh2_batch可执行程序,用于非交互式的ssh命令执行。源代码和libssh2

2018-06-13

botan-ed25519.pcap

IKEv2协议交互报文,认证方式选用Ed25519算法的证书方式。

2019-10-28

redwingz的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

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