亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? l7-queue.cpp

?? linux下的l7源代碼
?? CPP
字號:
/*  The l7-queue class handles libnetfilter-queue events and passes   packets to their appropriate conntack for classification.     By Ethan Sommer <sommere@users.sf.net> and Matthew Strait   <quadong@users.sf.net>, 2006-2007  http://l7-filter.sf.net   This program is free software; you can redistribute it and/or  modify it under the terms of the GNU General Public License  as published by the Free Software Foundation; either version  2 of the License, or (at your option) any later version.  http://www.gnu.org/licenses/gpl.txt  Based on nfqnl_test.c from libnetfilter-queue 0.0.12  If you get error messages about running out of buffer space, increase it   with something like:  echo 524280 > /proc/sys/net/core/rmem_default  echo 524280 > /proc/sys/net/core/rmem_max  echo 524280 > /proc/sys/net/core/wmem_default  echo 524280 > /proc/sys/net/core/wmem_max*/using namespace std;#include <pthread.h>#include <iostream>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <signal.h>#include <map>#include <netinet/in.h>#include "l7-conntrack.h"#include "l7-queue.h"#include "util.h"// Probably shouldn't really be global, but it's SO much easierint maxpackets = 10; // by default.int clobbermark = 0;extern unsigned int markmask;extern unsigned int maskfirstbit;extern "C" {#include <linux/netfilter.h>#include <libnetfilter_queue/libnetfilter_queue.h>}l7_queue::l7_queue(l7_conntrack *connection_tracker) {  l7_connection_tracker = connection_tracker;}l7_queue::~l7_queue() {}void l7_queue::start(int queuenum) {  struct nfq_handle *h;  struct nfq_q_handle *qh;  struct nfnl_handle *nh;  int fd;  int rv;  char buf[4096];  l7printf(3, "opening library handle\n");  h = nfq_open();  if(!h) {    cerr << "error during nfq_open()\n";    exit(1);  }  l7printf(3, "unbinding existing nf_queue handler for AF_INET (if any)\n");  if(nfq_unbind_pf(h, AF_INET) < 0) {    cerr << "error during nfq_unbind_pf()\n";    exit(1);  }  l7printf(3, "binding nfnetlink_queue as nf_queue handler for AF_INET\n");  if(nfq_bind_pf(h, AF_INET) < 0) {    cerr << "error during nfq_bind_pf()\n";    exit(1);  }  l7printf(3, "binding this socket to queue '0'\n");  qh = nfq_create_queue(h, queuenum, &l7_queue_cb, this);  if(!qh) {    cerr << "error during nfq_create_queue()\n";    exit(1);  }  l7printf(3, "setting copy_packet mode\n");  if(nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {    cerr << "can't set packet_copy mode\n";    exit(1);  }  nh = nfq_nfnlh(h);  fd = nfnl_fd(nh);  // this is the main loop  while (true){    while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0)      nfq_handle_packet(h, buf, rv);        cerr << "Error: recv() returned negative value." << endl;    cerr << "rv=" << rv << endl;    cerr << "errno=" << errno << endl;    cerr << "errstr=" << strerror(errno) << endl << endl;  }  l7printf(3, "unbinding from queue 0\n");  nfq_destroy_queue(qh);  l7printf(3, "closing library handle\n");  nfq_close(h);  exit(0);}u_int32_t l7_queue::handle_packet(nfq_data * tb, struct nfq_q_handle *qh) {  int id = 0, ret, dataoffset, datalen;  u_int32_t wholemark, mark, ifi;   struct nfqnl_msg_packet_hdr *ph;  char * data;  l7_connection * connection;  ph = nfq_get_msg_packet_hdr(tb);  if(ph){    id = ntohl(ph->packet_id);    l7printf(4, "hw_protocol = 0x%04x hook = %u id = %u ",       ntohs(ph->hw_protocol), ph->hook, id);  }  // Need to get the wholemark so that we can pass the unmasked part back  // Except for the print statement and debugging, there's not really any  // reason to pull out the masked part, because it's always modified without  // looking at it...  wholemark = (nfq_get_nfmark(tb));  if(clobbermark){     mark = UNTOUCHED;     wholemark = wholemark&(~markmask); // zero out our part of the mark  }  else mark = ((wholemark&markmask) >> maskfirstbit);  l7printf(4, "wholemark = %#08x ", wholemark);  l7printf(4, "mark = %d ", mark);  ifi = nfq_get_indev(tb);  if(ifi) l7printf(4, "indev = %d ", ifi);  ifi = nfq_get_outdev(tb);  if(ifi) l7printf(4, "outdev = %d ", ifi);  ret = nfq_get_payload(tb, &data);  if(ret >= 0) l7printf(4, "payload_len = %d\n", ret);    char ip_protocol = data[9];  // Ignore anything that's not TCP or UDP  if(ip_protocol != IPPROTO_TCP && ip_protocol != IPPROTO_UDP)    return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);  dataoffset = app_data_offset((const unsigned char*)data);  datalen = ret - dataoffset;  //find the conntrack   string key = get_conntrack_key((const unsigned char*)data, false);  connection = l7_connection_tracker->get_l7_connection(key);    if(connection)    l7printf(3, "Found connection orig:\t%s\n", key.c_str());  if(!connection){    //find the conntrack (backwards)    string key = get_conntrack_key((const unsigned char*)data, true);    connection = l7_connection_tracker->get_l7_connection(key);      if(connection)      l7printf(3, "Found connection reply:\t%s\n", key.c_str());      // It seems to routinely not get the UDP conntrack until the 2nd or 3rd    // packet.  Tested with DNS.    if(!connection)      l7printf(2, "Got packet, had no ct:\t%s\n", key.c_str());  }  // mark = the mark we found on the packet  // connection->get_mark() = the mark that we have made internally  if(connection){    connection->increment_num_packets();      if(datalen <= 0){      l7printf(3, "Connection with no new application data ignored.\n");      mark = NO_MATCH_YET; // no application data    }    else{      if(connection->get_mark() != NO_MATCH_YET &&          connection->get_mark() != UNTOUCHED){        // It is classified already.  Reapply existing mark.        mark = connection->get_mark();      }      else if(connection->get_num_packets() <= maxpackets){        // Do the heavy lifting.        connection->append_to_buffer((char*)(data+dataoffset),ret-dataoffset);         l7printf(3, "Packet #%d, data is: %s\n", connection->get_num_packets(),                 friendly_print((unsigned char *)connection->buffer,                                connection->lengthsofar).c_str());                  mark = connection->classify();        if(mark != NO_MATCH_YET){ // Got a match, no need to keep data          free(connection->buffer);          connection->buffer = NULL; // marks it not to be free'd again        }      }      else{ // num_packets > maxpackets and hasn't been classified        mark = NO_MATCH;        // if this is the first packet after we've given up, clean up        if(connection->get_num_packets() == maxpackets+1){          print_give_up(key, (unsigned char *)connection->buffer,                         connection->lengthsofar);                  free(connection->buffer);          connection->buffer = NULL; // marks it not to be free'd again        } // endif should clean up      } // endif whether should run match or what    } // endif there is any new data  } // endif we found the connection  else{    l7printf(3, "Didn't yet find\t%s\n", key.c_str());    mark = NO_MATCH_YET;  }  if(mark == UNTOUCHED) cerr << "NOT REACHED. mark is still UNTOUCHED.\n";  l7printf(4, "Set verdict: ACCEPT %#08x\n", (mark<<maskfirstbit)|wholemark);  return nfq_set_verdict_mark(qh, id, NF_ACCEPT,                               htonl((mark<<maskfirstbit)|wholemark), 0, NULL);}// Returns a string that uniquely defines the connectionstring l7_queue::get_conntrack_key(const unsigned char *data, bool reverse) {  char * buf = (char *)malloc(256);  int ip_hl = 4*(data[0] & 0x0f);  char ip_protocol = data[9];  if(ip_protocol == IPPROTO_TCP){    if(reverse){      snprintf(buf, 255,               "tcp      6 src=%d.%d.%d.%d dst=%d.%d.%d.%d sport=%d dport=%d",	      data[12], data[13], data[14], data[15],	      data[16], data[17], data[18], data[19],	      data[ip_hl]*256+data[ip_hl+1], data[ip_hl+2]*256+data[ip_hl+3]);    }    else{      snprintf(buf, 255,               "tcp      6 src=%d.%d.%d.%d dst=%d.%d.%d.%d sport=%d dport=%d",	      data[16], data[17], data[18], data[19],	      data[12], data[13], data[14], data[15],	      data[ip_hl+2]*256+data[ip_hl+3], data[ip_hl]*256+data[ip_hl+1]);    }  }  else if(ip_protocol == IPPROTO_UDP){    if(reverse){      snprintf(buf, 255,               "udp      17 src=%d.%d.%d.%d dst=%d.%d.%d.%d sport=%d dport=%d",	      data[12], data[13], data[14], data[15],	      data[16], data[17], data[18], data[19],	      data[ip_hl]*256+data[ip_hl+1], data[ip_hl+2]*256+data[ip_hl+3]);    }    else{      snprintf(buf, 255,               "udp      17 src=%d.%d.%d.%d dst=%d.%d.%d.%d sport=%d dport=%d",	      data[16], data[17], data[18], data[19],	      data[12], data[13], data[14], data[15],	      data[ip_hl+2]*256+data[ip_hl+3], data[ip_hl]*256+data[ip_hl+1]);    }  }  else{    l7printf(0, "Tried to get conntrack key for unsupported protocol!\n");    buf[0] = '\0';  }  string answer = buf;  free(buf);  l7printf(3, "Made key from packet:\t%s\n", answer.c_str());  return answer;}/* Returns offset the into the skb->data that the application data starts */int l7_queue::app_data_offset(const unsigned char *data){  int ip_hl = 4*(data[0] & 0x0f);  char ip_protocol = data[9];  if(ip_protocol == IPPROTO_TCP){    // 12 == offset into TCP header for the header length field.    int tcp_hl = 4*(data[ip_hl + 12]>>4);    return ip_hl + tcp_hl;  }  else if(ip_protocol == IPPROTO_UDP){    return ip_hl + 8; /* UDP header is always 8 bytes */  }  else{      l7printf(0, "Tried to get app data offset for unsupported protocol!\n");      return ip_hl + 8; /* something reasonable */  }}static int l7_queue_cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,		       struct nfq_data *nfa, void *data) {  struct nfqnl_msg_packet_hdr *ph;  u_int32_t id = 0;  ph = nfq_get_msg_packet_hdr(nfa);  if(ph)    id = ntohl(ph->packet_id);    u_int32_t wholemark = nfq_get_nfmark(nfa);  // If it already has a mark (and we don't want to clobber it),   // just pass it back with the same mark  if((wholemark<<maskfirstbit)&markmask != UNTOUCHED && !clobbermark){    static unsigned int naaltered = 0;    naaltered++;    if((naaltered^(naaltered-1)) == (2*naaltered-1)) // is it a power of 2?      cerr << "My part of the mark has already been altered, ignoring these "              "packets!\n(" << naaltered << " ignored so far.) "              "Fix your rules or use l7-filter -c.\n";    return nfq_set_verdict_mark(qh, id, NF_ACCEPT, htonl(wholemark), 0, NULL);  }  return ((l7_queue *)data)->handle_packet(nfa, qh);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产在天天线2019| 久久av老司机精品网站导航| 欧美韩国日本综合| 久久亚洲一区二区三区明星换脸| 久久综合五月天婷婷伊人| 91精品国产福利| 日韩精品一区二区三区在线观看| 蜜桃久久久久久久| 精品一区二区三区日韩| 蜜桃视频一区二区| 激情综合五月天| 国产一区二区调教| 成人一级片网址| 99精品久久免费看蜜臀剧情介绍| 日韩一区二区免费视频| 国内精品伊人久久久久av一坑 | 精品美女一区二区三区| 欧美大片拔萝卜| 久久久久久久久久久久久女国产乱| 91丨porny丨蝌蚪视频| 色综合久久99| 91精品国产日韩91久久久久久| 国产一区美女在线| va亚洲va日韩不卡在线观看| 一本到高清视频免费精品| 色狠狠一区二区| 欧美精品 日韩| 26uuu国产电影一区二区| 欧美韩国日本不卡| 亚洲图片自拍偷拍| 日韩在线一二三区| 久久人人爽爽爽人久久久| 在线观看亚洲专区| 日韩亚洲欧美中文三级| 国产亚洲人成网站| 亚洲男人电影天堂| 免费xxxx性欧美18vr| 国产精品一区二区男女羞羞无遮挡 | 欧美日韩成人综合在线一区二区| 不卡av在线免费观看| 欧美天堂亚洲电影院在线播放| 国产成人av一区二区| 色综合色综合色综合色综合色综合 | 国产欧美一区二区三区在线看蜜臀| 91麻豆精品国产自产在线观看一区| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品99久久久久久似苏梦涵 | 久久aⅴ国产欧美74aaa| 成人免费毛片嘿嘿连载视频| 一本大道久久精品懂色aⅴ| 欧美人与z0zoxxxx视频| 国产亚洲一二三区| 石原莉奈一区二区三区在线观看| 一区二区三区高清在线| 婷婷成人综合网| 成人av免费在线播放| 欧美一级片在线| 亚洲免费看黄网站| 国产.欧美.日韩| 日韩亚洲欧美一区| 亚洲国产日韩精品| 成人av小说网| 久久久精品免费免费| 日韩一区精品字幕| 91福利国产成人精品照片| 欧美激情一区二区| 久久精品国产999大香线蕉| 色婷婷国产精品综合在线观看| 欧美在线观看视频在线| 久久久夜色精品亚洲| 午夜影院久久久| 91色porny蝌蚪| 国产喂奶挤奶一区二区三区| 蜜桃在线一区二区三区| 欧美日韩久久一区二区| 欧美韩国日本综合| 久久99精品国产麻豆婷婷洗澡| 国产一区日韩二区欧美三区| 欧美福利一区二区| 亚洲美女免费在线| 99国产精品久久久久久久久久久 | 日韩三区在线观看| 亚洲成人免费av| 91小视频在线免费看| 久久久国产综合精品女国产盗摄| 国产精品欧美一级免费| 裸体一区二区三区| 制服.丝袜.亚洲.中文.综合| 亚洲免费在线看| 一本色道久久综合亚洲91| 国产精品理伦片| 成人成人成人在线视频| 国产亚洲欧洲997久久综合| 久久99精品视频| 欧美videofree性高清杂交| 日韩国产欧美在线播放| 91麻豆精品国产91久久久| 亚洲成在线观看| 欧美喷潮久久久xxxxx| 亚洲444eee在线观看| 欧美日韩一区二区三区四区五区| 久久久精品人体av艺术| 国产激情视频一区二区三区欧美 | 久久婷婷国产综合精品青草| 久久97超碰色| 精品国内二区三区| 久久er99精品| 久久精品网站免费观看| 成人性生交大片| 亚洲色欲色欲www| 色综合久久天天| 亚洲一区二区三区四区五区黄| 国产精品18久久久久| 26uuu精品一区二区三区四区在线| 国产精品久久久久四虎| 99精品视频在线观看| 亚洲老妇xxxxxx| 在线观看精品一区| 琪琪一区二区三区| xnxx国产精品| 成人黄色综合网站| 亚洲精品videosex极品| 777午夜精品免费视频| 久久精品99久久久| 久久精品网站免费观看| 99久久精品国产一区二区三区| 久久欧美一区二区| 国产精品福利一区二区三区| 国产精品亚洲一区二区三区妖精| 欧美日韩国产123区| 热久久国产精品| 久久九九国产精品| 91久久香蕉国产日韩欧美9色| 中文天堂在线一区| 欧美性三三影院| 蜜臀av性久久久久蜜臀aⅴ流畅| 91福利在线免费观看| 日韩中文欧美在线| 国产欧美精品一区| 色狠狠综合天天综合综合| 奇米影视一区二区三区| 国产精品无遮挡| 7777精品伊人久久久大香线蕉的| 一区二区三区小说| 日韩久久精品一区| av在线不卡观看免费观看| 天堂影院一区二区| 久久久久久久久蜜桃| 色偷偷成人一区二区三区91| 男女男精品网站| 成人免费在线观看入口| 欧美一区二区视频观看视频| av亚洲精华国产精华精| 日本欧美久久久久免费播放网| 4hu四虎永久在线影院成人| 国产福利91精品| 偷窥国产亚洲免费视频| 中文字幕av免费专区久久| 555www色欧美视频| 粉嫩高潮美女一区二区三区| 亚洲成人av一区二区三区| 国产精品欧美精品| 欧美www视频| 欧美日韩1234| 91在线视频播放地址| 久久69国产一区二区蜜臀| 亚洲一区二区综合| 国产精品三级电影| 日韩美女在线视频| 一本久久精品一区二区| 国产成人亚洲综合色影视| 美国毛片一区二区三区| 亚洲国产日韩av| 亚洲日本青草视频在线怡红院| 在线观看www91| caoporn国产一区二区| 麻豆91小视频| 日韩精品五月天| 亚洲国产欧美另类丝袜| 亚洲欧洲综合另类| 国产精品理论在线观看| 久久久久久久综合狠狠综合| 日韩一区二区在线观看视频| 91九色最新地址| 激情五月激情综合网| 国产精品沙发午睡系列990531| 97精品国产露脸对白| 高清国产一区二区三区| 久草热8精品视频在线观看| 日本成人中文字幕在线视频| 亚洲国产一区视频| 亚洲国产一区二区视频| 一级日本不卡的影视| 综合自拍亚洲综合图不卡区| 国产欧美综合色| 国产香蕉久久精品综合网| 久久影院电视剧免费观看| 欧美精品一区二| 久久久久久亚洲综合| 国产喷白浆一区二区三区|