从零开始云服务器网卡抓包

news2024/12/23 16:56:47

从零开始云服务器网卡抓包

  • 一. 服务器上新增自己的用户
  • 二. 添加组件libpcap
  • 四. 安装测试环境
  • 六. 编写demo代码
  • 七. 正式项目代码编译
  • 八. 结果展示

一. 服务器上新增自己的用户

我这边是ubuntu服务器,其默认username为ubuntu,使用创建服务器时候的密码通过ssh登录进来

  1. 新增用户
adduser lsy

在这里插入图片描述
2. 将用户lsy添加到root用户组
主要是需要在文件/etc/sudoers中加入用户信息

chmod 777 /etc/sudoers

编辑/etc/sudoers,插入下图内容,即可将用户加入root组
在这里插入图片描述

chmod 440 /etc/sudoers

二. 添加组件libpcap

wget http://www.tcpdump.org/release/libpcap-1.4.0.tar.gz
sudo apt install bison m4 flex libpcap-dev -y

cd ../libpcap-1.4.0
sudo ./configure 
sudo make
sudo make install

四. 安装测试环境

sudo apt install nginx

六. 编写demo代码

下例代码是测试代码,仅将访问日志打印出来

#include <pcap.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <iostream>
#include <cstring>

#define HTTP_PORT 80

using namespace std;
#define ETH_ADDR_LENGTH		6
struct ethhdr {
	unsigned char h_dst[ETH_ADDR_LENGTH];
	unsigned char h_src[ETH_ADDR_LENGTH];
	unsigned short h_proto;
	
}; // 14

struct ip_header {
    u_int8_t  	hdrlen : 4,
	    	ip_version : 4;          // 版本和首部长度
    u_int8_t  ip_tos;          // 服务类型
    u_int16_t ip_len;          // 总长度
    u_int16_t ip_id;           // 标识
    u_int16_t ip_off : 13,          // 片偏移
	      flag : 3;
    u_int8_t  ip_ttl;          // 存活时间
    u_int8_t  ip_p;            // 协议类型
    u_int16_t ip_sum;          // 校验和
    struct in_addr ip_src, ip_dst; // 源地址和目的地址
};

struct tcp_header {
    u_int16_t th_sport;        // 源端口号
    u_int16_t th_dport;        // 目的端口号
    u_int32_t th_seq;          // 序列号
    u_int32_t th_ack;          // 确认号
    u_int8_t  th_offx2;        // 数据偏移
    u_int8_t  th_flags;        // 控制标记
    u_int16_t th_win;          // 窗口大小
    u_int16_t th_sum;          // 校验和
    u_int16_t th_urp;          // 紧急指针
};

void parse_http_header(char *data, int data_len) {
    char *start = strstr(data, "GET");
    if (start == NULL) {
        start = strstr(data, "POST");
    }
    if (start == NULL) {
        // 不是 HTTP 请求,不处理
        return;
    }

    // 解析出 PATH
    char *end = strstr(start, " HTTP/1.");
    if (end == NULL) {
        // 不是 HTTP 请求,不处理
        return;
    }
    int path_len = end - start - 4;
    char path[1024];
    strncpy(path, start + 4, path_len);
    path[path_len] = '\0';
    printf("PATH: %s\n", path);
}

void handle_packet(u_char *user, const struct pcap_pkthdr *header, const u_char *pkt_data) {
    // 解析 IP 头部
    struct ethhdr *ethhdr_info = (struct ethhdr*) pkt_data;
    struct ip_header *ip_hdr = (struct ip_header *) (pkt_data + sizeof(struct ethhdr));
    if (ip_hdr->ip_p != IPPROTO_TCP) {
        // 不是 TCP 协议,不处理
/*	int i;
	for(i=0;i<32;i++)
	{
		printf("%02X ", pkt_data[i+sizeof(struct ethhdr)]);
	}
	*/
	//printf("\nherder:%x%x, ip_hdr->ip_p:%d\n",ip_hdr->ip_version, ip_hdr->hdrlen, ip_hdr->ip_p);
        return;
    }

    // 解析 TCP 头部
    struct tcp_header *tcp_hdr = (struct tcp_header *) (pkt_data + sizeof(struct ip_header) + sizeof(struct ethhdr));
    if (ntohs(tcp_hdr->th_dport) != HTTP_PORT) {
        // 不是 HTTP 请求,不处理
        return;
    }

    {
        int i;
        // printf("off:%d, ip_len:%d \n", tcp_hdr->th_offx2, ntohs(ip_hdr->ip_len));
        // for(i=0;i<ip_hdr->ip_len;i++)
        // {
        //     printf("%02X ", pkt_data[i+sizeof(struct ethhdr)]);
        // }
    }
    // printf("\n");
    
    int data_len = ntohs(ip_hdr->ip_len) - sizeof(struct ip_header) - tcp_hdr->th_offx2/4;
    if (data_len <= 1) {
        // 没有数据,不处理
        return;
    }

    // 打印源地址、目的地址和
    printf("\nSRC: %s:", inet_ntoa(ip_hdr->ip_src));
    {
    	int i;
	for(i=0;i<6;i++)
	{
		printf(" %02X", ethhdr_info->h_src[i]);
	}
    }
    printf("\nDST: %s:",  inet_ntoa(ip_hdr->ip_dst));
    {
    	int i;
	for(i=0;i<6;i++)
	{
		printf(" %02X", ethhdr_info->h_dst[i]);
	}
    }
    putchar('\n');
    // printf("SEQ: %u\n", ntohl(tcp_hdr->th_seq));
    

    // 解析 HTTP 头部
    char *data = (char *) (pkt_data + sizeof(struct ip_header) + sizeof(struct ethhdr) + tcp_hdr->th_offx2/4);
    printf("data:%s\n", data);
    // printf("ip_len:%d, ip_header:%ld, tcp_header:%ld, body_len:%ld\n", ntohs(ip_hdr->ip_len), sizeof(struct ip_header), sizeof(struct tcp_header), strlen(data));
    parse_http_header(data, data_len);
}

int main(int argc, char *argv[]) {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle = pcap_open_live(argv[1], BUFSIZ, 1, 1000, errbuf);
    if (handle == NULL) {
        cerr << "Error opening device: " << errbuf << endl;
        return -1;
    }

    if (pcap_datalink(handle) != DLT_EN10MB) {
        cerr << "Device not Ethernet" << endl;
        return -1;
    }

    struct bpf_program fp;
    char filter_exp[] = "dst port 80";
    // char filter_exp[] = "";
    if (pcap_compile(handle, &fp, filter_exp, 0, PCAP_NETMASK_UNKNOWN) == -1) {
        cerr << "Error compiling filter" << endl;
        return -1;
    }

    if (pcap_setfilter(handle, &fp) == -1) {
        cerr << "Error setting filter" << endl;
        return -1;
    }


    pcap_loop(handle, -1, handle_packet, NULL);

    pcap_freecode(&fp);
    pcap_close(handle);
    return 0;
}

七. 正式项目代码编译

  1. 下载必要工具
sudo apt install make cmake
  1. 下载项目源码
git clone https://gitee.com/lovejj77/http_grab.git
  1. 编译源码
cd http_grab
cd log4cpp
./configure
make
make install

cd http_grab
mkdir build
cd build
cmake ..
make
  1. 设置开机启动服务
vim /etc/rc.local
#在最后一行插入下述指令
/usr/local/sbin/http_grab eth0
#保存退出

八. 结果展示

注意:生产文件均位于/home/logs_file 目录下
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10.基于共享储能电站的工业用户日前优化经济调度(论文复现)

matlab代码&#xff1a;基于共享储能电站的工业用户日前优化经济调度 相关程序代码资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&a…

【云原生进阶之容器】第六章容器网络6.5.1--Calico网络方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

Spring Web容器响应异常排查_Poller线程异常退出

问题一_系统响应异常 问题现象 04-11 18点左右客户反馈系统很慢&#xff1b;18点多&#xff0c;反馈pda登录异常&#xff1b; 19:20左右&#xff0c;本地网页登录&#xff0c;某些请求超时&#xff1b;某些正常&#xff1b; 短时间定位后无头绪&#xff0c;保留了stack和dum…

球友的一个帖子,半夜三点给我整睡不着了……

文章目录 一、起因二、建议1、括号和缩进2、仔细审题3、独立思考4、早起的好办法5、chatgpt会代替人类吗&#xff1f; 三、解决1、数据结构2、初始化3、判定 一、起因 事情的起因源自于星球里面一位球友的帖子&#xff0c;本来三点醒来上完厕所打算继续睡&#xff0c;突然手机响…

无人机应急救援有保障吗?如何实现救援?

无人机应急救援有保障吗?如何实现救援?中国自然灾害种类较多&#xff0c;分布地域广&#xff0c;发生频率较高。当遭遇洪水、火灾、洪水、地震、暴雪等灾害事故时&#xff0c;常规的信息通信基础设施受到损伤&#xff0c;导致信号中断。如果灾害事故地点相对偏僻&#xff0c;…

淄博旅游“一夜爆火”,五一流量大盘已经开启

全民调休换来的五一小长假即将来临&#xff0c;经过几年“禁锢”后&#xff0c;这两年的旅游业开始回暖。 而今年国内旅游黑马竟指向了新人淄博。 山东淄博烧烤一直以来都“小有名气”&#xff0c;但是这只在周边城市&#xff0c;或者部分人群里传播&#xff0c;而在今年&…

来使用分支语句和循环语句实现一个小游戏吧(猜数字游戏)

猜数字游戏 1.代码展示2.菜单设计3.主函数部分3.随机数设计 1.代码展示 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h>void menu() {printf("************************\n");printf("*** 1.p…

移动端导航设计

根据产品层级的深度和广度&#xff0c;选择适合的导航模式&#xff0c;是产品设计中的关键一环。 任何APP的组织信息都需要以某种导航框架固定起来&#xff0c;一个新的产品合适的导航框架&#xff0c;决定了产品之后的延伸和扩展。 移动端的屏幕尺寸就这么大&#xff0c;操作方…

java定位系统源码,通过独特的射频处理,配合先进的位置算法,可以有效计算出复杂环境下的人员与物品的活动信息

智慧工厂人员定位系统源码&#xff0c;区域电子围栏管控源码 文末获取联系&#xff01; 在工厂日常生产活动中&#xff0c;企业很难精准地掌握访客和承包商等各类人员的实际位置&#xff0c;且无法实时监控巡检人员的巡检路线&#xff0c;当厂区发生灾情或其他异常状况时&#…

Layer组件多个iframe弹出层打开与关闭及参数传递

Layer官网地址&#xff1a;http://layer.layui.com/ 1、多个iframe弹出层&#xff08;非嵌套&#xff09; 1.打开iframe弹出层js代码 &#xff08;1&#xff09;示例一&#xff1a; content参数可传入要打开的页面&#xff0c;type参数传2&#xff0c;即可打开iframe类型的弹层…

STM32入门指南:了解STM32

1. 初识 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST 是意法半导体&#xff0c;M 是 Microelectronics 的缩写&#xff0c;32 表示 32 位&#xff0c;合起来理解&#xff0c;STM32 就是指 ST 公司开发的 32 位微控制器。在如今的 32 位控制器当中&#xff0c;STM32 …

GitHub新建仓库 上传文档

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 振&#xff0c;而飞破虚空 点击New repository 自定义仓库名称&#xff0c;并勾选 “Add a README file” 选项 复制Code链接 打开终端Git git cl…

夏驰和徐策带你从零开始学数据结构——哈希表

哈希表的概念&#xff1a; 哈希表是一种常用的数据结构&#xff0c;它可以在 O(1) 的时间复杂度内执行插入、查找和删除操作。哈希表的核心思想是使用哈希函数将键值对映射到数组中的一个位置上&#xff0c;从而实现快速的访问和修改。 哈希表由两个主要部分组成&#xff1a;…

Android开发—入门Kotlin编程语言

一、Kotlin简介 为什么Kotlin能代替Java此为Android官方第一支持的开发语言&#xff1f; 1&#xff09;Kotlin的语法更加简洁&#xff0c;对于同样的功能&#xff0c;使用Ktolin开发的代码量可能会比使用Java开发减少50%甚至更多&#xff1b; 2&#xff09;Kotlin语法更加高…

【Linux】文件IO---应用开发角度

目录简述 目录 前言&#xff1a; 一、Linux的文件 二、Linux文件系统目录结构 三、文件访问的方式 &#xff08;1&#xff09;通用方式&#xff1a;open/read/write/lseek/close 示例&#xff1a; &#xff08;2&#xff09;非通用函数&#xff1a;ioctl/mmap 示例&am…

使用ChatGPT+MindShow一键生成PPT,以后再也不用担心制作PPT啦

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

深度学习及使用全连接神经网络实现手写数字识别案例开发

1.什么是深度学习和机器学习有什么区别&#xff1f;是什么原因使得部分问题机器学习无法解决需要深入研究深度学习&#xff1f; 人工智能、机器学习、深度学习的区别是什么&#xff1f;_哔哩哔哩_bilibili 深度学习是一种机器学习方法&#xff0c;它通过构建多层神经网络来实…

tmall.product.template.get( 产品接口 )

&#xffe5;免费必须用户授权 产品模板获取接口&#xff0c;对于非关键属性的类目&#xff0c;发布达尔文(监管)产品时&#xff0c;必须先根据类目获取产品模板。 产品模板定义产品发布需要的类目属性&#xff0c;包括&#xff1a; 关键属性:关键属性可以在类目上不存在。不…

spring的应用 xml配置实现定时任务

定时任务的实现&#xff1a; 通过xml实现&#xff1a; 创建qiuckstart的maven文件 把依赖配置改改 jdk1.8 以及12 再删掉一些不必要的配置 引入spring依赖坐标 和java同一个目录下创建resources 作为 资源根 结构如图&#xff1a; spring.xml配置&#xff1a; 从官网复制…

《JavaEE》网络中的基本概念

&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;JavaEE 局域网/广域网 在我们的生活中 经常会使用到网络 对于网络 我们现在已经变得与生活息息相关 甚至可以说为密不可分 而在我们的网络中 我们的网络是分为局域网与广域网 我们的局域网和广域…