Linux——資料鏈路訪問

來源:互聯網
上載者:User

緬懷Stevens大師。

最好的參考資料:

1.師從互連網。

2.Linux man 命令:man   netlink,man rtnetlink。

3.UNP v1第29章 。

第一條:概述

原始套介面使得我們可以讀寫核心不處理的IP資料報,而對資料連結層訪問則把這種能力進一步擴大——讀寫任何類型的資料鏈路幀,而不僅僅是IP資料報。

訪問資料鏈路提供如下兩種能力:

1.監視由資料連結層接收的分組。

2.讓某些程式作為普通的應用進程而不是核心的一部分運行,這對於減小核心大小是非常有益的。

第二條:linux資料鏈路socket

建立資料鏈路socket需要root許可權!

可以使用兩種方法建立資料鏈路socket描述符

方法一:發送接收ip資料包:raw socket:參見上一篇文章。不再討論。

 

int sockfd=socket(AF_INET, SOCK_RAW, IPPROTO_XXX);

 

方法二:發送接收乙太網路資料幀有兩種方法:

新方法:int sockfd=socket(PF_PACKET,sock_type,eth_protocol);//引入了更多的過濾和效能特性。

sock_type參數的值:

SOCK_DGRAM:表示扣除鏈路層頭部的“煮熟”分組(cooked)。

SOCK_RAW:表示“未煮”的完整的鏈路層分組——乙太網路幀(raw)。

可以將這個套介面設定為混雜模式(promiscuous mode),如下:

 

 int sockfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP));

struct ifreq ifr;

struct packet_mreq mreq;

bzero(&ifr,sizeof(ifr));//初始化ifr

strcpy(ifr.ifr_name,"eth0");//這裡的“eth0”可以換成其他裝置的名字

if(ioctl(sockfd,SIOCGIFINDEX,&ifr)<0)//得到裝置對應的索引

{

 

perror("ioctl SIOCGIFINDEX:");            

}

mreq.mr_type=PACKET_MR_PROMISC;//混雜模式

mreq.mr_ifindex=ifr.ifr_ifindex;//設定套介面將要投入的混雜模式的裝置索引號

mreq.mr_alen=0;

mreq.mr_address[0]='/0';

if(setsockopt(sockfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)

{

   perror("setsockopt");

   exit(0);

 }

 

舊方法:int sockfd=socket(AF_INET,SOCK_PACKET,eth_protocol);//UNPv1中:這個方法可用面廣,但缺乏靈活性。只返回乙太網路幀。

 

同樣也可將舊方法建立socket投入到混雜模式:

 

int sockfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP));

struct ifreq ifr;

bzero(&ifr,sizeof(ifr));

strcpy(ifr.ifr_name,"eth0");

if(ioctl(sockfd,SIOCGIFFLAGS,&ifr)<0){

perror("ioctl SIOCGIFFLAGS:");

}

ifr.ifr_flags |=IFF_PROMISC;

if(ioctl(sockfd,SIOCSIFFLAGS,&ifr)<0){

perror("ioclt SIOCSIFFLAGS:");

}

 

 

eth_protocol參數的值如下,這個參數是用來告訴資料連結層把什麼類型的幀傳給鎖建立的socket:定義在linux/if_ether.h

#define ETH_P_ALL0x0003/* Every packet (be careful!!!) *///從資料鏈路接收所有幀

 

#define ETH_P_LOOP0x0060/* Ethernet Loopback packet*/

#define ETH_P_PUP0x0200/* Xerox PUP packet*/

#define ETH_P_PUPAT0x0201/* Xerox PUP Addr Trans packet*/

#define ETH_P_IP0x0800/* Internet Protocol packet*///只接收IPv4幀

第三條:關於Linux資料鏈路socket的核心緩衝、核心過濾、裝置過濾

依據UNPv1中的描述如下:

1.核心緩衝:新舊方法,都不提供核心緩衝。

2.核心過濾:舊方法不支援,新方法建立的socket可按如下方式,安裝過濾器:

/*Try and keep these values and structures similar to BSD, especially  the BPF code definitions which need to match so you can share filters  */

//這兩個結構定義在linux/filter.h

struct sock_filter {/* Filter block */

__u16code;   /* Actual filter code */

__u8jt;/* Jump true */

__u8jf;/* Jump false */

__u32k;      /* Generic multiuse field */

};

struct sock_fprog {/* Required for SO_ATTACH_FILTER. */

unsigned shortlen;/* Number of filter blocks */

struct sock_filter *filter;

};

struct sock_fprog Filter;

//////////////////////////////////

這裡對Filter初始化;

//////////////////////////////////

setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter));//安裝過濾器

setsockopt(sockfd, SOL_SOCKET, SO_DETACH_FILTER, NULL, 0);//卸載過濾器。若之前close了sockfd過濾器將自動卸載!!

關於這SO_ATTACH_FILTER、SO_DETACH_FILTER:man 7 socket中指出:

BUGS:

The  CONFIG_FILTER socket options SO_ATTACH_FILTER and SO_DETACH_FILTER are not documented.  The suggested interface to use  them  is  via  the  libpcap library。

3.裝置過濾:舊方法同樣不支援,新方法可以通過bind函數使socket關聯相關裝置:

   struct sockaddr_ll addr;//linux/if_packet.h

   bzero(&addr, sizeof(addr));

   addr.sll_family   = PF_PACKET;

   addr.sll_protocol = htons(ETH_P_ALL);

   addr.sll_ifindex  = ifr.ifr_ifindex;//此值擷取方法,見上面。

   if( bind(sockfd, (struct sockaddr*) &addr, sizeof(addr))<0)

                       perror("bind error:");

第四條:libpcap、libnet

libnet百度百科:http://baike.baidu.com/view/1520138.htm

libpcap百度百科:http://baike.baidu.com/view/1319961.htm

 

libnet/libnids庫函數介紹:http://blog.ccidnet.com/blog-htm-do-showone-uid-36931-itemid-138338-type-blog.html

 

linux下libnet編程:http://xdz2005.blog.163.com/blog/static/107873282010710112519755/

libpcap函數庫詳細介紹:http://dev.firnow.com/course/3_program/c++/cppjs/2008324/106112.html

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.