linux网络通信
Ⅰ linux网络协议栈7--ipsec收发包流程
流程路径:ip_rcv() --> ip_rcv_finish() --> ip_local_deliver() --> ip_local_deliver_finish()
解封侧一定是ip报文的目的端,ip_rcv_finish中查到的路由肯定是本机路由(RTCF_LOCAL),调用 ip_local_deliver 处理。
下面是贴的网上的一张图片。
ip_local_deliver_finish中 根据上次协议类型,调用对应的处理函数。inet_protos 中挂载了各类协议的操作集,对于AH或者ESP来说,是xfrm4_rcv,对于ipsec nat-t情况下,是udp协议的处理函数udp_rcv,内部才是封装的ipsec报文(AH或者ESP)。
xfrm4_rcv --> xfrm4_rcv_spi --> xfrm4_rcv_encap --> xfrm_input
最终调用 xfrm_input 做收包解封装流程。
1、创建SKB的安全路径;
2、解析报文,获取daddr、spi,加上协议类型(esp、ah等),就可以查询到SA了,这些是SA的key,下面列出了一组linux ipsec的state(sa)和policy,方便一眼就能看到关键信息;
3、调用SA对应协议类型的input函数,解包,并返回更上层的协议类型,type可为esp,ah,ipcomp等。对应的处理函数esp_input、ah_input等;
4、解码完成后,再根据ipsec的模式做解封处理,常用的有隧道模式和传输模式。对应xfrm4_mode_tunnel_input 和 xfrm4_transport_inout,处理都比较简单,隧道模式去掉外层头,传输模式只是设置一些skb的数据。
5、协议类型可以多层封装,如ESP+AH,所以需要再次解析内存协议,如果还是AH、ESP、COMP,则解析新的spi,返回2,查询新的SA处理报文。
6、经过上面流程处理,漏出了用户数据报文(IP报文),根据ipsec模式:
流程路径如下图,这里以转发流程为例,本机发送的包主要流程类似。
转发流程:
ip_forward 函数中调用xfrm4_route_forward,这个函数:
1、解析用户报文,查找对应的Ipsec policy(__xfrm_policy_lookup);
2、再根据policy的模版tmpl查找对应最优的SA(xfrm_tmpl_resolve),模版的内容以及和SA的对应关系见上面贴出的ip xfrm命令显示;
3、最后根据SA生成安全路由,挂载再skb的dst上; 一条用户流可以声明多个安全策略(policy),所以会对应多个SA,每个SA处理会生成一个安全路由项struct dst_entry结构(xfrm_resolve_and_create_bundle),这些安全路由项通过 child 指针链接为一个链表,其成员 output挂载了不同安全协议的处理函数,这样就可以对数据包进行连续的处理,比如先压缩,再ESP封装,再AH封装。
安全路由链的最后一个路由项一定是普通IP路由项,因为最终报文都得走普通路由转发出去,如果是隧道模式,在tunnel output封装完完成ip头后还会再查一次路由挂载到安全路由链的最后一个。
注: SA安全联盟是IPsec的基础,也是IPsec的本质。 SA是通信对等体间对某些要素的约定,例如使用哪种协议、协议的操作模式、加密算法、特定流中保护数据的共享密钥以及SA的生存周期等。
然后,经过FORWARD点后,调用ip_forward_finish()-->dst_output,最终调用skb_dst(skb)->output(skb),此时挂载的xfrm4_output
本机发送流程简单记录一下,和转发流程殊途同归:
查询安全路由: ip_queue_xmit --> ip_route_output_flow --> __xfrm_lookup
封装发送: ip_queue_xmit --> ip_local_out --> dst_output --> xfrm4_output
注:
1). 无论转发还是本地发送,在查询安全路由之前都会查一次普通路由,如果查不到,报文丢弃,但这条路由不一定需要指向真实的下一跳的出接口,只要能匹配到报文DIP即可,如配置一跳其它接口的defualt。
2). strongswan是一款用的比较多的ipsec开源软件,协商完成后可以看到其创建了220 table,经常有人问里面的路由有啥用、为什么有时有有时无。这里做个测试记录: 1、220中貌似只有在tunnel模式且感兴趣流是本机发起(本机配置感兴趣流IP地址)的时候才会配置感兴趣流相关的路由,路由指定了source;2、不配置也没有关系,如1)中所说,只要存在感兴趣流的路由即可,只不过ping的时候需要指定source,否者可能匹配不到感兴趣流。所以感觉220这个表一是为了保证
ipsec封装发送流程:
xfrm4_output-->xfrm4_output_finish-->xfrm_output-->xfrm_output2-->xfrm_output_resume-->xfrm_output_one
xfrm4_output 函数先过POSTROUTING点,在封装之前可以先做SNAT。后面则调用xfrm_output_resume-->xfrm_output_one 做IPSEC封装最终走普通路由走IP发送。
贴一些网上的几张数据结构图
1、安全路由
2、策略相关协议处理结构
3、状态相关协议处理结构
Ⅱ Linux操作系统的主要组成部分是什么
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。x0dx0a一.Linux内核x0dx0a内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。x0dx0a二.Linux shellx0dx0ashell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。x0dx0a三.Linux文件系统x0dx0a文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660。x0dx0a四.Linux应用程序x0dx0a标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、XWindow、办公套件、Internet工具和数据库等。
Ⅲ linux里面ping -c 2 ip命令作用是什么
在Linux中,PING是测试一个网络的连通信的,基本命令格式为
ping
[-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
根据此,这个命令代表测试网络连通信,并测试2次