netlink实现分析

合集下载

linux内核通信-netlink使用例子

linux内核通信-netlink使用例子

Netlink 是一种特殊的socket,它是Linux 所特有的,类似于BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的Linux 内核(2.6.14)中使用netlink 进行应用与内核通信的应用很多,包括:路由daemon (NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态socket 协议(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL),socket 监视(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系统(NETLINK_ISCSI),进程审计(NETLINK_AUDIT),转发信息表查询(NETLINK_FIB_LOOKUP),netlinkconnector(NETLINK_CONNECTOR),netfilter 子系统(NETLINK_NETFILTER),IPv6 防火墙(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),内核事件向用户态通知(NETLINK_KOBJECT_UEVENT),通用netlink (NETLINK_GENERIC)。

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API 就可以使用netlink 提供的强大功能,内核态需要使用专门的内核API 来使用netlink。

Netlink 相对于系统调用,ioctl 以及/proc 文件系统而言具有以下优点:1,为了使用netlink,用户仅需要在include/linux/netlink.h 中增加一个新类型的netlink 协议定义即可,如#define NETLINK_MYTEST 17 然后,内核和用户态应用就可以立即通过socket API 使用该netlink 协议类型进行数据交换。

Netlink内核实现分析3

Netlink内核实现分析3

Netlink内核实现分析3Netlink IPC 数据结构#define NETLINK_ROUTE 0 /* Routing/device hook */#define NETLINK_UNUSED 1 /* Unused number */#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */#define NETLINK_SOCK_DIAG 4 /* socket monitoring */#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */#define NETLINK_XFRM 6 /* ipsec */#define NETLINK_SELINUX 7 /* SELinux event notifications */#define NETLINK_ISCSI 8 /* Open-iSCSI */#define NETLINK_AUDIT 9 /* auditing */#define NETLINK_FIB_LOOKUP 10#define NETLINK_CONNECTOR 11#define NETLINK_NETFILTER 12 /* netfilter subsystem */#define NETLINK_IP6_FW 13#define NETLINK_DNRTMSG 14 /* DECnet routing messages */#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */#define NETLINK_GENERIC 16/* leave room for NETLINK_DM (DM Events) */#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */#define NETLINK_ECRYPTFS 19#define NETLINK_RDMA 20#define NETLINK_CRYPTO 21 /* Crypto layer */#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG#define MAX_LINKS 32View Code/*其中(1)nl_family始终为AF_NETLINK;(2)nl_pad始终为0;(3)nl_pid为netlink套接字的单播地址,在发送消息时⽤于表⽰⽬的套接字的地址,在⽤户空间绑定时可以指定为当前进程的PID号(对于内核来说这个值为0)或者⼲脆不设置(在绑定bind时由内核调⽤netlink_autobind()设置为当前进程的PID),但需要注意的是当⽤户同⼀个进程中需要创建多个netlink套接字时则必须保证这个值是唯⼀的(⼀般在多线程中可以使⽤”pthread_self() << 16 | getpid()“这样的⽅法进⾏设置);(4)nl_groups表⽰组播组。

Netlink消息通信机制的IPSec VPN实现研究

Netlink消息通信机制的IPSec VPN实现研究

Netlink消息通信机制的IPSec VPN实现研究作者:黄超赵建平韦勇钢来源:《网络空间安全》2017年第11期摘要:文章分析研究Netlink机制对于Linux内核IPSec服务的支持,提出了一种基于Netlink消息通信机制的IPSec VPN实现方案。

方案由内核空间IPSec服务模块和用户空间IPSEC管理软件组成,两者通过Netlink进行通信,并为IPSec VPN提供了灵活、高效的IKE 协商机制和安全可靠IP数据包传输保障。

关键词:Netlink;IPSec VPN;IKE协商;用户空间;内核空间中图分类号:TP393 文献标识码:A1 引言VPN即虚拟专用网,是利用开放、不安全的公用网络作为基本传输介质,通过采用隧道封装、信息加密、用户认证和访问控制等技术形成专用的虚拟链路实现对信息传输过程的安全保护,从而向用户提供类似专用网络安全性能的网络服务技术。

IPSec是Internet工程任务组IETF定义的一套安全标准,包括一系列安全协议,为IP数据包传输提供安全保障。

Linux 虚拟地址空间为0到4G,划分为内核空间和用户空间两部分。

内核空间包括最高的1G字节,而用户空间包括较低的3G字节。

基于Linux 的IPSec VPN由内核IPSEC服务模块和用户空间IPSec管理软件组成。

内核IPSec模块在内核提供IP数据包的地址验证、数据完整性校验,数据机密性保护等业务,用户空间IPSec管理软件执行IKE密钥协商,密钥配置等业务。

其中IKE密钥协商用于产生通信双方可用于加解密的工作密钥。

Netlink是Linux提供的一种消息通信机制,用于内核空间和用户空间之间的信息传输。

本文提出了一种基于Netlink消息通信机制的IPSec VPN的实现方案。

本方案重点是设计用户空间IPSec管理软件,实现安全策略管理配置等功能,内核模块采用Linux内核原生IPSec服务模块。

2 Netlink机制对IPSEC的支持内核的 IPSEC 处理逻辑中包含SAD 和 SPD 两个策略数据库,其中 SAD 中包含了所有有效的用于保护通信的安全关联(SA),SPD中包含了使用的安全策略(SP)。

用户空间和内核空间通讯之Netlink

用户空间和内核空间通讯之Netlink

用户空间和内核空间通讯之Netlink引言Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接口的方式提供内核与用户空间的双向数据通信;随后,在2.1内核开发过程中,Alexey Kuznetsov将Netlink改写成一个更加灵活、且易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。

自那时起,Netlink就成了Linux内核子系统和用户态的应用程序通信的主要手段之一。

2001年,ForCES IETF委员会正式对Netlink进行了标准化的工作。

Jamal Hadi Salim提议将Netlink定义成一种用于网络设备的路由引擎组件和其控制管理组件之间通信的协议。

不过他的建议最终没有被采纳,取而代之的是我们今天所看到的格局:Netlink被设计成一个新的协议域,domain。

Linux之父托瓦斯曾说过“Linuxis evolution, not intelligent design”。

什么意思?就是说,Netlink也同样遵循了Linux的某些设计理念,即没有完整的规范文档,亦没有设计文档。

只有什么?你懂得---“Read the f**king source code”。

当然,本文不是分析Netlink 在Linux上的实现机制,而是就“什么是Netlink”以及“如何用好Netlink”的话题和大家做个分享,只有在遇到问题时才需要去阅读内核源码弄清个所以然。

<spanstyle="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin ;mso-bidi-font-family:">什么是Netlink关于Netlink的理解,需要把握几个关键点:1、面向数据报的无连接消息子系统2、基于通用的BSD Socket架构而实现关于第一点使我们很容易联想到UDP协议,能想到这一点就非常棒了。

netlink用法

netlink用法

netlink用法1. 什么是netlinknetlink是Linux内核中一个用于内核和用户空间进程通信的机制。

它允许内核向用户空间应用程序发送消息,并提供了一种用于配置,管理和监视内核子系统的接口。

2. netlink的特性netlink的特性使其成为了Linux环境下进行内核和用户空间通信的重要工具,具有以下特点:2.1 强大而灵活netlink提供了一种灵活的通信机制,允许内核和用户空间之间进行双向通信。

应用程序可以通过发送消息给内核来请求信息,而内核也可以通过发送消息给应用程序来通知其发生的事件。

2.2 支持多种消息类型netlink支持多种消息类型,如路由信息、网络配置、接口状态等。

这使得开发者可以利用netlink来实现各种不同的功能。

2.3 可靠和高效netlink使用基于内存的套接字,相比于其他IPC机制(如管道和信号量),netlink是一种更加可靠和高效的通信机制。

它避免了不必要的内核空间与用户空间的拷贝,从而提高了系统的性能。

3. netlink的使用3.1 netlink的工作原理netlink通信的基本单位是消息(message),消息由一个头部(header)和一个有效载荷(payload)组成。

头部包含了消息的类型、源地址、目的地址等信息,有效载荷是实际的数据。

3.2 使用netlink库函数为了方便使用netlink,Linux提供了一组用户空间的库函数。

通过这些库函数,我们可以方便地发送和接收netlink消息。

3.2.1 创建netlink套接字首先,我们需要使用socket系统调用创建一个netlink套接字。

通过指定NETLINK_XXX作为协议参数,可以选择不同的netlink协议。

3.2.2 绑定套接字在创建套接字之后,我们需要使用bind函数将套接字与一个本地地址进行绑定。

这个本地地址可以是任意的netlink协议中定义的地址。

3.2.3 构造消息使用netlink库函数,我们可以方便地构造一个netlink消息。

netlink socket通信框架原理

netlink socket通信框架原理

netlink socket通信框架原理
Netlink socket是一种特殊的socket,用于实现用户空间和内核空间之间的通
信。

其通信原理如下:
1.发送消息时,消息只暂存在socket接收缓存中,不需要等待接收者立即处
理,因此Netlink是一种异步通信机制。

link基于BSD socket和AF_NETLINK地址簇,使用32位的端口号寻址
(PID),每个Netlink协议通常与一个或一组内核服务/组件相关联,如常用的NETLINK_ROUTE用于获取和设置路由与链路信息。

link机制在内核与应用程序之间通信时,无需启动一个内核线程,而是
通过另一个软中断调用用户事先指定的接收函数,因此对中断过程的支持
是其一大特点。

以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询专业技术人员。

linux下netlink的使用简介

linux下netlink的使用简介

linux下netlink的使⽤简介⼀、什么是netlinkNetlink套接字是⽤以实现⽤户进程与内核进程通信的⼀种特殊的进程间通信(IPC) ,也是⽹络应⽤程序与内核通信的最常⽤的接⼝。

在Linux 内核中,使⽤netlink 进⾏应⽤与内核通信的应⽤有很多,如路由 daemon(NETLINK_ROUTE)⽤户态 socket 协议(NETLINK_USERSOCK)防⽕墙(NETLINK_FIREWALL)netfilter ⼦系统(NETLINK_NETFILTER)内核事件向⽤户态通知(NETLINK_KOBJECT_UEVENT)通⽤netlink(NETLINK_GENERIC)Netlink 是⼀种在内核与⽤户应⽤间进⾏双向数据传输的⾮常好的⽅式,⽤户态应⽤使⽤标准的 socket API 就可以使⽤ netlink 提供的强⼤功能,内核态需要使⽤专门的内核 API 来使⽤ netlink。

⼀般来说⽤户空间和内核空间的通信⽅式有三种:/proc、ioctl、Netlink。

⽽前两种都是单向的,⽽Netlink可以实现双⼯通信。

Netlink 相对于系统调⽤,ioctl 以及 /proc⽂件系统⽽⾔,具有以下优点:netlink使⽤简单,只需要在include/linux/netlink.h中增加⼀个新类型的 netlink 协议定义即可,(如 #define NETLINK_TEST 20然后,内核和⽤户态应⽤就可以⽴即通过socket API 使⽤该 netlink 协议类型进⾏数据交换)netlink是⼀种异步通信机制,在内核与⽤户态应⽤之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接收队列,⽽不需要等待接收者收到消息使⽤ netlink 的内核部分可以采⽤模块的⽅式实现,使⽤ netlink 的应⽤部分和内核部分没有编译时依赖netlink ⽀持多播,内核模块或应⽤可以把消息多播给⼀个netlink组,属于该neilink 组的任何内核模块或应⽤都能接收到该消息,内核事件向⽤户态的通知机制就使⽤了这⼀特性内核可以使⽤ netlink ⾸先发起会话Netlink协议基于BSD socket和AF_NETLINK地址簇,使⽤32位的端⼝号寻址,每个Netlink协议通常与⼀个或⼀组内核服务/组件相关联,如NETLINK_ROUTE⽤于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT⽤于内核向⽤户空间的udev进程发送通知等。

Linux Netlink 基本使用方法

Linux Netlink 基本使用方法

Linux Netlink 基本使用方法1.什么是Netlink什么是Netlink?Netlink是linux提供的用于内核和用户态进程之间的通信方式。

但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。

只是进程间通信有其他很多方式,一般不用Netlink。

除非需要用到Netlink的广播特性时。

那么Netlink有什么优势呢?一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。

而前两种都是单向的,但是Netlink可以实现双工通信。

Netlink协议基于BSDsocket和AF_NETLINK地址簇(addressfamily),使用32位的端口号寻址(以前称作PID),每个Netlink协议(或称作总线,man手册中则称之为netlinkfamily),通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

netlink具有以下特点:①支持全双工、异步通信(当然同步也支持)②用户空间可使用标准的BSDsocket接口(但netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库)③在内核空间使用专用的内核API接口④支持多播(因此支持“总线”式通信,可实现消息订阅)⑤在内核端可用于进程上下文与中断上下文如何学习Netlink?我觉得最好的方式就是将Netlink和UDPsocket对比学习。

因为他们真的很对地方相似。

AF_NETLINK和AF_INET对应,是一个协议族,而NETLINK_ROUTE、NETLINK_GENERIC这些是协议,对应于UDP。

那么我们主要关注Netlink和UDPsocket之间的不同点,其中最重要的一点就是:使用UDPsocket发送数据包时,用户无需构造UDP数据包的包头,内核协议栈会根据原、目的地址(sockaddr_in)填充头部信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。

E-mail: wwwlkk@来源: /?business&aid=6&un=wwwlkk#7netlink实现分析(1)网络file对象。

1(2)netlink网络file对象。

3(3)netlink消息接收端。

5(3.1)内核路径注册netlink接收端。

6(3.2)用户进程注册netlink接收端。

6(3.3)内核netlink接收端接收消息。

6(3.4)用户进程netlink接收端接收消息。

6(4)通信效率分析。

7(5)实现零拷贝的两个理论方案。

7(1)网络file对象当网络双方的通信线路建立好之后,双发就可以开始互相传递数据,可以使用write()和read()传递数据。

可见网络通信也同样使用了文件系统的架构,这里的file对象是比较特殊的,结构如图1所示:图1 网络file对象结构其中static const struct file_operations socket_file_ops = {.owner = THIS_MODULE,.llseek = no_llseek,.aio_read = sock_aio_read,对应read().aio_write = sock_aio_write,对应write().poll = sock_poll,.unlocked_ioctl = sock_ioctl,.mmap = sock_mmap,.open = sock_no_open, /* special open code to disallow open via /proc */.release = sock_close,.fasync = sock_fasync,.sendpage = sock_sendpage,.splice_write = generic_splice_sendpage,.splice_read = sock_splice_read,};说明:如果file->f_op->write为空,则会调用file->f_op-> aio_write;file->f_op->read为空,则会调用file->f_op-> aio_read从sock_aio_write()开始的函数调用流程如下:sock_aio_write()→do_sock_write()→__sock_sendmsg()→sock->ops->sendmsg(iocb, sock, msg, size);从sock_aio_read()开始的函数调用流程如下:sock_aio_read()→do_sock_read()→__sock_recvmsg()→__sock_recvmsg_nosec()→sock->ops->recvmsg(iocb, sock, msg, size, flags);可见发送和接受过程最终都是调用操作函数集sock->ops,其结构如下:struct proto_ops {int family;struct module *owner;int (*release) (struct socket *sock);int (*bind) (struct socket *sock, struct sockaddr *myaddr, int sockaddr_len);int (*connect)(struct socket *sock, struct sockaddr *vaddr,int sockaddr_len, int flags);int (*socketpair)(struct socket *sock1,struct socket *sock2);int (*accept) (struct socket *sock,struct socket *newsock, int flags);int (*getname) (struct socket *sock, struct sockaddr *addr, int *sockaddr_len, int peer);unsigned int (*poll) (struct file *file, struct socket *sock, struct poll_table_struct *wait);int (*ioctl) (struct socket *sock, unsigned int cmd, unsigned long arg);int (*compat_ioctl) (struct socket *sock, unsigned int cmd, unsigned long arg);int (*listen) (struct socket *sock, int len);int (*shutdown) (struct socket *sock, int flags);int(*setsockopt)(struct socket *sock, int level,int optname, char __user *optval, unsigned int optlen);int(*getsockopt)(struct socket *sock, int level,int optname, char __user *optval, int __user *optlen); int(*compat_setsockopt)(struct socket *sock, int level,int optname, char *optval, unsigned int optlen);int(*compat_getsockopt)(struct socket *sock, int level,int optname, char *optval, int *optlen);int (*sendmsg)(struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t total_len);int(*recvmsg)(struct kiocb *iocb, struct socket *sock,struct msghdr *m, size_t total_len, int flags);int (*mmap)(struct file *file, struct socket *sock, struct vm_area_struct * vma);ssize_t (*sendpage) (struct socket *sock, struct page *page, int offset, size_t size, int flags);ssize_t(*splice_read)(struct socket *sock,loff_t *ppos,struct pipe_inode_info*pipe,size_t len, unsigned int flags);};应用程序的bind(),listen(),accept(),connect(),read(),write(),close()都最终调用struct proto_ops 内的函数。

(2)netlink网络file对象当网络应用程序调用socket()时,将会建立如图1所示的file结构。

例如:socket(AF_NETLINK, SOCK_RAW,NETLINK_GENERIC);函数调用流程如下:SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)→sys_socket() [SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)] →sock_create()→__sock_create()→pf = rcu_dereference(net_families[family])→err = pf->create(net, sock, protocol, kern);→sock_map_fd()在static int __init netlink_proto_init(void)中可以看到netlink协议的注册函数:sock_register(&netlink_family_ops);其中static const struct net_proto_family netlink_family_ops = {.family = PF_NETLINK,.create = netlink_create,.owner = THIS_MODULE, /* for consistency 8) */};现在可以知道上边的pf->create(net, sock, protocol, kern);是调用netlink_create()生成的file对象结构如图2所示:图2 netlink的file对象结构其中static const struct proto_ops netlink_ops = {.family = PF_NETLINK,.owner = THIS_MODULE,.release = netlink_release,.bind = netlink_bind,.connect = netlink_connect,.socketpair = s ock_no_socketpair,.accept = sock_no_accept,.getname = netlink_getname,.poll = datagram_poll,.ioctl = sock_no_ioctl,.listen = sock_no_listen,.shutdown = sock_no_shutdown,.setsockopt = netlink_setsockopt,.getsockopt = netlink_getsockopt,.sendmsg = netlink_sendmsg,.recvmsg = netlink_recvmsg,.mmap = sock_no_mmap,.sendpage = sock_no_sendpage,};struct sock对象是包含在netlink_sock中。

相关文档
最新文档