Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4261293
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类: BSD

2016-05-24 17:36:47

用动态规则时,有时需要查看动态规则的详细情况,看到的结果类似下面结果:

  1. ## Dynamic rules (2810):
  2. 00316 1 120 (10s) LIMIT udp 10.72.208.149 63136 <-> 10.72.16.1 53
  3. 00316 1 120 (10s) LIMIT udp 10.72.176.240 5828 <-> 10.72.16.1 53
  4. 00316 3 324 (5s) LIMIT udp 10.72.176.156 46759 <-> 10.72.16.1 53
  5. 00316 1 204 (2s) LIMIT udp 10.72.177.126 55111 <-> 10.72.16.1 53
  6. 00316 0 0 (4s) PARENT 6 udp 10.72.208.109 0 <-> 0.0.0.0 0
这个结果每句到底什么意思呢?ipfw man上面也没有说明,总不能瞎猜吧!
于是先请来这段的源代码:

  1. static void
  2.   show_dyn_ipfw(ipfw_dyn_rule *d, int pcwidth, int bcwidth)
  3.   {
  4.           struct protoent *pe;
  5.           struct in_addr a;
  6.           uint16_t rulenum;
  7.           char buf[INET6_ADDRSTRLEN];

  8.           if (!co.do_expired) {
  9.                   if (!d->expire && !(d->dyn_type == O_LIMIT_PARENT))
  10.                           return;
  11.           }
  12.           bcopy(&d->rule, &rulenum, sizeof(rulenum));
  13.           printf("%05d", rulenum);
  14.           if (pcwidth > 0 || bcwidth > 0) {
  15.                   printf(" ");
  16.                   pr_u64(&d->pcnt, pcwidth);
  17.                   pr_u64(&d->bcnt, bcwidth);
  18.                   printf("(%ds)", d->expire);
  19.           }
  20.           switch (d->dyn_type) {
  21.           case O_LIMIT_PARENT:
  22.                   printf(" PARENT %d", d->count);
  23.                   break;
  24.           case O_LIMIT:
  25.                   printf(" LIMIT");
  26.                   break;
  27.           case O_KEEP_STATE: /* bidir, no mask */
  28.                   printf(" STATE");
  29.                   break;
  30.           }

  31.           if ((pe = getprotobynumber(d->id.proto)) != NULL)
  32.                   printf(" %s", pe->p_name);
  33.           else
  34.                   printf(" proto %u", d->id.proto);

  35.           if (d->id.addr_type == 4) {
  36.                   a.s_addr = htonl(d->id.src_ip);
  37.                   printf(" %s %d", inet_ntoa(a), d->id.src_port);

  38.                   a.s_addr = htonl(d->id.dst_ip);
  39.                   printf(" <-> %s %d", inet_ntoa(a), d->id.dst_port);
  40.           } else if (d->id.addr_type == 6) {
  41.                   printf(" %s %d", inet_ntop(AF_INET6, &d->id.src_ip6, buf,
  42.                       sizeof(buf)), d->id.src_port);
  43.                   printf(" <-> %s %d", inet_ntop(AF_INET6, &d->id.dst_ip6, buf,
  44.                       sizeof(buf)), d->id.dst_port);
  45.           } else
  46.                   printf(" UNKNOWN <-> UNKNOWN\n");

  47.           printf("\n");
  48. }

上面这段是完整的输入函数,我们来逐个看一下输入:

printf("%05d", rulenum); 输出规则号,因为最高是65535,所以5位就足够了;

然后又接连来的四句:
printf(" ");                              输出空格
pr_u64(&d->pcnt, pcwidth);    pcnt:packet count的缩写,包数量
pr_u64(&d->bcnt, bcwidth);    bcnt:byte count 的缩写,字节数量
printf("(%ds)", d->expire);  这句明显了,是过期时间,单位是s(秒)

后面是一个switch,表示动态规则的类型:PARENT型为父规则,这个规则的pcnt、bcnt都为零,所有其他规则都必须在这个规则下创建;LIMIT为限制规则,只要在规则中有LIMIT语句,则为LIMIT类型;STATE为状态规则,表示为keep-state的规则。注意 printf(" PARENT %d", d->count);后面有个%d,表示PARENT类型规则下面,有多少个子规则,由此来判断是不是可以limit了。

再后面就好理解了,就是源地址 源端口 <-> 目录地址 目标端口

所以画个图,以便理解:




阅读(3332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~