-
linux c自定义网络层协议收发包
2019-04-17 16:16:17//所在网络的掩码 bpf_u_int32 net; // 主机的IP地址 struct bpf_program filter; //已经编译好的过滤器 char filter_app[] = "ether[12:2] == 0x8625"; //BPF过滤规则,和tcpdump使用的是同一种过滤规则 ...本文使用rawsocket收发包,也提供使用libpcap和libnet来收发包的代码。
经过测试发现,libpcap的收包能力比rawsocket强。
发送方发出10000个数据链路层帧,使用rawsocket大概能收到2000~3000多个,而使用libpcap抓包能收到5000多个。这大概是因为libpcap为抓取的包提供了个内核空间中的缓存队列。
send.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <sys/socket.h> #include <linux/if_packet.h> #include <net/if.h> #include <errno.h> #define ETH_P_NDN 0x8625 int main (int argc, char **argv) { int sockfd = socket(AF_PACKET , SOCK_RAW, htons(ETH_P_NDN)) ; struct sockaddr_ll myaddr ; myaddr.sll_family = AF_PACKET ; myaddr.sll_ifindex = if_nametoindex("vmnet2") ; myaddr.sll_halen = htons(6) ; uint8_t macDstAddr[6] ; macDstAddr[0] = 0x00 ; macDstAddr[1] = 0x0c ; macDstAddr[2] = 0x29 ; macDstAddr[3] = 0xcd ; macDstAddr[4] = 0x3e ; macDstAddr[5] = 0xc2 ; memcpy(myaddr.sll_addr, macDstAddr , 6) ; bind(sockfd, (struct sockaddr*)&myaddr , sizeof(myaddr)) ; int dataLen = 5 ; char data[10] ; memcpy(data,"hello",5) ; int frameLen = 6+6+2+dataLen ; uint8_t frame[3000] ; memcpy(frame , macDstAddr,6) ; memset(frame+6 , 0xff , 6) ; *((uint16_t*)(frame+12)) = htons(ETH_P_NDN) ; int writeLen = write(sockfd,frame,frameLen) ; close(sockfd) ; return 0; }
recv.c
/** * recv.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> // memset,memcpy #include <netinet/ip.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <net/if.h> //struct ifreq #include <linux/if_ether.h> #include <linux/if_packet.h> // struct sockaddr_ll #define ETH_P_NP 0x8625 #define IFRNAME0 "eth0" #define IFRNAME2 "vmnet1" unsigned char dest_mac[6] = {0}; int main(int argc,char **argv) { int datalen; int sd ; unsigned char data[IP_MAXPACKET] = {0}; unsigned char *buf = NULL; struct sockaddr_ll device; socklen_t sll_len = sizeof(struct sockaddr_ll); if((sd = socket (PF_PACKET,SOCK_RAW,htons(ETH_P_NP))) < 0) { perror("socket() failed"); exit(EXIT_FAILURE); } int recv_count = 0 ; while(1){ datalen = recvfrom(sd,data,1024,0,(struct sockaddr *)&device,&sll_len); if (datalen < 0) { printf("error\n"); exit(-1); } buf = data + 14; printf("%d ip data : %s : %x:%x\n",recv_count ++ ,buf,device.sll_addr[4],device.sll_addr[5]); // 对端的MAC地址 printf("the opposite mac = %x:%x:%x:%x:%x:%x\n", \ device.sll_addr[0],\ device.sll_addr[1],\ device.sll_addr[2],\ device.sll_addr[3],\ device.sll_addr[4],\ device.sll_addr[5]\ ); // 从本机的哪个接口流入的 printf("recv from interface id = %d \n",device.sll_ifindex) ; break ; } return 0; }
解决不知道以太网帧从哪个接口流入的问题。
===============================================================================================
当然也可以使用libpcap库来抓包:
#include <stdio.h> #include <string.h> #include <pcap.h> void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header,\ const u_char *pkt_data) { printf("get packet\n") ; pcap_dump(user, pkt_header, pkt_data);// 输出数据到文件 printf("Jacked a packet with length of [%d]\n", pkt_header->len); // 打印抓到的包的长度 } int main(int argc,char *argv[]) { pcap_t *handle; char errbuf[PCAP_ERRBUF_SIZE]; // 存储错误信息的字符串 bpf_u_int32 mask; //所在网络的掩码 bpf_u_int32 net; // 主机的IP地址 struct bpf_program filter; //已经编译好的过滤器 char filter_app[] = "ether[12:2] == 0x8625"; //BPF过滤规则,和tcpdump使用的是同一种过滤规则 char *dev; dev = pcap_lookupdev(errbuf); //返回第一个合法的设备,我这里是eth0 printf("capture at device : %s\n",dev) ; pcap_lookupnet(dev, &net, &mask, errbuf); handle = pcap_open_live(dev, BUFSIZ, 0, 0, errbuf); // 第一个参数为网卡名称 // 第二个参数为定义抓取包的最大长度 // 第三个参数为网卡模式: 0 表示非混杂模式,其他值表示混杂模式 /* 编译并应用过滤器 */ pcap_compile(handle, &filter, filter_app, 0, net); pcap_setfilter(handle, &filter); /* 定义输出文件 */ pcap_dumper_t* out_pcap; out_pcap = pcap_dump_open(handle,"./pack.pcap"); /* 截获30个包 */ pcap_loop(handle,30,packet_handler,(u_char *)out_pcap); /* 刷新缓冲区 */ pcap_dump_flush(out_pcap); /* 关闭资源 */ pcap_close(handle); pcap_dump_close(out_pcap); return(0); }
编译 : gcc pcap.c -lpcap
-
Linux 自定义登录提示信息
2020-07-20 01:02:35想不想你的Linux登录界面个性一些?可以通过修改/etc/motd文件或/etc/issue文件的方式实现。/etc/issue文件的使用方法与/etc/motd文件相差不大,它们主要区别在于:当一个网络用户或通过串口登录系统上时,/etc/...想不想你的Linux登录界面个性一些?可以通过修改/etc/motd文件或/etc/issue文件的方式实现。/etc/issue文件的使用方法与/etc/motd文件相差不大,它们主要区别在于:当一个网络用户或通过串口登录系统上时,/etc/issue的文件内容显示在login提示符之前的,而/etc/motd内容显示在用户成功登录系统之后的。
可以通过修改/etc/issue文件或者修改/etc/motd文件的方式,二者选择其一即可,大家可以根据实际情况自行选择。一般对于网站运维人员来说,可以自定义图案,标注运维人员姓名、联系方式、服务器运行情况、登录欢迎词等内容。
方法一、修改/etc/issue
1、修改/etc/issue文件
vi etc/issue
2、输入自定义内容
へ /| /\7 ∠_/ / │ / / │ Z _,< / / ` │ ヽ / 〉 Y ` / / ● ● 〈 / () へ | \〈 > _ ィ │ // / へ / < | \\ ヽ_ (_/ │// 7 |/ >―r ̄ ̄ ―_/
3、:wq保存,重新连接Linux就可以看到了。
方法二、修改/etc/motd
1、修改/etc/motd文件
vi /etc/motd
输入自定义内容:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + + + + + 运维负责人:XXXXXXX + + 联系电话:1234567 + + + + + + + + + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、:wq保存,然后重新连接Linux就可以看到了。
-
自学 Linux 22—Linux 应用层网络服务程序简介—自定义网络服务
2020-05-05 00:10:09自定义网络服务 Linux 操作系统是为网络而诞生的操作系统,它为用户进行网络服务配置提供了诸多便利。接下来将对用户配置自己的网络服务进行简单的介绍,通过本篇博客内容的学习,用户可以配置简单的网络服务...自定义网络服务
Linux 操作系统是为网络而诞生的操作系统,它为用户进行网络服务配置提供了诸多便利。接下来将对用户配置自己的网络服务进行简单的介绍,通过本篇博客内容的学习,用户可以配置简单的网络服务程序。
1. xinetd/inetd
在 Linux 操作系统中,一些小的服务程序或者不经常使用的服务程序,被集成到一个服务器管理程序中,通常是 inetd,目前一般使用 xinetd。xinetd(eXtended InterNET services daemon),也叫做扩展因特网驻留程序。它是一种控制因特网服务的应用程序,例如常用的 TELNET 服务、FTP 服务和 POP 等服务程序通常都集成在这个服务器中。
在往后看之前,小伙伴先检査一下系统中是否已经安装了 xinetd 服务程序,可以使用如下命令:
$ ps ax|grep xinetd
如果没存安装 xinetd 服务程序,可以使用 apt-get install xinetd 安装这个软件包。
2. xinetd 服务配置
xinetd 的默认配置文件是 /etc/xinetd.conf,查看这个配置文件的内容会发现,它将 /etc/xinetd.d 目录里的文件包含了进来。
includedir /etc/xinetd.d
在 /etc/xinet.d 目录中有很多默认的配置文件,查看其中的 time 服务配置文件。
$ cat /etc/xinetd.d/time #査看 time 服务配置文件 # default: off #释默认值为打开 # description: An RFC 868 time server. This protocol provides a #描述信息 # site-independent, machine readable date and time. The Time service sends back # to the originating source the time in seconds since midnight on January first # 1900. # This is the tcp version. #时间服务的 TCP 版本 service time #服务程序名称 { disable = yes #默认为服务关闭 type = INTERNAL #类型为内部程序 id = time-stream #标识为 time-stream socket_type = stream #流式套接字 protocol = tcp #协议为 TCP user = root #root 用户启动 wait = no #不等待到启动完成 } # This is the udp version. #时间服务的 UDP 版本 service time #服务程序名称 { disable = yes #默认为服务关闭 type = INTERNAL #类型为内部程序 id = time-dgram #标识为 time-dgram socket_type = dgram #数据报套接字 protocol = udp #协议为 UDP user = root #root 用户启动 wait = yes #不等待到启动完成 }
服务 time 是一个时间服务,用于向客户端提供网络时间校准。对于一个服务 xinetd 的描述类型,按照如下格式进行定义:
service 服务名称 { 选项 = 值 选项 += 值 }
其中的 service 是必需的关键字,“ 服务名称 ” 要描述的服务名字,之后的属性表用大括号括起,其中的每一项都定义了由 service-name 定义的服务。服务名称是任意的,通常是标准网络服务名,也可增加其他非标准的服务。选项的操作符可以是 =、+=、或 -=。所有属性可以使用 =,其作用是分配一个或多个值,某些属性可以使用 “ += ” 或的形式,它的作用是将其值增加到某个表中,或将其值从某个表中删除。xinetd 的指示符如下表(xinetd 的指示符)所示。
指示符 描述 socket_type 网络套接字类型,流或者数据包,值可能为 stream(TCP),dgram(UDP),raw 和 seqpacket(可靠的有序数据报) protocol IP协议,通常是 TCP 或者 UDP wait yes/no,等同于 inetd 的 wait/nowait user 运行进程的用户 ID server 要激活的进程,必须指定执行程序的完整路径 server_args 传递给 server 的变量,或者是值 instances 可以启动的实例的最大值 start max_load 负载均衡 log_on_success 成功启动的登记选项 log_on_failure 联机失败的时候的日志信息 only_from 接受的网络或是主机 no_access 拒绝访问的网络或是主机 disabled 用在默认的 { } 中禁止服务 log_type 日志的类型和路径 FILE/SYSLOG nice 运行服务的优先级 id 日志中使用的服务名 3. 自定义网络服务
此次以 vsftpd 为例进行自定义网络服务的设置。首先安装 vsftpd 服务器程序,使用命令 apt-get install vsftpd 进行安装。
现在应该以 root 的身份在 /etc/xinetd.d/目录中编辑文本文件 proftpd,内容如下:
# default: on 默认值为打开 # description: The vsftpd server vsftpd sessions; # 这是一个 vsftpd 服务器设置文件 service vsftpd #服务程序名称 { disable = no #默认为服务打开 port = 21 #侦听端口为 21 socket_type = stream #流式套接字 protocol = tcp #协议为 TCP user = root # root 用户启动 server = /usr/sbin/vsftpd #服务程序路径为 /usr/sbin/vsftpd type = UNLISTED wait = no #不等待到启动完成 }
上述配置的含义如下所述。
█ 第 1 和第 2 行是注释行,不用管它。第 3 行是定义服务的名称为 vsftpd。
█ 第 5 行 disable 的意思是禁用,那么,disable=no 就是启动。
█ 第 6 行是指定该服务的端口,ftp 的端口是 21。如果不用 21 端口,可以根据 vsftpd.conf 文件做相应的改变。
█ 第 7 行是 socket 的类型,这里设为 stream (流)。
█ 第 8 行是指定协议,这里设为 tcp 协议。
█ 第 9 行是启动该服务的用户,设为 root。
█ 第 10 行是指定运行文件的路径。
█ 第 12 行是不等待至启动完成。在编写完毕配置文件后,运行 killall -HUP xinetd。然后使用 ftp localhost 登录进行测试,可以发现 FTP 程序已经可以登录了。
小结
HTTP 协议、FTP 协议和 TELNET 协议是互联网比较常用的协议,分别用于 Web 访问、 文件传输和远程主机的登录。这 3 种协议都是基于 TCP 协议,利用文本命令进行控制。
NFS 协议是 Linux 上经常使用的一种协议,用于主机之间共享文件。由于 NFS 协议采用 UDP 协议作为传输基础,所以速度上要快得多。NFS 协议在嵌入式设备开发的时候经常使用。
-
Linux 自定义网桥配置静态 IP
2019-05-29 17:31:21准备工作,先安装一些基本工具: yum -y update yum install -y vim wget curl ... 修改配置文件配置网络(注意:ifcfg-enp0s3是运行ip a查询到的网卡名称) vim /etc/sysconfig/network-scripts/ifcfg-...准备工作,先安装一些基本工具:
yum -y update yum install -y vim wget curl net-tools bridge-utils bind-utils traceroute mtr telnet
修改配置文件配置网络(注意:ifcfg-enp0s3是运行ip a查询到的网卡名称)
vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
进行以下两处修改
BRIDGE="xxx-bridge" BOOTPROTO="none"
修改保存后,创建网桥配置文件(注意:ifcfg-xxx-bridge 是之前配置 BRIDGE 参数的名称)
vim /etc/sysconfig/network-scripts/ifcfg-xxx-bridge
并添加如下代码(注意,IPADDR 是自己设置的静态 ip )
TYPE=Bridge BOOTPROTO=static IPADDR=192.168.1.214 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 PREFIX=24 DNS1=192.168.1.1 NAME=xxx-bridge ONBOOT=yes DEVICE=xxx-bridge
保存退出,运行
systemctl restart network
重新用设置的新ip连接服务器,运行查看
brctl show
搞定!
-
Linux下实现自定义网络层协议收发包
2019-07-30 15:28:32收发实现代码 ...使用回环网络lo,或者以太网都可以,然后使用wireshark抓包 其他类似参考: https://blog.csdn.net/ld11690/article/details/80360229 https://blog.csdn.net/dean_gdp/artic... -
Linux自定义镜像文件安装配置(超详细版本)1.0
2020-05-18 20:41:181.Linux镜像文件配置 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 第12步 第13步 第14步 第15步 第16步 第17步 第18步 第19步 第20步 第21步 2.配置网络 2. -
Linux下的docker的自定义网络(三)
2019-03-26 17:25:41docker的bridge自定义网络与系统自带的网桥之间:只能是,系统自带的网桥对应的容器添加bridge自定义网络对应的容器的网卡。而反过来会报错 。 但是docker的系统自带的网桥之间:是可以通信的,因为是在一个网络... -
Linux企业实战-----docker网络(原生网络、自定义网络、容器间的通信、跨主机通信)
2020-09-10 15:30:45三.docker自定义网络 bridge Macvlan 四、docker容器间的通信 1.使用名称 2.container模式 3.link模式 4.docker容器访问外部网络 5.外部网络访问容器 五、跨主机的容器网络 macvlan网络方案的实现 一、... -
【Linux38-4】Docker网络通信模式(host、bridge、none)、自定义网络、不同网桥之间connect通信
2021-01-26 01:38:10自定义网络3.1 自定义示例13.2 自定义子网、网关3.3 不同网桥之间通信 1. Docker网络基本命令 docker network ls#查看网络 docker network inspect 网络#查看网络内部信息 docker network create 网络#新建网络 ... -
linux 高级网络编程之自定义ip报文头 Dos
2016-11-05 19:15:18于需要用伪造的ip地址, 所以需要自定义ip头, 这需要对套接字属性进行设置: int opt = 1; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)); 2. 为了更方便的填充ip报文头及tcp报文头, ... -
Linux虚拟机将ip改为自定义模式网络
2018-09-11 14:39:00配置linux的ip地址:vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO="dhcp"改为:BOOTPROTO="static" IPADDR=192.168.255.3 NERMASK=255.255.255.0 GATEWAY=192.168.255.1 NDS1=1... -
pxe网络引导安装linux_mint自定义镜像环境
2014-02-25 16:48:25选择通过NFS共享方式完成软件分发本地源配置,pxe网络安装linuxmint16 1、安装nfs-kernel-server,tftpd-hpa,dhcp3-server apt-get install dhcp3-server nfs-kernel-server tftpd-hpa 2、新建文件夹/home/testom/... -
Linux系统自定义制作ISO安装镜像
2021-01-14 14:41:52在CentOS6系列版本系统在安装完成后会自动生成一个install.log文件,然后在CentOS7系列版本中就变化为anaconda-ks.cfg文件,它可以作为类似于Windows自动化安装的应答文件,只不过此处是用于Linux系统自动化安装的... -
Docker 容器间通信 / 自定义网络 / 网络连通
2020-09-16 22:23:01Docker 网络 进入自己写的tomcat docker exec -it mytomcat /bin/bash ip addr 查看容器网络地址,会发现容器的到一个eth0@if53的ip地址,是docker 分配的 linux 虚拟机上ping tomcat容器 ping 172.17.0.3 ... -
Linux内核动态加载自定义模块
2019-12-24 00:01:16毕设是做一个网络方面的项目,需要自己写netfilter模块,今天研究了一下午怎么往Linux内核上加载自定义模块,遇到了很多问题,记录一下心得。简单起见,以一个HelloWorld模块为例来说。内核是3.10版本的。 1.编写... -
Docker原生网络,自定义网络,容器间通信
2019-08-21 10:33:33dokcer原生网络 ...docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。 # ip addr show docker0 bridge模式下容器没有一个公有ip,只有宿主机可... -
Docker网络详解(docker0/使用服务名访问通信/自定义网络)
2020-10-14 21:49:55文章目录Docker 网络详解一、理解Docker0二、evth-pair技术三、- - link四、自定义网络五、网络连通 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1og4y1q7M4?p=37 Docker 网络详解 一、理解Docker0... -
Linux 下修改时间(自定义时间和恢复网络时间)
2020-02-27 14:45:011.显示当前系统的时间和日期时区信息: 查看状态 # timedatectl status Local time: Sun 2018-08-26 04:01:12 CST Universal time: Sat 2018-08-25 20:01:12 UTC RTC time: Sun 2018-08-26 04:01:06 ... -
Docker网络(docker原生网络Bridge,host,none,及自定义网络,)及docker容器通信及跨主机容器网络
2021-01-29 20:23:18Docker网络1.Docker原生网络bridge模式host网络模式none模式2.Docker自定义网络 1.Docker原生网络 docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。 docker安装后会自动创建3种网络:bridge、host、...
-
php 二进制安装
-
lesson_201128:28个小组以git开头-源码
-
Dynamic steering beams for efficient force measurement in optical manipulation
-
NFS 网络文件系统
-
Docker从入门到精通
-
php 浅谈相对路径与绝对路径(../ ./ / )
-
TCU换档策略汇总.docx
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
方法加@Transactional(propagation = Propagation.REQUIRES_NEW)依旧回滚
-
弄皱的球-源码
-
基于语音声学和反向发音信号融合的说话人验证
-
Samba 服务配置与管理
-
C++11 14 17 20 多线程从原理到线程池实战
-
A new track inspection car based on a laser camera system
-
PAT甲级-排序类型-1062 Talent and Virtue解题思路
-
VB获取窗体的位置和大小
-
uniapp怎么发起请求
-
All-fiber, high power single-frequency linearly polarized ytterbium-doped fiber amplifier
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
整车控制器烧写上位机.zip