首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux原始套接字抓包

一、基础概念

  1. 原始套接字(Raw Socket)
    • 在Linux系统中,原始套接字是一种特殊的套接字类型。它允许应用程序直接访问网络协议栈的较低层,绕过了传输层的部分功能。对于IPv4,原始套接字的类型为SOCK_RAW
    • 与普通的流套接字(如TCP套接字)和数据报套接字(如UDP套接字)不同,原始套接字可以对网络层的数据包进行完全的控制,包括构建自定义的IP头部等操作。
  • 抓包原理
    • 当使用原始套接字进行抓包时,程序实际上是在监听网络接口上的所有进出流量。原始套接字可以接收网络层(IP层)传来的数据包,然后通过解析这些数据包来获取其中包含的各种信息,如源IP地址、目的IP地址、协议类型(TCP、UDP、ICMP等)、端口号(如果适用)以及有效载荷数据等。

二、相关优势

  1. 深度分析
    • 能够深入到网络协议的底层进行分析。例如,可以查看未经过传输层处理的数据包内容,对于研究网络协议的实现细节、排查网络故障中的底层问题非常有帮助。
  • 定制化功能
    • 可以根据需求定制数据包的处理方式。比如构建特定格式的自定义网络数据包,用于网络测试或者特定的网络应用开发。

三、类型(从功能角度)

  1. 只接收型
    • 这种类型的原始套接字主要用于捕获网络中的数据包,而不进行发送操作。它可以方便地对网络流量进行监控和分析。
  • 发送和接收型
    • 除了能够接收网络中的数据包外,还可以构建并发送自定义的网络数据包。这在网络攻击模拟(在合法合规的安全测试场景下)、网络协议测试等场景中有重要应用。

四、应用场景

  1. 网络故障排查
    • 当网络出现连接异常等问题时,通过原始套接字抓包可以查看网络层的数据包传输情况,确定是否存在IP地址冲突、路由错误等问题。
  • 网络安全分析
    • 可以检测网络中的异常流量模式,例如发现潜在的恶意扫描行为(如大量的ICMP数据包发送到不同主机)或者未授权的网络访问尝试。
  • 网络协议开发与测试
    • 在开发新的网络协议或者对现有协议进行改进时,原始套接字可以用于发送和接收自定义协议的数据包,以测试协议的正确性和性能。

五、可能遇到的问题及解决方法

  1. 权限问题
    • 问题:在Linux系统中,创建原始套接字通常需要较高的权限(通常是root权限)。如果没有足够权限,创建原始套接字会失败。
    • 解决方法:以root用户身份运行程序,或者使用setcap命令为可执行文件赋予相应的权限。例如,如果程序名为packet_capture,可以使用命令sudo setcap cap_net_raw +ep packet_capture来赋予其创建原始套接字的权限。
  • 数据包解析复杂
    • 问题:网络协议有多层结构,准确解析数据包中的各个字段比较困难,尤其是对于复杂的协议如TCP、UDP等。
    • 解决方法:使用现有的网络协议分析库,如libpcap(虽然它不是专门针对原始套接字,但提供了很好的数据包解析功能)或者自己编写详细的解析代码,按照网络协议的规范逐步解析数据包的各个部分。例如,在解析TCP数据包时,要按照TCP头部的格式依次解析源端口、目的端口、序列号、确认号等字段。
  • 过滤大量无关数据包
    • 问题:在网络环境中,可能会接收到大量的数据包,其中很多可能与当前的分析需求无关,这会增加处理负担并且可能掩盖真正需要关注的数据包。
    • 解决方法:在原始套接字接收数据包后,添加有效的过滤机制。可以根据源IP地址、目的IP地址、协议类型等条件进行过滤。例如,如果只关注特定IP地址段的主机之间的TCP通信,可以在代码中添加逻辑,只处理源IP和目的IP在该地址段内且协议为TCP的数据包。

以下是一个简单的使用原始套接字进行抓包(仅接收ICMP数据包示例,需要root权限)的C代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/icmp.h>

int main() {
    int sockfd;
    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);
    char buffer[1024];

    // 创建原始套接字
    if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
        perror("socket");
        exit(1);
    }

    while (1) {
        // 接收数据包
        int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&addr, &addrlen);
        if (n < 0) {
            perror("recvfrom");
            continue;
        }

        struct ip* ip_header = (struct ip*)buffer;
        struct icmp* icmp_header = (struct icmp*)(buffer + ip_header->ip_hl * 4);

        printf("Source IP: %s
", inet_ntoa(addr.sin_addr));
        printf("ICMP Type: %d
", icmp_header->icmp_type);
    }

    close(sockfd);
    return 0;
}

这个示例代码创建了一个原始套接字用于接收ICMP数据包,解析并打印出源IP地址和ICMP类型字段。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

18.1 Socket 原生套接字抓包

原生套接字抓包的实现原理依赖于Windows系统中提供的ioctlsocket函数,该函数可将指定的网卡设置为混杂模式,网卡混杂模式(Promiscuous Mode)是常用于计算机网络抓包的一种模式,...启用混杂模式的主要用途之一是网络抓包分析,使用混杂模式可以捕获网络中所有的数据包,且不仅仅是它所连接的设备的通信数据包。...要实现抓包前提是需要先选中绑定到那个网卡,如下InitAndSelectNetworkRawSocket函数则是实现绑定套接字到特定网卡的实现流程,在代码中首先初始化并使用gethostname函数获取到当前主机的主机名...= WSAStartup(MAKEWORD(2, 2), &wsaData)) { return FALSE; } // 创建原始套接字 // Windows无法抓取RawSocket MAC...,当读者运行后会看到如下图所示的代码片段,此处笔者就选择三号网卡进行绑定操作,当绑定后此时套接字ID对应的则是特定的网卡,后续的操作均可针对此套接字ID进行,如下图所示;图片当读者有了设置混杂模式的功能则下一步就是抓包了

46740
  • 18.1 Socket 原生套接字抓包

    原生套接字抓包的实现原理依赖于Windows系统中提供的ioctlsocket函数,该函数可将指定的网卡设置为混杂模式,网卡混杂模式(Promiscuous Mode)是常用于计算机网络抓包的一种模式,...启用混杂模式的主要用途之一是网络抓包分析,使用混杂模式可以捕获网络中所有的数据包,且不仅仅是它所连接的设备的通信数据包。...要实现抓包前提是需要先选中绑定到那个网卡,如下InitAndSelectNetworkRawSocket函数则是实现绑定套接字到特定网卡的实现流程,在代码中首先初始化并使用gethostname函数获取到当前主机的主机名...= WSAStartup(MAKEWORD(2, 2), &wsaData)) { return FALSE; } // 创建原始套接字 // Windows无法抓取RawSocket...,当读者运行后会看到如下图所示的代码片段,此处笔者就选择三号网卡进行绑定操作,当绑定后此时套接字ID对应的则是特定的网卡,后续的操作均可针对此套接字ID进行,如下图所示; 当读者有了设置混杂模式的功能则下一步就是抓包了

    42720

    原始套接字 IP_HDRINCL 转

    原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以   编写基于IP协议的通讯程序。   ...IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接字可以接收内核传递给原始套接字的任何IP数据包,且只有超级用户才可以创建原始套接字。   ...@当需要编写自己的IP数据包首部时,可以在原始套接字上设置套接字选项IP_HDRINCL.在不设置这个选项的情况下,IP协议自动填充IP数据包的首部。   ...2.大多数ICMP数据包的一个拷贝传送给匹配的原始套接字。   3.内核处理的所有其它类型的数据包的一个拷贝都传给匹配的原始套接字。   ...在将一个IP数据包传送给原始套接字之前,内核需要选择匹配的原始套接字1.数据包的协议域必须与接收原始套接字的协议类型匹配。

    2.4K10

    原始套接字和流量嗅探

    ---- 原始套接字和流量嗅探 前言 《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。...书是比较老了,anyway,还是本很好的书 本篇是第3章原始套接字和流量嗅探 1、Windows和Linux上的包嗅探 为了多平台使用,先创建SOCKET,再判断平台 windows允许嗅探所有协议 linux...coding:utf8 -*- import socket import os # 监听主机,即监听那个网络接口,下面的为我的kali的ip host = "10.10.10.145" # 创建原始套接字...socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) #raw的中文是生的意思,大概就是原始套接字的意思吧...self.protocol_num] except: self.protocol = str(self.protocol_num) # 下面的代码类似于之前的例子 # 创建原始套接字

    1.8K20

    Go中原始套接字的深度实践

    介绍 原始套接字(raw socket)是一种网络套接字,允许直接发送/接收更底层的数据包而不需要任何传输层协议格式。...平常我们使用较多的套接字(socket)都是基于传输层,发送/接收的数据包都是不带TCP/UDP等协议头部的。...当使用套接字发送数据时,传输层在数据包前填充上面格式的协议头部数据,然后整个发送到网络层,接收时去掉协议头部,把应用数据抛给上层。...如果想自己封装头部或定义协议的话,就需要使用原始套接字,直接向网络层发送数据包。 为了便于后面理解,这里统一称应用数据为 payload,协议头部为 header,套接字为socket。...表示服务器之间的网络通信 syscall.AF_UNIX表示同一台机器上的进程通信 syscall.AF_INET6表示以IPv6的方式进行服务器之间的网络通信 其他 第二个参数 syscall.SOCK_RAW,表示使用原始套接字

    3K30

    《Python黑帽子》:原始套接字和流量嗅探

    在本文中,我们将使用原始套接字来访问诸如IP 和ICMP 头等底层的网络信息。在下面的例子中,我们只对IP 层和更高层感兴趣,因此我们不会去解码以太网头中的信息。...Windows 和Linux 上的包嗅探 在Windows 和Linux 上访问原始套接字有些许不同,但我们更中意于在多平台部署同样的嗅探器以实现更大的灵活性。...我们将先创建套接字对象,然后再判断程序在哪个平台上运行。在Windows 平台上,我们需要通过套接字输入/输出控制(IOCTL)1设置一些额外的标志,它允许在网络接口上启用混杂模式。...在第一个例子中,我们只需设置原始套接字嗅探器,读取一个数据包,然后退出即可。 首先,我们通过构建套接字对象对网络接口上的数据包嗅探进行必要的参数设置①。...然后,我们通过设置套接字选项②设置在捕获的数据包中包含IP 头。下一步③,我们判断程序是否运行在Windows 上,如果是,那么我们发送IOCTL 信号到网卡驱动上以启用混杂模式。

    1.3K20

    linux抓本来端口包,Linux抓包

    1、如果要抓eth0的包,命令格式如下: tcpdump -i eth0 -w /tmp/eth0.cap 2、如果要抓192.168.1.20的包,命令格式如下: tcpdump -i etho host...192.168.1.20 -w /tmp/temp.cap 3、如果要抓192.168.1.20的ICMP包,命令格式如下: tcpdump -i etho host 192.168.1.20 and...port 10002 -w /tmp/port.cap 5、假如要抓vlan 1的包,命令格式如下: tcpdump -i eth0 port 80 and vlan 1 -w /tmp/vlan.cap...6、假如要抓pppoe的密码,命令格式如下: tcpdump -i eht0 pppoes -w /tmp/pppoe.cap 7、假如要抓eth0的包,抓到10000个包后退出,命令格式如下: tcpdump...-i eth0 -c 10000 -w /tmp/temp.cap 8、在后台抓eth0在80端口的包,命令格式如下: nohup tcpdump -i eth0 port 80 -w /tmp/temp.cap

    5.8K40

    Linux网络套接字(二)

    返回值:返回一个新的套接字描述符。...首先是写出服务器的代码,代码的思路是这样的: ①首先为服务器创建套接字,因为这个是TCP协议,TCP是面向连接的,因此服务器是需要进入监听状态才能让客户端连接,所以使用socket接口创建出来的套接字是属于监听套接字...=2) { Usage(argv[0]); return 1; } //tcp_server //1.创建套接字,此套接字为监听套接字,用于绑定和监听 int listen_sock...=2) { Usage(argv[0]); return 1; } //tcp_server //1.创建套接字,此套接字为监听套接字,用于绑定和监听 int listen_sock...=2) { Usage(argv[0]); return 1; } //tcp_server //1.创建套接字,此套接字为监听套接字,用于绑定和监听 int listen_sock

    2K30

    Linux网络-套接字编程基础

    Linux网络编程套接字 零、前言 一、网络基础知识 1、源IP地址和目的IP地址 2、源MAC地址和目的MAC地址 3、认识端口号 4、PORT VS PID 5、TCP和UDP协议 6、网络字节序...二、socket编程接口 1、sockaddr结构 2、socket 常见API 零、前言 本章就Linux网络编程进行概念及接口学习,下一篇则是简单的进行上手网络套接字编程 一、网络基础知识 1...位的长整数从主机字节序转换为网络字节序 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回 二、socket编程接口 1、sockaddr结构 套接字不仅支持跨网络的进程间通信...,还支持本地的进程间通信(域间套接字) 因此套接字提供了sockaddr_in结构体和sockaddr_un结构体,其中sockaddr_in结构体是用于跨网络通信的,而sockaddr_un结构体是用于本地通信的...为了让套接字的网络通信和本地通信能够使用同一套函数接口,于是就出现了sockeaddr结构体,该结构体与sockaddr_in和sockaddr_un的结构都不相同,但这三个结构体头部的16个比特位都是一样的

    1.5K20

    Linux网络-TCPUDP套接字编程

    零、前言 本章主要是对套接字网络编程的一个学习,目标是能够基本的进行套接字编程 一、UDP套接字 1、创建套接字 无论是服务端还是客户端,进行网络编程需要做的第一件事就是创建套接字 socket...函数函数原型: int socket(int domain, int type, int protocol); 解释: domain:创建套接字的域或者叫做协议家族,也就是创建套接字的类型。...相比于UDP套接字来说,TCP套接字与之在一些地方是相同的,但是TCP的特点是面向链接的流式套接字,所以还是有很大的区别的 1、创建套接字 同样的tcp的服务端和客户端首先第一件事是创建套接字文件...这是一个输入输出型参数 返回值:获取连接成功返回接收到的套接字的文件描述符,获取连接失败返回-1,同时错误码会被设置 套接字文件之间的区别: socket函数创建的套接字文件:用于不断获取客户端发来的连接请求...,同文件的读写是一样是流式的,那么对于TCP来说,使用文件读写的方式进行读写套接字文件同样可以达到数据发送和接收的目的 读取套接字文件数据,即为接收对应套接字建立链接的远端发送来的消息;向套接字文件进行写入数据

    3.7K10

    Linux:网络编程套接字及UDP

    而udp就是一拿到数据包就转手往下扔,他也懒得维护报文信息,因为他压根不关心数据包的发送情况。       注意,可靠的前提是网络必须连通!!  ...套接字的种类: 1、域间套接字(同一个机器内) struct sockaddr_un 2、原始套接字(网络工具)  原始套接字一般不关心传输层的东西,他一般是绕过传输层去考虑网络层和链路层,所以他一般被用来封装一些网络工具...:比如网络装包、网络诊断…… 3、网络套接字(用户间通信)struct sockaddr_in 但是我们想将网络接口统一抽象化,所以参数的类型必须是统一的!!...1、首先要创建套接字 第一个参数  是套接字的域,AF_LOCAL是本地的,AF_INET是网络ipv4的 第二个参数  是套接字的类型  SOCK_STREAM是面向字节流的(TCP),SOCK_DGRAM...类型 (1)我们先创建出来之后,然后可以用bzero(有点像C语言的memset)将指针内容先清空然后再填充 (2)local.sin_family  表明这个通用类型是属于网络套接字还是域间套接字 (

    11210

    Linux实验八:流式套接字编程

    一、实验目的 1、深入理解 TCP/IP 模型相关概念; 2、掌握流式套接字 socket 相关的数据结构,如 sokkaddr,sockaddr_in 等; 3、掌握流式套接字通讯时常用的函数,如...在这个过程中,我们需要完成以下关键步骤: 创建套接字:利用socket()函数创建一个TCP套接字。 设置服务器地址:配置服务器的IP地址和端口号。...关闭套接字:在通信结束后,关闭套接字释放资源。...定义了监听套接字listen_fd和客户端套接字client_fd,以及服务器地址server_addr和客户端地址client_addr结构体。...六、实验结果 运行结果如下: 七、实验总结   在本次实验中,我们深入学习了如何在Linux环境下使用流式套接字(TCP套接字)来进行客户端-服务器通信。

    10310

    linux 进程抓包命令,linux抓包命令之tcpdump详解

    DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [-s snaplen ] [ -w file ] [ expression ] 抓包选项...注意,是最终要获取这么多个包。例如,指定”-c 10″将获取10个包,但可能已经处理了100个包,只不过只有10个包是满足条件的包。-i interface:指定tcpdump需要监听的接口。...-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。...其他功能性选项:-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于”-i”后。-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。...-w:将抓包数据输出到文件中而不是标准输出。可以同时配合”-G time”选项使得输出文件每time秒就自动切换到另一个文件。可通过”-r”选项载入这些文件以进行分析和打印。

    4.9K20

    linux如何抓包是什么,linux抓包命令是什么

    linux抓包命令是“tcpdump”,可以抓取流动在网卡上的数据包,可以将网络中传送的数据包的“头”完全截获下来提供分析;它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息...本教程操作环境:Red Hat Enterprise Linux 6.1系统、Dell G3电脑。 tcpdump命令是基于unix系统的命令行的数据报嗅探工具,可以抓取流动在网卡上的数据包。...-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。...其他功能性选项: -D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于”-i”后。 -F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。...-w:将抓包数据输出到文件中而不是标准输出。可以同时配合”-G time”选项使得输出文件每time秒就自动切换到另一个文件。可通过”-r”选项载入这些文件以进行分析和打印。

    10.7K20
    领券