精华内容
下载资源
问答
  • //所在网络的掩码 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登录界面个性一些?可以通过修改/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 操作系统是为网络而诞生的操作系统,它为用户进行网络服务配置提供了诸多便利。接下来将对用户配置自己的网络服务进行简单的介绍,通过本篇博客内容的学习,用户可以配置简单的网络服务...

    自定义网络服务

      Linux 操作系统是为网络而诞生的操作系统,它为用户进行网络服务配置提供了诸多便利。接下来将对用户配置自己的网络服务进行简单的介绍,通过本篇博客内容的学习,用户可以配置简单的网络服务程序。

    1. xinetd/inetd

      在 Linux 操作系统中,一些小的服务程序或者不经常使用的服务程序,被集成到一个服务器管理程序中,通常是 inetd,目前一般使用 xinetdxinetdeXtended 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)rawseqpacket(可靠的有序数据报)
    protocol IP协议,通常是 TCP 或者 UDP
    wait yes/no,等同于 inetdwait/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
      █ 第 5disable 的意思是禁用,那么,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
    

    搞定!

    展开全文
  • 收发实现代码 ...使用回环网络lo,或者以太网都可以,然后使用wireshark抓包 其他类似参考: https://blog.csdn.net/ld11690/article/details/80360229 https://blog.csdn.net/dean_gdp/artic...
  • 1.Linux镜像文件配置 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 第12步 第13步 第14步 第15步 第16步 第17步 第18步 第19步 第20步 第21步 2.配置网络 2.
  • docker的bridge自定义网络与系统自带的网桥之间:只能是,系统自带的网桥对应的容器添加bridge自定义网络对应的容器的网卡。而反过来会报错 。 但是docker的系统自带的网桥之间:是可以通信的,因为是在一个网络...
  • 三.docker自定义网络 bridge Macvlan 四、docker容器间的通信 1.使用名称 2.container模式 3.link模式 4.docker容器访问外部网络 5.外部网络访问容器 五、跨主机的容器网络 macvlan网络方案的实现 一、...
  • 自定义网络3.1 自定义示例13.2 自定义子网、网关3.3 不同网桥之间通信 1. Docker网络基本命令 docker network ls#查看网络 docker network inspect 网络#查看网络内部信息 docker network create 网络#新建网络 ...
  • 于需要用伪造的ip地址, 所以需要自定义ip头, 这需要对套接字属性进行设置: int opt = 1; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt));   2. 为了更方便的填充ip报文头及tcp报文头, ...
  • 配置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...
  • 选择通过NFS共享方式完成软件分发本地源配置,pxe网络安装linuxmint16 1、安装nfs-kernel-server,tftpd-hpa,dhcp3-server apt-get install dhcp3-server nfs-kernel-server tftpd-hpa 2、新建文件夹/home/testom/...
  • 在CentOS6系列版本系统在安装完成后会自动生成一个install.log文件,然后在CentOS7系列版本中就变化为anaconda-ks.cfg文件,它可以作为类似于Windows自动化安装的应答文件,只不过此处是用于Linux系统自动化安装的...
  • Docker 网络 进入自己写的tomcat docker exec -it mytomcat /bin/bash ip addr 查看容器网络地址,会发现容器的到一个eth0@if53的ip地址,是docker 分配的 linux 虚拟机上ping tomcat容器 ping 172.17.0.3 ...
  • 毕设是做一个网络方面的项目,需要自己写netfilter模块,今天研究了一下午怎么往Linux内核上加载自定义模块,遇到了很多问题,记录一下心得。简单起见,以一个HelloWorld模块为例来说。内核是3.10版本的。 1.编写...
  • dokcer原生网络 ...docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。 # ip addr show docker0 bridge模式下容器没有一个公有ip,只有宿主机可...
  • 文章目录Docker 网络详解一、理解Docker0二、evth-pair技术三、- - link四、自定义网络五、网络连通 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1og4y1q7M4?p=37 Docker 网络详解 一、理解Docker0...
  • 1.显示当前系统的时间和日期时区信息: 查看状态 # 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网络1.Docker原生网络bridge模式host网络模式none模式2.Docker自定义网络 1.Docker原生网络 docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。 docker安装后会自动创建3种网络:bridge、host、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,587
精华内容 634
关键字:

linux自定义网络

linux 订阅