精华内容
下载资源
问答
  • TCP/IP协议分析(网络接口层安全缺陷)

    千次阅读 2020-01-11 23:45:47
    计算机网络体系结构是关于、协议和接口的集合总称。或者说:计算机网络体系结构包括三个内容:分层结构与每的功能、服务与接口、协议。 国际化标准组织(ISO)在IBM的SAN基础上制定了网络体系结构国际...

    目录

    TCP/IP概述

    一、计算机网络的体系结构

    1、计算机网络体系结构定义

    2、OSI/RM与TCP/IP对应关系

    3、名词释义

    4、TCP/IP协议主要构成和功能

    5、各层次间调用关系 

    二、TCP/IP工作原理 

    1、信源侧

    2、路由器侧

    3、信宿侧

    三、Internet安全缺陷的位置 

    网络接口层安全缺陷

    一、以太网基本原理

    1、以太网协议及格式

    2、以太网交换机工作原理

    二、交换式以太网的安全缺陷

    1、MAC地址泛洪攻击

    (1)MAC地址泛洪攻击原理

    (2)MAC地址泛洪攻击预防

    2、假冒生成树攻击

    (1)攻击原理

    (2)生成树攻击预防


    TCP/IP概述

    一、计算机网络的体系结构

    1、计算机网络体系结构定义

    • 计算机网络体系结构是关于层、协议和层间接口的集合总称。或者说:计算机网络体系结构包括三个内容:分层结构与每层的功能服务与层间接口协议
    • 国际化标准组织(ISO)在IBMSAN基础上制定了网络体系结构国际标准是OSI/RM
    • DARPADefense Advanced Research Projects Agency)的卡恩和斯坦福的瑟夫所提出的TCP/IP体系结构成为事实上的标准。

    2OSI/RMTCP/IP对应关系

    3、名词释义

    协议数据单元(Protocol Data UnitPDU)是网络体系结构中对等层之间交换的信息报文的统称。在TCP/IP中,各层PDU的称谓包括:

    • 报文(Message):应用层使用的数据报文格式,通常由具体应用层协议制定格式。
    • 段(Segment):传输层协议使用的数据报文格式。其中,UDP协议的报文也常常称为数据包。
    • 包(Packet):网际层协议使用的数据报文格式,常称为IP包、IP分组。
    • 帧(Frame):网络接口层协议使用的数据报文格式,与使用的网络形式有关,如以太网、ATM、令牌网等使用完全不同的帧。

    4TCP/IP协议主要构成和功能

    TCP/IP

    主要协议

    主要功能

    应用层

    Http Telnet FTP email

    负责将数据发送到传输层或者从传输层接收数据

    传输层

    TCPUDP

    为通信双方主机上的应用程序提供端到编的通信。TCP提供高可靠性的数据通信,将来自应用层的数据分块打包交给网络层进行传输,以及确认接收到的分组等。UDP则为应用层提供不可靠的数据通信,只是把数据包的分组从一台主机发送到另一台主机,不进行接收数据的确认。

    网际层

    IPICMPIGMPARPRARPOSI中属于链路层)

    为来自传输层的数据包选择传输路由。IPTCP/IP 协议族中最核心的协议。所有的 TCP UDPICMPIGMP 数据都以IP数据包格式传输。

    网络接口层

    PPP, Ethernet, Token ring, ATM

    发送时将IP包作为帧发送,接收时把收到的位组装成帧同时提供链路管理 、错误检测等。

    5、各层次间调用关系 

    二、TCP/IP工作原理 

    主机间的数据通信模型

    数据从信源传输到信宿的过程可描述如下:

    1、信源侧

    • 应用层程序将需传输数据流封装成规定的报文格式传送给传输层。
    • 传输层将来自应用层数据报文进行分割,对于TCP协议,按照规定的格式封装成TCP段;对于UDP协议,封装成UDP数据包。最后,将封装后的数据传送给网络层。
    • 网络层给来自传输层的数据按照规定的格式封装成分组(也称为IP包),并将分组报传送给接口层 。
    • 接口层在收到来自网络层上的IP报后,按照规定的格式封装成帧,并将帧传送给路由器。 

    2、路由器侧

    路由器是一个具有多个接口的网络互连设备。在路由器上运行有TCP/IP的下两层协议和路由选择协议。

    路由选择协议的功能是根据传输数据的目的地以及当前网络各链路的状况,选择一条适当的传输路径,从而实现将数据从一个网络转发到另一个网络。

    比较常见的路由选择协议有:RIPOSPF等。

    • 接口层在接收到来自物理链路上的数据后,将数据帧的首部和尾部丢弃,并把由此获得的IP数据包传送给网(际)层。
    • 网络(际)层收到来自接口层的IP数据报后,解析数据包,取出包首部中的目的IP地址,并由路由选择协议根据目的IP地址进行计算,选择一条适当的传输路径,再将IP数据包传送给接口层。
    • 接口层再重新按照规定的格式将IP包封装成帧,并通过物理链路将帧发送到目的IP地址所在的网络。 

    3、信宿侧

    信宿侧按照信源侧的反方向进行工作。

    • 接口层丢弃从链路上传来的数据帧的帧头和帧尾,获得IP数据包并将其传送给网络层。
    • 网络层首先计算来自接口层的IP报的校验和,并与存放在IP包首部中校验和进行比较,若不一致,则丢弃该 IP数据报;若一致,则丢弃IP 包首部,将获得的TCP段传送给传输层 。
    • 传输层检查来自网络层的TCP段中的顺序号,判断是否正确的TCP段 ,并检查TCP首部。若正确,则向信源发确认消息;若不正确或丢包,并向信源要求重发信息。
    • 对于正确的TCP段,传输层将丢弃TCP首部,按照顺序将TCP段组装成应用层报文,并将其传送给应用层。
    • 应用层在收到来自传输层的报文后,可以直接丢弃报文首部,也可以按照要求进行必要的检查,最后将获得的数据流直接传送给应用程序,从而完成一次数据传输。

    数据从信源传输到信宿的过程示例:

     

    三、Internet安全缺陷的位置 

    Internet是以TCP/IP技术为基础的互联网络,TCP/IP的安全缺陷是先天因素,是由于TCP/IP设计时所在的时代与技术局限造成的。我们现在能做的就是认识和设法弥补这些缺陷,并在设计新的互联网技术时克服这些缺陷。

    TCP/IP的安全缺陷存在于TCP/IP的各个层次,包括:

    网络接口层安全缺陷

    TCP/IP中并没有定义数据链路层(网络接口层)的协议,而是设计了面向现有数据链路层协议的接口,以便兼容包括以太(Ethernet)协议在内的第三方数据链路层协议。

    以太网络技术是应用最广泛的局域网技术,其基础是IEEE802.3协议,定义了CSMA/CD标准的媒体访问控制(MAC)子层和物理层规范。

    共享通信媒介是以太网的基础,凡是连接在同一个局域网内的主机都可以接受到在公共媒介上传输的信息。

    以太网包括:标准以太网(10M bit/s)、快速以太网(100M bit/s)、千兆以太网(1000M bit/s)和10G10Gbit/s)以太网,以及无线以太网等,并都符合IEEE802.3

    一、以太网基本原理

    1、以太网协议及格式

    目的地址和源地址都是指数据链路层(网络接口层)网络中节点的标识,由IEEE管理和负责分配,也称为MAC地址。MAC地址有48位,前24位由相关设备生产厂商向IEEE申请,后24位由设备生产厂商自主设定,但需保证不发生冲突。

    由于通常都是预先写进硬件设备中且修改相对困难,所以也常被称为硬件地址或物理地址。

    通常,48MAC地址按照每4位用1个十六进制数表示,共有12个十六进制数。如:00 07 e9 53 87 d9

    若某个帧的目的MAC地址为ff ff ff ff ff ff,则表示此帧为广播帧

    2、以太网交换机工作原理

    1)公共媒介的缺陷

    2)交换机工作原理

    1:一个已知节点向另一个已知节点发生信息:

     A主机连接在交换机的1号接口,已经在交换表登记

    E主机连接在交换机的2号接口,已经在交换表中登记

    2:一个未知节点向另外一个未知节点发生信息:

    C主机连接在交换机的1号接口,尚未在交换表中登记。

    D主机连接在交换机的2号接口,尚未在交换表中登记。

    3:向同一个接口号下的节点发生信息:

    交换完成后,交换表中新增了C主机表项。 

    A主机和B主机在交换机的同一个接口号下,交换机丢弃数据帧。

    二、交换式以太网的安全缺陷

    1MAC地址泛洪攻击

    交换机解决了共享媒介(HUB)同时只能一对主机进行通信的问题,而且还做到了既减少广播风暴,又防止了网络嗅探。

    然而,如果黑客连续不断向交换机发送垃圾帧,结果会怎样?

    1MAC地址泛洪攻击原理

    由于交换表空间有限,新的来源MAC地址不断的填写交换表项,当表被填满后,新的表项将会替代旧的表项。

    如果攻击者发送大量的具有不同伪造源MAC地址的帧,由于交换机的自学习功能,整个交换表将会被垃圾表项填满。当有正常的数据帧到达时,由于交换表不再有正常的MAC地址表项,交换机完全退化为广播模式,从而使得攻击者又可以用嗅探的方式窃听数据。

     

    2MAC地址泛洪攻击预防

    本质上,针对MAC地址泛洪攻击没有理想的预防方法。

    MAC地址-接口号绑定

    固化MAC地址-接口号表项,即为每个接口号设置固定的MAC地址,只接收和转发这些固定MAC地址的数据帧。

    这种方法有极大的网络维护工作量,不适用大型,并且一旦更换了网卡,必须重新绑定。

    限制MAC地址数量

    为每个交换机接口下可以连接的MAC地址数量进行限制,如交换表中每个接口只能与一个MAC地址构成表项,从而防止交换表溢出。这种方法可以防止交换表溢出,但并没有解决广播通信方式可能带来的数据窃听问题。

    2、假冒生成树攻击

    生成树协议 (Spanning Tree ProtocolSTP)是交换机常用的协议,该协议可以修剪冗余链路,从而达到避免环路的目的。

    1)攻击原理

    多个交换机运行生成树协议后,会选举一个根交换机。如果攻击者向广播域发送一个生成树消息,让交换机重新选举,并选择攻击者的交换机为根交换机,则该攻击者就达到了伪装根交换机的目的,从而获得各种数据帧或致使网络运行混乱,并使网络瘫痪。  

    2)生成树攻击预防

    生成树攻击相对比较容易预防,已经在大部分交换机上配备了相应的功能,即spanning-tree root guard功能。 

    根交换机如果发现了比自己优先级更高的交换机后,则端口会被置为root-inconsistent状态,这种状态类似于listen状态,忽略任何优先级更高的生成树报文,这样可以阻止连接在此端口的交换机成为根交换机。只要在3个周期(6秒内)没有再接收到优先级更高的生成树报文,可自动恢复,担当起根的责任。  

     

     
    展开全文
  • 文章目录1.TCP/IP、OSI、五参考模型结构图2.TCP/IP、OSI的相同点3.TCP/IP、OSI的不同点4.五参考模型结构5.五参考模型数据封装与解封装...为了学习计算机网络,采取折中的方法,综合学习OSI和TCP/IP的优点 ...


    1.TCP/IP、OSI、五层参考模型结构图

    在这里插入图片描述

    2.TCP/IP、OSI的相同点

    在这里插入图片描述

    3.TCP/IP、OSI的不同点

    在这里插入图片描述

    4.五层参考模型结构

    • 为了学习计算机网络,采取折中的方法,综合学习OSI和TCP/IP的优点
      在这里插入图片描述

    5.五层参考模型数据封装与解封装(数据传输)

    在这里插入图片描述

    展开全文
  • 物联网网络层安全需求

    千次阅读 2019-04-21 22:11:48
    物联网的体系架构分为感知、传输网络层)、应用和公共技术四个。 感知相当于人体的五官以及皮肤,用于察觉外部世界的数据信息。感知包括RFID、传感器节点、摄像头、GPS等数据采集设备或技术,实现物体...

    物联网的体系架构分为感知层、传输层(网络层)、应用层和公共技术四个层。

    感知层相当于人体的五官以及皮肤,用于察觉外部世界的数据信息。感知层包括RFID、传感器节点、摄像头、GPS等数据采集设备或技术,实现物体的感知、识别以及信息的采集与捕获。根据应用的不同的应用层不同的应用服务,感知层采用不同的感知设备。感知层要突破的方面是要具备更敏感和更安全的感知能力,以及解决底功耗、小型化和低成本等问题。

    传输层即网络层是物联网的主要核心技术,它相当于人的神经中枢和大脑,主要以因特网、移动通信网、卫星网等为主。传输层负责为信息的传递提供载体,实现更加广泛的互联网功能,能将感知层采集的信息进行高效、可靠、安全的传递、提供异构网络设备接口,实现传输层和感知层的融合。

    应用层相当于人的技术分工,根据不同的功能需求,应用层提供不同的应用服务。互联网最初是用来实现计算机及之间的通信,进而发展到连接以人为主体的用户,现在正朝着物物互联这一目标前进。

    公共技术不属于物联网的某个特定层面,但与物联网架构的三层都有关系,它提供标识、解析、安全管理、网络管理和信息管理等技术。信息管理中心负责存储感知层采集的感知数据,涉及物联网数据的查询分析和数据挖掘技术以及基于感知数据的决策和行为理论等。
    本文参考李永忠《物联网信息安全》

    展开全文
  • CHAPTER1:从网络接口层说起一、简介:网络接口层位于物理层之上,提供一组接口供协议栈和物理设备交互。这一层的实现费了我很大心思。起初,我认为linux下调用网卡驱动和ARM上一样,可以直接调用网卡驱动的函数,...

    CHAPTER1:从网络接口层说起

    一、简介:

    网络接口层位于物理层之上,提供一组接口供协议栈和物理设备交互。这一层的实现费了我很大心思。起初,我认为linux下调用网卡驱动和ARM上一样,可以直接调用网卡驱动的函数,于是跟着《Linux设备驱动程序》辛辛苦苦的写了一个网卡驱动,写完才发现,不知道怎么在程序中调用。查了无数资料,又看了看linux下网络部分的源码,才知道有个dev.c文件,里面定义了一组函数,可以和网卡驱动交互,于是我决定在一个模块里实现网络接口层。但内核编程对于我这个菜鸟来说实在难了点,好不容易写出了收包部分,在发包部分出了问题,一运行模块就挂起,还不能用rsmod命令移出,只能重启。正当我一筹莫展的时候,《使用libnetlibpcap构造TCP/IP协议软件》一文给了我很大启发,将协议栈做在用户层!这样既避免了纷繁的内核错误,又便于调试。我移植的目的不是替代linux本身的协议栈,仅仅是出于学习的目的,这样的方式大大简化了工作。最终,我采取了这种方式,用libpcaplibnet实现了网络接口层。

     

    先简单的介绍一下libpcaplibnet

     

    Libnet简介

    libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据报的构造、处理和发送功能。libnet的开发目的是:建立一个简单统一的网络编程接口以屏蔽不同操作系统低层网络编程的差别,使得程序员将精力集中在解决关键问题上。他的主要特点是:

     

    高层接口:libnet主要用C语言写成

     

    可移植性:libnet目前可以在Linux、FreeBSD、Solaris、WindowsNT等操作系统上运行,并且提供了统一的接口

     

    数据报构造:libnet提供了一系列的TCP/IP数据报文的构造函数以方便用户使用

     

    数据报的处理:libnet提供了一系列的辅助函数,利用这些辅助函数,帮助用户简化那些烦琐的事务性的编程工作

     

    数据报发送:libnet允许用户在两种不同的数据报发送方法中选择。

     

    另外libnet允许程序获得对数据报的绝对的控制,其中一些是传统的网络程序接口所不提供的。这也是libnet的魅力之一。

     

    libnet支持TCP/IP协议族中的多种协议,比如其上一个版本libnet1.0支持了10种协议,一些新的协议,比如对IPV6的支持还在开发之中。

                                                            ――摘自《使用libnetlibpcap构造TCP/IP协议软件》

     

    在我实现的网络接口层中主要使用了两个libnet函数一个是libnet_t * libnet_init(int injection_type, char *device, char *err_buf),用于初始化libnet,另一个int libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size),用于在链路层发送数据包。这和《使用libnetlibpcap构造TCP/IP协议软件》中的方式不一样。该文的作者为了简化协议栈的编写,其封包工作使用了libnet提供的自动封包函数,而我们要移植的是一个标准协议栈,构造包的工作应该交给协议栈完成,网络接口层要做的仅仅是把协议栈构造好的帧(以太网包称为帧)发送出去,其它都不用管。所以这里选用了libnet中最底层的libnet_write_link函数,直接将帧交付给网卡发送出去。也就是说,用libnet为协议栈提供数据包的发送功能,其流程可以简单的表示为下图:

    这里顺便提一下,我所使用的libnet是1.1.1版本的,比起1.0.x版本的改动比较大,很多函数名和参数都发生了变化,新的函数在其libnet-functions.h中都有说明,如果你查阅的资料中提到的函数不能使用,可以在这个文件中找到其新函数的声明。Libnet的下载地址:http://www.packetfactory.net/projects/libnet/(安装方法很简单,网上很多文章有介绍,可以在baidu上搜索一下)。

     

    Libpcap简介:

    libpcap unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap linux 下的源代码实现,其中重点是 linux 的底层包捕获机制和过滤器设置方式,同时也简要的讨论了 libpcap 使用的包过滤机制 BPF

    网络监控

    绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以建立网络监控(Network Monitoring)应用软件。网络监控也常简称为sniffer,其最初的目的在于对网络通信情况进行监控,以对网络的一些异常情况进行调试处理。但随着互连网的快速普及和网络攻击行为的频繁出现,保护网络的运行安全也成为监控软件的另一个重要目的。例如,网络监控在路由器,防火墙、入侵检查等方面使用也很广泛。除此而外,它也是一种比较有效的黑客手段,例如,美国政府安全部门的"肉食动物"计划。

     

    包捕获机制

    从广义的角度上看,一个包捕获机制包含三个主要部分:最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。

     

    不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、IP 层、传输层、最后到达应用程序。而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤/缓冲等相关处理,最后直接传递到应用程序。值得注意的是,包捕获机制并不影响操作系统对数据包的网络栈处理。对用户程序而言,包捕获机制提供了一个统一的接口,使用户程序只需要简单的调用若干函数就能获得所期望的数据包。这样一来,针对特定操作系统的捕获机制对用户透明,使用户程序有比较好的可移植性。包过滤机制是对所捕获到的数据包根据用户的要求进行筛选,最终只把满足过滤条件的数据包传递给用户程序。

     

    Libpcap 应用程序框架

    Libpcap 提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。Libpcap 可以在绝大多数类 unix 平台下工作,参考资料 A 中是对基于 libpcap 的网络应用程序的一个详细列表。在 windows 平台下,一个与libpcap 很类似的函数包 winpcap 提供捕获功能,其官方网站是http://winpcap.polito.it/

     

    Libpcap 软件包可从 http://www.tcpdump.org/ 下载,然后依此执行下列三条命令即可安装,但如果希望 libpcap 能在 linux 上正常工作,则必须使内核支持"packet"协议,也即在编译内核时打开配置选项 CONFIG_PACKET(选项缺省为打开)

    ./configure

    ./make

    ./make install

    libpcap 源代码由 20 多个 C 文件构成,但在 Linux 系统下并不是所有文件都用到。可以通过查看命令 make 的输出了解实际所用的文件。本文所针对的libpcap 版本号为 0.8.3,网络类型为常规以太网。

                                                                                                           ――摘自《基于 linux 平台的 libpcap 源代码分析》

     

    Libpcap完成了网络接口层中收包的工作,主要使用了下面几个函数:

    1、  pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,char *ebuf)

    用于初始化pcap

    2、  int pcap_compile(pcap_t *p, struct bpf_program *program,char *buf, int optimize, bpf_u_int32 mask)

    int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

             这两个函数主要用于安装过滤器,只接收发给本机的数据包。

    3、  int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

    用于捕获网卡收到的数据包,交由callback参数指定的函数处理

    以上几个函数完成了协议栈的收包的功能,其中pcap_loop函数参数callback指定的处理函数(packet_rx函数)是网络接口层向协议栈提交数据包的接口,在其中会调用协议栈的ni_in函数,进行多路分解,这在后面讲解源码时会提到。整个收包流程非常简单,可用下图表示:

     

    以上简单的介绍了一下网络接口层的设计,其中主要使用了libnetlibpcap两个库,关于这两个库的使用网上有很多文章介绍,感兴趣的朋友可以参阅相关资料。至于我们在网络接口层中使用到的功能,在后面的源码部分会专门提到。

     

    二、源码:

    这里我先给出整个网络接口层的源码,因为我自身的coding水平很菜,经常在学习别人的源码时深感注释太少,所以自己写的程序中注释都尽可能的详细。代码很简单,高手们可以很容易的看懂其功能,如果你的水平和我一样属于菜鸟,可以看看后面对每个函数的专门讲解。为了简化,下面在提到comerTCP/IP协议栈时一律简称comer

     

    /* zinterface.c -提供数据链路层函数(2006.4.10)*/

     

    /*libnet libpcap 构造数据链路层。

      *使用其他函数前,首先应该调用init_interface 初始化

      *libnet libpcap,以及网络接口。

      */

     

    #include <kernel.h>

    #include <znetwork.h>

    #include <libnet.h>

    #include <pcap.h>

    #include <zinterface.h>

    #include <q.h>

     

    char errbuf[LIBNET_ERRBUF_SIZE]; //libnet 错误信息

    libnet_t *l_dsc; //libnet 描述符

    char ebuf[PCAP_ERRBUF_SIZE];//用于接收pcap产生的错误信息

    pcap_t *pd;//pcap设备描述符

    Bool is_init_interface = FALSE;//接口初始化成功标志位

     

    struct netif nif[1];//定义在netif中声明的全局接口

     

    libnet_t *init_libnet()

    {

         l_dsc = libnet_init(LIBNET_LINK_ADV, NULL,errbuf);

         return l_dsc;

    }

     

     //打开pcap,获得描述符

     /*各参数依次为:设备名(linux下为eth0~ethN),捕获数据的最大字节,

       *混杂模式(1表示混杂),超时时间,接收错误的字符数组

       */

    pcap_t *init_libpcap()

    {

         pd = pcap_open_live("eth0",DEFAULT_SNAPLEN,1,1000,ebuf);

         return pd;

    }

     

    void xinu_dev_init(struct netif *pni, IPaddr ip,IPaddr net_ip , IPaddr mask_ip,

                                         u_char *hwaddr,IPaddr subnet,IPaddr nbrc)

    {

         strcpy(pni->ni_name, "eth0");

         pni->ni_state = NIS_UP;//初始化为打开状态

         pni->ni_ip = ip;//初始化接口ip

         pni->ni_net =net_ip;//网络号

         pni->ni_subnet = subnet;//子网广播地址

         pni->ni_mask = mask_ip;//子网掩码

         pni->ni_brc = 0xFFFFFFFF;//广播ip地址

         pni->ni_nbrc = nbrc;//组播地址

         pni->ni_mtu = 1500;//最大传输单元

         pni->ni_hwtype = AR_HARDWARE;//指定设备类型为以太网(仿照linux中,为1)

         memcpy(pni->ni_hwa.ha_addr,hwaddr,EP_ALEN);//设定物理地址

         pni->ni_hwa.ha_len = EP_ALEN;//物理地址长度6

         memset(pni->ni_hwb.ha_addr,0xFF,EP_ALEN);//设定广播物理地址

         pni->ni_hwb.ha_len = EP_ALEN;//广播//物理地址长度6

         pni->ni_ivalid = 0;

         pni->ni_nvalid = 0;

         pni->ni_svalid = 0;

         pni->ni_dev =0;

         pni->ni_ipinq = newq(NI_INQSZ, QF_NOWAIT); //为接口分配一个队列

         pni->ni_outq = 0;

         pni->ni_descr = NULL;

         pni->ni_mtype = 0;

         pni->ni_speed = 0;

         pni->ni_admstate = 0;

         pni->ni_lastchange = 0;

         pni->ni_ioctets = 0;

         pni->ni_iucast = 0;

         pni->ni_inucast = 0;

         pni->ni_idiscard = 0;

         pni->ni_ierrors = 0;

         pni->ni_iunkproto = 0;

         pni->ni_ooctets = 0;

         pni->ni_oucast = 0;

         pni->ni_onucast = 0;

         pni->ni_odiscard = 0;

         pni->ni_oerrors = 0;

         pni->ni_oqlen = 0;

         pni->ni_maxreasm = 0;

     

    }

     

    //取得子网广播地址

    //仅仅支持c ip地址(192.0.1.0 ~ 223.225.225.0)

    IPaddr get_subnet(IPaddr netp,IPaddr mask)

    {

             u_char netp_last = ((u_char *)&netp)[3];

             u_char mask_last =((u_char *)&mask)[3];

             IPaddr subnet = netp;

             int i;

             int all_bit_1 = 255;

     

             for (i = 0;i<=7;i++)

                       {

                                if ((u_char)(mask_last << i) == 0)

                                         break;

                       }

             all_bit_1 >>= i;

            

          ((u_char*)&subnet)[3] |= all_bit_1;

             return subnet;

    }

     

    //取得组播地址

    //只支持ABC 类地址

    IPaddr get_nbrc(IPaddr ip)

    {

             u_long all_bit24_1 = 0xffffff00;

             u_long all_bit16_1 = 0xffff0000;

             u_long all_bit8_1 = 0xff000000;

             IPaddr nbrc;

     

             if (IP_CLASSA(ip))

                       nbrc = ip | all_bit24_1;

             else if (IP_CLASSB(ip))

                       nbrc = ip | all_bit16_1;

             else if (IP_CLASSC(ip))

                       nbrc = ip | all_bit8_1;

             else

                       nbrc = 0;

     

             return nbrc;

    }

     

    //初始化libnet libpcap,以及网络接口

    int init_interface()

    {

        IPaddr interface_ip; //接口ip 地址

        IPaddr interface_mask; //接口子网掩码

        IPaddr interface_net_ip; //接口网络号

        u_char *interface_hwaddr; //接口硬件地址

        IPaddr interface_subnet;//接口子网广播地址

        IPaddr interface_nbrc;//组播地址

            

        //初始化libpcap

        if ((init_libpcap()) == NULL)

                 {

                       printf("Init libpcap error!/n");

                       return SYSERR;

                 }       

     

        //初始化libnet

        if ((init_libnet()) == NULL)

                 {

                       printf("Init libnet error!/n");

                       return SYSERR;

                 }

     

        //取得硬件地址

        if ((interface_hwaddr = (u_char *)libnet_get_hwaddr(l_dsc)) == NULL)

                 {

                       printf("Get interface MAC fault!/n");

                       return SYSERR;

           }

        //取得网络号和子网掩码

        if((pcap_lookupnet("eth0",(bpf_u_int32*)&interface_net_ip,(bpf_u_int32

    *)&interface_mask,ebuf)) == SYSERR)

                 {

                       printf("Get interface NET_IP/MASK fault!/n");

                       return SYSERR;

                 }

        //取得ip 地址

        if ((interface_ip =libnet_get_ipaddr4(l_dsc) )== -1)

                 {

                       printf("Get interface IP error!/n");

                       return SYSERR;

                 }

        //取得子网广播地址

            interface_subnet = get_subnet(interface_net_ip,interface_mask);

        //取得组播地址

            interface_nbrc = get_nbrc(interface_ip);

            

        //初始化网络接口

        xinu_dev_init(&nif[0], interface_ip, interface_net_ip, interface_mask,

                                             interface_hwaddr,interface_subnet,interface_nbrc);

        xinu_dev_init(&nif[1], interface_ip, interface_net_ip, interface_mask,

                                         interface_hwaddr,interface_subnet,interface_nbrc);

     

        //初始化成功,设置标志位

        is_init_interface = TRUE;

     

        return OK;

     

    }

     

    //利用libnet libnet_write_link 函数从链路层将包发送出去

    //返回值是已发送的字节数

    int link_write(u_char *buf,unsigned len)

    {

         struct ep *pep = (struct ep *) buf;

         int send_bytes_num;

     

         if (is_init_interface != TRUE)

               return SYSERR;

     

         if (l_dsc != NULL)

            send_bytes_num = libnet_write_link(l_dsc,(u_int8_t *)&pep->ep_eh,len);

         else

              return SYSERR;

     

         return send_bytes_num;

              

    }

     

    extern void arptbl_add(struct arpentry * tbl_prt);

    extern struct arpentry *paetbl;

    //收到包后交给协议栈的ni_in 函数处理

    void packet_rx(u_char * user, const struct pcap_pkthdr * h, const u_char * p)

    {

             struct ep *pep = (struct ep *) malloc(sizeof(struct ep));

             struct eh *peh;

     

             peh = (struct eh *) p;

             pep->ep_len = h->len;

     

             memcpy(&(pep->ep_eh),peh,sizeof(struct eh));

                 //这里复制的长度减去了帧头的长度

        memcpy(pep->ep_data,p+sizeof(struct eh),pep->ep_len - EP_HETHLEN);

             ni_in(&nif[1],pep,pep->ep_len);

             arptbl_add(paetbl);

    }

     

    int pcap_receive()

    {

        char filter_str[20];

        u_char *ip ;

        struct bpf_program fp;

     

        if (is_init_interface != TRUE)

              return SYSERR;

     

        //ni_ip 转化为4 元素的的u_char 数组,ip 指向数组首地址

        ip = (u_char *) &nif[1].ni_ip;

        //安装过滤器,只接收发给本机的数据包

        sprintf(filter_str, "dst net %d.%d.%d.%d",ip[0],ip[1],

                 ip[2],ip[3]);

        if (pcap_compile(pd,&fp,filter_str,0,nif[1].ni_net) == -1)

                 {

                       printf("Pcap complier init error!/n");

                       return SYSERR;

                 }

        if (pcap_setfilter(pd,&fp) == -1)

                 {

                       printf("pcap setfilter init error!/n");

                       return SYSERR;

                 }

       

     

             /*无限循环获取数据包

           *参数依次是:设备描述符,要抓取的包个数(-1表示无限循环抓取)

           *处理数据包的回调函数,user 参数不详

           */

         if (pcap_loop(pd,-1,packet_rx,NULL) < 0 )

                {

              fprintf(stderr,"pcap_loop: %s/n",pcap_geterr(pd));

                   return SYSERR;

                }

     

            

    }

     

    我们首先从头文件说起。Kernel.h q.h 两个头文件都是comerTCP/IP协议栈中定义的,前者定义了整个协议栈中使用的常量和一些宏,后者是xinu系统队列管理函数所包含的头文件,主要定义了一些队列管理所用到的常量。如果看过comer《用TCP/IP进行网际互联第二卷:设计、实现与内核》的朋友可能已经注意到了,znetwork.h这个文件和协议栈中network.h文件从命名上看很相识,实际上,znetwork.h就是network.h的一个简化版本,里面包含了一些zinterface.c文件中函数所要用到的头文件和常量。这是一个非常无奈的做法,直接包含network.h文件会使整个程序变得更加标准、整洁,但实际上是不可行的。关键在libnet.h文件。Libnet.h文件是libnet库用到的头文件,其中包含了很多linux下的头文件,而comerxinu操作系统,从名字上就可以看出和unix有很大的关系(你反着读看看:)),所以其中很多常量的命名会和linux下的头文件冲突,为了避免这种情况,我定义了znetwork.h这个简化版本,包含了必要的又不会产生冲突的头文件和常量。Zinterface.h仅仅声明了zinterface.c中的函数而已。最后是pcap.h,很明显,它是libpcap库用到的头文件。

    接着看看函数:

    1init_interface函数

    在使用其他函数前,必须先调用Init_interface函数,它完成了libnetlibpcap以及comer中网络接口的初始化。Init_interface首先调用了init_libpcapinit_libnet函数,从上面的源码可以看出,这两个函数仅仅调用了pcap_open_livelibnet_init初始化libpcaplibnet,并返回pcaplibnet的描述符供其他pcaplibnet函数使用。这里将描述符pcap_t *pdpcap描述符)、libnet_t *l_dsclibnet描述符)定义成了公有变量。紧接着,调用了libnet_get_hwaddrpcap_lookupnetlibnet_get_ipaddr4用于获取网卡硬件地址、网络号、子网掩码以及ip地址。这里需要特别提到的是int pcap_lookupnet(device, netp, maskp, errbuf)函数,我们注意到其中第二个参数netp。网上广为流传的pcap资料中都声称netp代表了ip地址,部分资料(好像是在什么叶子的blog中)还信誓旦旦的提醒大家:千万不要被它的名字迷惑了,它就是ip地址。实际上,正如它名字提示的一样,它确实是网络号。大家可以把它和用libnet_get_ipaddr4得到的ip地址比较一下,或者用它和子网掩码做位与就可以看出。接下来,这里调用了get_subnetget_nbrc用于获得子网广播地址和组播地址。所有的准备工作完成后,调用了xinu_dev_init函数初始化comer中的网络接口,对struct netif结构中的各个字段赋值(struct netif结构定义见comernetif.h文件)。这里初始化了两个接口,nif[0]nif[1]Comer的协议栈考虑了路由器的情况,即一台主机有多个网络接口,但我们大多数人的机器上只有一个网卡,所以只定义了两个接口,nif[0]代表本地结构,也就是linux下的lo回环(本地接口),nif[1]代表网卡。大家可能注意到了,两个接口被一样的初始化,其实这是不对的。Lo回环接口的初始化操作不应该是这样,但因为写这篇文章的时候我还没有做完ip层,所以暂时将它初始化为和代表网卡的接口一样,在用到它时再更改它的初始化代码。最后,我们将全局变量is_init_interface设为了TRUE,它标志了init_interface函数初始化成功,这样其他函数才能使用pcaplibnet库。

     

    2get_subnet函数

    get_subnet函数是用于获得子网广播地址。由于没有找到现成的函数可用,我自己实现了这个功能。如果你还不明白子网的划分方法,建议你先在网上查一下相关文章了解一下。get_subnet函数只支持cip地址,也就是192.0.1.0 ~ 223.225.225.0ip段。如果你的ipa类和b类,可以参照该函数的实现改写。这里首先根据子网掩码,用一个循环判断出子网号占了几位主机号(cip的最后8位代表主机号),用I表示所占位数。然后将一个全1的字节右移I位再和网络号的最后八位做位或操作,这样就将主机位全部置1,得到了子网广播地址。

     

    4、 get_nbrc函数

    get_nbrc函数用于获得组播地址。它的实现更简单,首先使用了comer中的宏判断出是哪类ip地址(这些宏在ip.h中定义),然后将相应类型ip地址的主机号全部置1,就得到了组播地址。注意,get_nbrc只支持abcip地址。

     

    5、 xinu_dev_init函数

    xinu_dev_init函数功能很简单,初始化了comernetif.h文件定义的网络接口。其字段定义在netif.h文件中都有很详细的说明,在此不再累述。这里传入了 ipnet_ipmaskhwaddrsubnetnbrc 6个参数,分别代表ip地址、网络号、子网掩码、硬件地址、子网广播地址、组播地址,用于初始化接口的相应字段。需要提一下的是ni_iping字段,它表示ip层的输入队列序号,这里使用了newq函数在初始化时为它分配了一个新队列。Newq函数在comer中定义于sys/gpq.c文件中,由于移植的需要,我进行了改写,命名为zgpq.c,在后面介绍ARP的实现时会提到。因为我是边移植边写文章,所以netif接口中的很多字段暂时没有用到,故简单的初始化为0,再用到的时候会更改初始化的值。

     

    6pcap_receive函数

    pcap_receive函数使用pcappcap_loop函数无限循环获取数据包,并将数据包提交给packet_rx函数处理。函数首先根据is_init_interface变量判断是否初始化了libpcap,然后使用pcap_compilepcap_setfilter安装了一个过滤字符串(pcap_compilepcap_setfilter函数的用法见网上相关文章),只接收发往本机的数据包。接着调用pcap_loop捕获数据包。注意,我们在调用pcap_open_live初始化pcap时,通过设置其第三个参数为1将网卡设置成了混杂模式,用于捕获网络上的所有数据包。这是因为在实现到ip层以上时(如udptcp),请求连接的操作会造成两个协议栈的同时响应(我们的协议栈和linux本身的协议栈),为了不产生影响,以后我们会更改xinu_dev_init函数,虚拟一个ip地址。这样,linux本身的协议栈就会丢弃发向该ip的数据包,而我们通过混杂模式捕获了网上所有的数据包,并通过设置过滤器,就可以得到发向我们协议栈的数据包。

     

    7、 packet_rx函数

    packet_rx函数是pcap_loopcallback参数所指定的数据包处理函数。Pcap_loop捕获到数据包后交由packet_rx函数处理。注意,packet_rx函数的参数必须像程序中那样定义,这是由pcap规定的。u_char* user代表pcap_loop函数中设定的字符串指针、struct pcap_pkthdr *h指向收集数据包相关信息的结构体的指针,const u_char *p是指向数据包报文的指针。在这里,我们用malloc分配了一个以太网帧数据结构pep(其结构定义见comerether.h文件),将p指针指向数据区中的报文复制一份给pep。这里用了两个memcpy函数分别复制以太网帧头和帧数据区。H->len表示了收到帧数据的长度。数据复制完成后,调用了ni_in函数,这是comer中多路分解的实现函数,在介绍ARP实现时会提到。现在仅仅需要知道网络接口层是通过ni_in将收到的数据包提交给协议栈即可。细心的你可能已经注意到了arptbl_add这个函数,以及packet_rx函数上的extern struct arpentry *paetbl声明。它们和我们的网络接口层没有任何关系,放在这里仅仅是因为我们后面的ARP实例中使用了内存映射,必须在这里调用映射函数。在读程序的时候可以将它们忽略掉。

     

    8link_write函数

    link_write函数提供了以太网帧的发送功能。它主要用于替代comer中的write函数。这里有两个参数,buf代表要发送的数据,len表示数据长度。在确定了libnet已经被初始化后,调用了libnet_write_link函数发送数据。注意,我们这里发送的是&pep->ep_eh而不是peppep是指向以太网帧结构的指针),是因为comer中的以太网帧结构是一个扩展帧,在帧头之前还有10字节的附加信息,我不确定发送这样的帧是否会得到对方响应,故从pep结构中的ep_eh字段开始发送(ep_eh代表以太网帧头),发送一个标准以太网帧。(libnet_write_link函数有一个奇怪的bug,在后面介绍ARP实例时会提到)

     

    到此为止,网络接口层的就已经全部介绍完了,它提供一组函数供协议栈发送和接收数据包,在后面的ARP介绍中,我们将会通过一个ARP实例看到它是怎么工作的。

     

     

                                                                                                             ――未完待续
    展开全文
  • TCP/IP层次安全

    千次阅读 2019-09-25 14:22:53
    TCP/IP层次安全性 TCP/IP的安全性可分为多层,各安全层是一包含多个特征实体。在不同层次,可增加不同安全策略和措施。如在传输层提供安全套接层服务SSL和其继任者...TCP/IP模型的网络接口层对应着OSI模型的物理层...
  • 交换机: 1、三交换机 = 三路由器 + 二交换机 2、三路由引擎是可以关闭或开启的 3、三交换机的优点: 4、三交换机上起虚接口(配置VLAN的网关) 5、二端口升级为三...网络规划+三交换实验
  • API接口安全

    万次阅读 2017-08-08 14:19:19
    API接口安全 1 基本概念 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或...
  • 交换机: 1.三交换机 = 三路由+二交换机 2.三路由引擎是可以关闭或开启的 ...4.三交换机上起虚接口(配置VLAN的网关) int vlan 10 ip add 10.1.1.254 255.255.255.0 no shut exit 5
  • 开放接口API安全

    千次阅读 2018-09-28 11:24:40
    服务端对外开放API接口,尤其对移动应用开放接口的时候,更需要关注接口安全性的问题,要确保应用APP与API之间的安全通信,防止数据被恶意篡改等攻击。 安全考量点 Token机制 开放接口时最基本需要考虑到接口不...
  • 网络模型与物联网三模型

    千次阅读 多人点赞 2019-01-21 19:30:16
    前言 学安全,基础知识还是得要...这一参考模型共分为七:物理、数据链路网络层、传输、会话、表示和应用。 下面这张表,可算是精华:   层级 序号 功能 举例 应用 7 终端...
  • 网络模型

    万次阅读 多人点赞 2018-07-24 22:26:12
    最近又看到这个七模型了,一直都记不住这个七模型,就算背住了也很快忘记。主要原因还是因为没有真实的使用场景,也没能理解其中的原理。但是这个东西是计算机网络的基础,既然碰巧看到就顺便整理一下吧。很多...
  • 计算机网络(四)_网络层

    千次阅读 2020-05-15 08:23:45
    计算机网络-网络层-详细总结 相关博文: 三言两语轻松计算机网络入门 走进科学之-计算机网络物理-硬核扫盲 走进科学之计算机网络-数据链路-硬核扫盲 文章目录计算机网络-网络层-详细总结网络层提供的服务互联...
  • 网络协议

    千次阅读 热门讨论 2017-12-26 14:29:35
    OSI模型有7结构, OSI的7从上到下分别是 7 应用 6 表示 5 会话 4 传输 3 网络层 2 数据链路 1 物理 ;其中高层(即7、6、5、4)定义了应用程序的功能,下面3(即3、2、1)主要面向通过网络的端到端...
  • 一、物理的基本任务 怎样能在连接各种计算机的传输媒体上传输比特流? 物理的主要任务 描述为确定与传输媒体的接口的一些特性,即: 机械特性 指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置...
  • 随着网络中计算机的数量越来越多,传统的以太网络开始面临冲突严重、广播泛滥以及安全性无法保障等各种问题。       VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理...
  • 数据链路(2 Data Link Layer) 3、帧结构: 4、工作在数据链路的设备: 5、交换机的工作原理: 6、交换机的端口: 7、交换机5大基本工作模式:
  • 《计算机网络》第5章 网络层

    万次阅读 多人点赞 2017-03-26 02:04:47
    网络层的主要功能就是:将源端数据包一路送到接收方。
  • API接口安全性设计

    千次阅读 2021-10-17 17:30:27
    对,业务层接口经过我一天半的努力已经全部交付给客户端了,不过我改主意了,我要返厂重做,在不影响客户端联调的前提下。 我要加上这个新功能。 网上这类文章不少,但是我还要写,表示我现在知道这个东西了。 Part1...
  • 计算机网络——五与七模型

    万次阅读 多人点赞 2019-08-31 21:40:53
    文章目录1 TCP/IP五模型与OSI七模型1.0 OSI是什么1.1 TCP/IP五模型与OSI七模型...2 计算机网络——以五模型来说明工作原理2.1 物理在干吗2.2 数据链路2.2.1 以太网协议2.2.2 广播与ARP协议2.3 网络层...
  • 原文链接:网络层次划分及网络协议 1 OSI七模型、TCP/IP四模型、TCP/IP五模型 不管是OSI七模型还是TCP/IP的四、五模型,每一中都要自己的专属协议,完成自己相应的工作以及与上下层级之间进行沟通。 ...
  • 网络协议的形象说明

    千次阅读 2017-07-27 10:05:12
    模型在Windows程序下的体现: 物理----就是我们看得见的网卡...网络----即NDIS,NDIS提供网络接口。决定网络设备间如何传输数据;根据唯一的网络设备地址选择包;提供流和拥塞控制,以阻止同时网络资源的损耗
  • 数据传输网络结构体系(核心 汇聚 接入) 三结构体系模式:核心 汇聚 接入 基于复杂的网络简单化处理,网络采用三级分层体系。 网络的三分层体系结构: 网络结构体系是采用层次化架构三...
  • 计算机网络:第七章 网络安全

    千次阅读 2018-11-30 18:36:00
    4、网络层安全协议IPsec协议族和运输层安全协议SSL/TLS的要点; 5、应用层电子邮件的安全措施; 6、系统安全:防火墙与入侵检测。 1.网络安全概述 1.1 计算机网络面临的安全性威胁 计算机网络的通信方面临两大类...
  • 局域网安全----接入层安全

    千次阅读 多人点赞 2018-11-25 18:13:40
    局域网面临的安全风险 a、Mac洪范攻击:发送大量垃圾Mac,填满Mac表,迫使交换机洪范 b、Mac中间人攻击:欺骗交换机   a交换机给b交换金发送数据,h是黑客,向交换机发送b的Mac,使a以为黑客是b c、ARP的...
  • 1.网络层向上提供的服务有哪两种?试比较其优缺点。 解答:面向连接的虚电路服务和无连接的数据报服务。 对比的方面 虚电路服务 数据报服务 思路 可靠通信应当由...
  • 计算机网络笔记Part4 网络层(Network Layer)

    万次阅读 多人点赞 2020-06-29 20:43:07
    1.概述 注释: 数据报和分组的关系:分组是一段比较长的数据,将它进行切割成一段段之后就得到...网络层 IP数据报,分组(如果IP数据报太大就切割成分组) 数据链路 帧 物理 比特流 2.数据交换方式 为什么
  • 设计一个安全的对外接口如何下手?

    千次阅读 2020-04-23 22:38:03
    主要用于接口安全. 2.学习/操作 TBD 3.问题/补充 1.WiFi是什么, 有绝对安全的WiFi吗? TBD 2.如何取得路由器的管理员密码? TBD 3.如何避免在网络中暴露的位置信息 ...
  • 计算机网络协议(二)——从二到三

    万次阅读 多人点赞 2019-09-03 11:56:34
    底层网络知识详解:从二到三概述一、从物理到MAC1.1 第一(物理)1.2 第二(数据链路)二、交换机与VLAN2.1 如何解决广播问题和安全问题?三、ICMP和ping3.1 ICMP协议的格式3.2 ICMP报文类型3.3 ping:...
  • 层次化网络设计(三层网络结构)

    万次阅读 2019-05-14 21:51:45
    层网络架构是采用层次化架构的三层网络。 三层网络架构采用层次化模型设计,即将复杂的网络设计分成几个层次,每个层次着重于某些特定的功能,这样就能够使一个复杂的大问题变成许多简单的小问题。三层网络架构...
  • 计算机网络安全基本概述

    万次阅读 多人点赞 2019-09-16 16:10:25
    网络安全 概述

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 252,197
精华内容 100,878
关键字:

网络接口层安全