WEB开发网
开发学院网络安全防火墙 iptables 源码分析 阅读

iptables 源码分析

 2007-03-07 12:42:27 来源:WEB开发网   
核心提示: 在Libiptc.c中,可以看到函数的实现,iptables 源码分析(7),基本上iptables与内核的交互,都是使用setsockopt函数来实现的,对于获取取规是信息来说,标志位是SO_GET_INFO

在Libiptc.c中,可以看到函数的实现,基本上iptables与内核的交互,都是使用setsockopt函数来实现的,对于获取取规是信息来说,标志位是SO_GET_INFO,而从内核返回回来的规则信息是一个STRUCT_GETINFO结构:

  TC_HANDLE_T TC_INIT(const char *tablename)
  {
  TC_HANDLE_T h;
  STRUCT_GETINFO info;
  unsigned int i;
  int tmp;
  socklen_t s;
  iptc_fn = TC_INIT;
  if (sockfd != -1)
  close(sockfd);
  /*为获取信息打开一个套接字接口*/
  sockfd = socket(TC_AF, SOCK_RAW, IPPROTO_RAW);
  if (sockfd < 0)
  return NULL;
  s = sizeof(info);
  if (strlen(tablename) >= TABLE_MAXNAMELEN) {
  errno = EINVAL;
  return NULL;
  }
  strcpy(info.name, tablename);
  /*获取规则信息*/
  if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0)
  return NULL;
  if ((h = alloc_handle(info.name, info.size, info.num_entries))
  == NULL)
  return NULL;
  /* Too hard --RR */
  #if 0
  sprintf(pathname, "%s/%s", IPT_LIB_DIR, info.name);
  dynlib = dlopen(pathname, RTLD_NOW);
  if (!dynlib) {
  errno = ENOENT;
  return NULL;
  }
  h->hooknames = dlsym(dynlib, "hooknames");
  if (!h->hooknames) {
  errno = ENOENT;
  return NULL;
  }
  #else
  h->hooknames = hooknames;
  #endif
  /* Initialize current state */
  h->info = info;
  h->new_number = h->info.num_entries;
  for (i = 0; i < h->info.num_entries; i++)
  h->counter_map[i]
  = ((struct counter_map){COUNTER_MAP_NORMAL_MAP, i});
  h->entries.size = h->info.size;
  tmp = sizeof(STRUCT_GET_ENTRIES) + h->info.size;
  if (getsockopt(sockfd, TC_IPPROTO, SO_GET_ENTRIES, &h->entries,
  &tmp) < 0) {
  free(h);
  return NULL;
  }
  CHECK(h);
  return h;
  }

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:iptables 源码 分析

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接