免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11138 | 回复: 12
打印 上一主题 下一主题

实例分析如何在Netfilter中跟踪FTP数据流 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-26 15:38 |只看该作者 |倒序浏览
本帖最后由 HereItIs 于 2010-02-26 16:00 编辑

How conntrack works in Netfilter(Part 2 - How to track FTP connections)

本文档基于Linux2.6.30内核,版权归hereitis所有,可以自由拷贝/转载,转载时请保持文档的完整性并且注明来源,禁止用于任何商业用途。
Blog:http://blog.chinaunix.net/u3/110948/
Email:hereitis.cu@gmail.com

http://blog.chinaunix.net/u3/110948/showart.php?id=2166655

   1. Initialization
         1. nf_conntrack_ftp_init(net/netfilter/nf_conntrack_ftp.c)
  1. static int __init nf_conntrack_ftp_init(void)
  2. {
  3.     int i, j = -1, ret = 0;
  4.     char *tmpname;

  5.     ftp_buffer = kmalloc(65536, GFP_KERNEL);
  6.     if (!ftp_buffer)
  7.         return -ENOMEM;

  8.     if (ports_c == 0) // static unsigned int ports_c;
  9.         ports[ports_c++] = FTP_PORT; //static u_int16_t ports[MAX_PORTS];

  10.     /* FIXME should be configurable whether IPv4 and IPv6 FTP connections
  11.          are tracked or not - YK */
  12.     for (i = 0; i < ports_c; i++) {
  13.         ftp[i][0].tuple.src.l3num = PF_INET;// Will be used when hash tuple
  14.         ftp[i][1].tuple.src.l3num = PF_INET6;
  15.         for (j = 0; j < 2; j++) {
  16.             ftp[i][j].tuple.src.u.tcp.port = htons(ports[i]); // Will be used when hash tuple
  17.             ftp[i][j].tuple.dst.protonum = IPPROTO_TCP; // Will be used when hash tuple
  18.             ftp[i][j].expect_policy = &ftp_exp_policy;
  19.             ftp[i][j].me = THIS_MODULE;
  20.             ftp[i][j].help = help;
  21.             tmpname = &ftp_names[i][j][0];
  22.             if (ports[i] == FTP_PORT)
  23.                 sprintf(tmpname, "ftp");
  24.             else
  25.                 sprintf(tmpname, "ftp-%d", ports[i]);
  26.             ftp[i][j].name = tmpname;

  27.             pr_debug("nf_ct_ftp: registering helper for pf: %d "
  28.                  "port: %d\n",
  29.                  ftp[i][j].tuple.src.l3num, ports[i]);
  30.             ret = nf_conntrack_helper_register(&ftp[i][j]);
  31.             if (ret) {
  32.                 printk("nf_ct_ftp: failed to register helper "
  33.                        " for pf: %d port: %d\n",
  34.                     ftp[i][j].tuple.src.l3num, ports[i]);
  35.                 nf_conntrack_ftp_fini();
  36.                 return ret;
  37.             }
  38.         }
  39.     }

  40.     return 0;
  41. }
复制代码
2. nf_conntrack_helper_register(net/netfilter/nf_conntrack_helper.c)
  1. int nf_conntrack_helper_register(struct nf_conntrack_helper *me)
  2. {
  3.     unsigned int h = helper_hash(&me->tuple);

  4.     BUG_ON(me->expect_policy == NULL);
  5.     BUG_ON(me->expect_class_max >= NF_CT_MAX_EXPECT_CLASSES);
  6.     BUG_ON(strlen(me->name) > NF_CT_HELPER_NAME_LEN - 1);

  7.     mutex_lock(&nf_ct_helper_mutex);
  8.     hlist_add_head_rcu(&me->hnode, &nf_ct_helper_hash[h]); // Global helper list
  9.     nf_ct_helper_count++;
  10.     mutex_unlock(&nf_ct_helper_mutex);

  11.     return 0;
  12. }
复制代码
3. helper_hash(net/netfilter/nf_conntrack_helper.c)
  1. /* Stupid hash, but collision free for the default registrations of the
  2. * helpers currently in the kernel. */
  3. static unsigned int helper_hash(const struct nf_conntrack_tuple *tuple)
  4. {
  5.     return (((tuple->src.l3num << 8) | tuple->dst.protonum) ^
  6.         (__force __u16)tuple->src.u.all) % nf_ct_helper_hsize;
  7. }
复制代码
4. How ftp helper registered


   2. How ftp helper works
         1. Big picture



         2. Main helper function(net/netfilter/nf_conntrack_ftp.c)
  1. static int help(struct sk_buff *skb,
  2.         unsigned int protoff,
  3.         struct nf_conn *ct,
  4.         enum ip_conntrack_info ctinfo)
  5. {
  6.     unsigned int dataoff, datalen;
  7.     const struct tcphdr *th;
  8.     struct tcphdr _tcph;
  9.     const char *fb_ptr;
  10.     int ret;
  11.     u32 seq;
  12.     int dir = CTINFO2DIR(ctinfo);
  13.     unsigned int uninitialized_var(matchlen), uninitialized_var(matchoff);
  14.     struct nf_ct_ftp_master *ct_ftp_info = &nfct_help(ct)->help.ct_ftp_info;
  15.     struct nf_conntrack_expect *exp;
  16.     union nf_inet_addr *daddr;
  17.     struct nf_conntrack_man cmd = {};
  18.     unsigned int i;
  19.     int found = 0, ends_in_nl;
  20.     typeof(nf_nat_ftp_hook) nf_nat_ftp;

  21.     /* Until there's been traffic both ways, don't look in packets. */
  22.     if (ctinfo != IP_CT_ESTABLISHED
  23.         && ctinfo != IP_CT_ESTABLISHED+IP_CT_IS_REPLY) {
  24.         pr_debug("ftp: Conntrackinfo = %u\n", ctinfo);
  25.         return NF_ACCEPT;
  26.     }

  27.     th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
  28.     if (th == NULL)
  29.         return NF_ACCEPT;

  30.     dataoff = protoff + th->doff * 4;
  31.     /* No data? */
  32.     if (dataoff >= skb->len) {
  33.         pr_debug("ftp: dataoff(%u) >= skblen(%u)\n", dataoff,
  34.              skb->len);
  35.         return NF_ACCEPT;
  36.     }
  37.     datalen = skb->len - dataoff;

  38.     spin_lock_bh(&nf_ftp_lock);
  39.     fb_ptr = skb_header_pointer(skb, dataoff, datalen, ftp_buffer);
  40.     BUG_ON(fb_ptr == NULL);

  41.     ends_in_nl = (fb_ptr[datalen - 1] == '\n');
  42.     seq = ntohl(th->seq) + datalen;

  43.     /* Look up to see if we're just after a \n. */
  44.     if (!find_nl_seq(ntohl(th->seq), ct_ftp_info, dir)) {
  45.         /* Now if this ends in \n, update ftp info. */
  46.         pr_debug("nf_conntrack_ftp: wrong seq pos %s(%u) or %s(%u)\n",
  47.              ct_ftp_info->seq_aft_nl_num[dir] > 0 ? "" : "(UNSET)",
  48.              ct_ftp_info->seq_aft_nl[dir][0],
  49.              ct_ftp_info->seq_aft_nl_num[dir] > 1 ? "" : "(UNSET)",
  50.              ct_ftp_info->seq_aft_nl[dir][1]);
  51.         ret = NF_ACCEPT;
  52.         goto out_update_nl;
  53.     }

  54.     /* Initialize IP/IPv6 addr to expected address (it's not mentioned
  55.        in EPSV responses) */
  56.     cmd.l3num = nf_ct_l3num(ct);
  57.     memcpy(cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
  58.            sizeof(cmd.u3.all));

  59.     for (i = 0; i < ARRAY_SIZE(search[dir]); i++) {
  60.         found = find_pattern(fb_ptr, datalen,    // Try to find packet which trigger a ftp connection tracking
  61.                      search[dir][i].pattern,
  62.                      search[dir][i].plen,
  63.                      search[dir][i].skip,
  64.                      search[dir][i].term,
  65.                      &matchoff, &matchlen,
  66.                      &cmd,
  67.                      search[dir][i].getnum);
  68.         if (found) break;
  69.     }
  70.     if (found == -1) {
  71.         /* We don't usually drop packets.  After all, this is
  72.            connection tracking, not packet filtering.
  73.            However, it is necessary for accurate tracking in
  74.            this case. */
  75.         pr_debug("conntrack_ftp: partial %s %u+%u\n",
  76.              search[dir][i].pattern,  ntohl(th->seq), datalen);
  77.         ret = NF_DROP;
  78.         goto out;
  79.     } else if (found == 0) { /* No match */
  80.         ret = NF_ACCEPT;
  81.         goto out_update_nl;
  82.     }

  83.     pr_debug("conntrack_ftp: match `%.*s' (%u bytes at %u)\n",
  84.          matchlen, fb_ptr + matchoff,
  85.          matchlen, ntohl(th->seq) + matchoff);

  86.     exp = nf_ct_expect_alloc(ct);
  87.     if (exp == NULL) {
  88.         ret = NF_DROP;
  89.         goto out;
  90.     }

  91.     /* We refer to the reverse direction ("!dir") tuples here,
  92.      * because we're expecting something in the other direction.
  93.      * Doesn't matter unless NAT is happening.  */
  94.     daddr = &ct->tuplehash[!dir].tuple.dst.u3;

  95.     /* Update the ftp info */
  96.     if ((cmd.l3num == nf_ct_l3num(ct)) &&
  97.         memcmp(&cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
  98.              sizeof(cmd.u3.all))) {
  99.         /* Enrico Scholz's passive FTP to partially RNAT'd ftp
  100.            server: it really wants us to connect to a
  101.            different IP address.  Simply don't record it for
  102.            NAT. */
  103.         if (cmd.l3num == PF_INET) {
  104.             pr_debug("conntrack_ftp: NOT RECORDING: %pI4 != %pI4\n",
  105.                  &cmd.u3.ip,
  106.                  &ct->tuplehash[dir].tuple.src.u3.ip);
  107.         } else {
  108.             pr_debug("conntrack_ftp: NOT RECORDING: %pI6 != %pI6\n",
  109.                  cmd.u3.ip6,
  110.                  ct->tuplehash[dir].tuple.src.u3.ip6);
  111.         }

  112.         /* Thanks to Cristiano Lincoln Mattos
  113.            <[email]lincoln@cesar.org.br[/email]> for reporting this potential
  114.            problem (DMZ machines opening holes to internal
  115.            networks, or the packet filter itself). */
  116.         if (!loose) {
  117.             ret = NF_ACCEPT;
  118.             goto out_put_expect;
  119.         }
  120.         daddr = &cmd.u3;
  121.     }

  122.     nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, cmd.l3num, // Setup expectation for this ftp connection
  123.               &ct->tuplehash[!dir].tuple.src.u3, daddr,
  124.               IPPROTO_TCP, NULL, &cmd.u.tcp.port);

  125.     /* Now, NAT might want to mangle the packet, and register the
  126.      * (possibly changed) expectation itself. */
  127.     nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook);
  128.     if (nf_nat_ftp && ct->status & IPS_NAT_MASK)
  129.         ret = nf_nat_ftp(skb, ctinfo, search[dir][i].ftptype,
  130.                  matchoff, matchlen, exp);
  131.     else {
  132.         /* Can't expect this?  Best to drop packet now. */
  133.         if (nf_ct_expect_related(exp) != 0)
  134.             ret = NF_DROP;
  135.         else
  136.             ret = NF_ACCEPT;
  137.     }

  138. out_put_expect:
  139.     nf_ct_expect_put(exp);

  140. out_update_nl:
  141.     /* Now if this ends in \n, update ftp info.  Seq may have been
  142.      * adjusted by NAT code. */
  143.     if (ends_in_nl)
  144.         update_nl_seq(ct, seq, ct_ftp_info, dir, skb);
  145. out:
  146.     spin_unlock_bh(&nf_ftp_lock);
  147.     return ret;
  148. }
复制代码
3. Pattern search(net/netfilter/nf_conntrack_ftp.c)
         1. Structure
  1. static struct ftp_search {
  2.     const char *pattern;
  3.     size_t plen;
  4.     char skip;
  5.     char term;
  6.     enum nf_ct_ftp_type ftptype;
  7.     int (*getnum)(const char *, size_t, struct nf_conntrack_man *, char);
  8. } search[IP_CT_DIR_MAX][2] = { // 2 directions and 2 modes
  9.     [IP_CT_DIR_ORIGINAL] = {
  10.         {
  11.             .pattern    = "PORT",
  12.             .plen        = sizeof("PORT") - 1,
  13.             .skip        = ' ',
  14.             .term        = '\r',
  15.             .ftptype    = NF_CT_FTP_PORT,
  16.             .getnum        = try_rfc959,
  17.         },
  18.         {
  19.             .pattern    = "EPRT",
  20.             .plen        = sizeof("EPRT") - 1,
  21.             .skip        = ' ',
  22.             .term        = '\r',
  23.             .ftptype    = NF_CT_FTP_EPRT,
  24.             .getnum        = try_eprt,
  25.         },
  26.     },
  27.     [IP_CT_DIR_REPLY] = {
  28.         {
  29.             .pattern    = "227 ",
  30.             .plen        = sizeof("227 ") - 1,
  31.             .skip        = '(',
  32.             .term        = ')',
  33.             .ftptype    = NF_CT_FTP_PASV,
  34.             .getnum        = try_rfc959,
  35.         },
  36.         {
  37.             .pattern    = "229 ",
  38.             .plen        = sizeof("229 ") - 1,
  39.             .skip        = '(',
  40.             .term        = ')',
  41.             .ftptype    = NF_CT_FTP_EPSV,
  42.             .getnum        = try_epsv_response,
  43.         },
  44.     },
  45. };
复制代码
2. try_rfc959(net/netfilter/nf_conntrack_ftp.c)
  1. /* Returns 0, or length of numbers: 192,168,1,1,5,6 */
  2. static int try_rfc959(const char *data, size_t dlen,
  3.               struct nf_conntrack_man *cmd, char term)
  4. {
  5.     int length;
  6.     u_int32_t array[6];

  7.     length = try_number(data, dlen, array, 6, ',', term);
  8.     if (length == 0)
  9.         return 0;

  10.     cmd->u3.ip =  htonl((array[0] << 24) | (array[1] << 16) |
  11.                     (array[2] << 8) | array[3]);
  12.     cmd->u.tcp.port = htons((array[4] << 8) | array[5]);
  13.     return length;
  14. }
复制代码
3. try_eprt(net/netfilter/nf_conntrack_ftp.c)
  1. /* Returns 0, or length of numbers: |1|132.235.1.2|6275| or |2|3ffe::1|6275| */
  2. static int try_eprt(const char *data, size_t dlen, struct nf_conntrack_man *cmd,
  3.             char term)
  4. {
  5.     char delim;
  6.     int length;

  7.     /* First character is delimiter, then "1" for IPv4 or "2" for IPv6,
  8.        then delimiter again. */
  9.     if (dlen <= 3) {
  10.         pr_debug("EPRT: too short\n");
  11.         return 0;
  12.     }
  13.     delim = data[0];
  14.     if (isdigit(delim) || delim < 33 || delim > 126 || data[2] != delim) {
  15.         pr_debug("try_eprt: invalid delimitter.\n");
  16.         return 0;
  17.     }

  18.     if ((cmd->l3num == PF_INET && data[1] != '1') ||
  19.         (cmd->l3num == PF_INET6 && data[1] != '2')) {
  20.         pr_debug("EPRT: invalid protocol number.\n");
  21.         return 0;
  22.     }

  23.     pr_debug("EPRT: Got %c%c%c\n", delim, data[1], delim);

  24.     if (data[1] == '1') {
  25.         u_int32_t array[4];

  26.         /* Now we have IP address. */
  27.         length = try_number(data + 3, dlen - 3, array, 4, '.', delim);
  28.         if (length != 0)
  29.             cmd->u3.ip = htonl((array[0] << 24) | (array[1] << 16)
  30.                        | (array[2] << 8) | array[3]);
  31.     } else {
  32.         /* Now we have IPv6 address. */
  33.         length = get_ipv6_addr(data + 3, dlen - 3,
  34.                        (struct in6_addr *)cmd->u3.ip6, delim);
  35.     }

  36.     if (length == 0)
  37.         return 0;
  38.     pr_debug("EPRT: Got IP address!\n");
  39.     /* Start offset includes initial "|1|", and trailing delimiter */
  40.     return get_port(data, 3 + length + 1, dlen, delim, &cmd->u.tcp.port);
  41. }
复制代码
4. try_epsv_response(net/netfilter/nf_conntrack_ftp.c)
  1. /* Returns 0, or length of numbers: |||6446| */
  2. static int try_epsv_response(const char *data, size_t dlen,
  3.                  struct nf_conntrack_man *cmd, char term)
  4. {
  5.     char delim;

  6.     /* Three delimiters. */
  7.     if (dlen <= 3) return 0;
  8.     delim = data[0];
  9.     if (isdigit(delim) || delim < 33 || delim > 126
  10.         || data[1] != delim || data[2] != delim)
  11.         return 0;

  12.     return get_port(data, 3, dlen, delim, &cmd->u.tcp.port);
  13. }
复制代码
5. nf_ct_expect_init(net/netfilter/nf_conntrack_expect.c)
  1. void nf_ct_expect_init(struct nf_conntrack_expect *exp, unsigned int class,
  2.                u_int8_t family,
  3.                const union nf_inet_addr *saddr,
  4.                const union nf_inet_addr *daddr,
  5.                u_int8_t proto, const __be16 *src, const __be16 *dst)
  6. {
  7.     int len;

  8.     if (family == AF_INET)
  9.         len = 4;
  10.     else
  11.         len = 16;

  12.     exp->flags = 0;
  13.     exp->class = class;
  14.     exp->expectfn = NULL;
  15.     exp->helper = NULL;
  16.     exp->tuple.src.l3num = family;
  17.     exp->tuple.dst.protonum = proto;

  18.     if (saddr) {
  19.         memcpy(&exp->tuple.src.u3, saddr, len);
  20.         if (sizeof(exp->tuple.src.u3) > len)
  21.             /* address needs to be cleared for nf_ct_tuple_equal */
  22.             memset((void *)&exp->tuple.src.u3 + len, 0x00,
  23.                    sizeof(exp->tuple.src.u3) - len);
  24.         memset(&exp->mask.src.u3, 0xFF, len);
  25.         if (sizeof(exp->mask.src.u3) > len)
  26.             memset((void *)&exp->mask.src.u3 + len, 0x00,
  27.                    sizeof(exp->mask.src.u3) - len);
  28.     } else {
  29.         memset(&exp->tuple.src.u3, 0x00, sizeof(exp->tuple.src.u3));
  30.         memset(&exp->mask.src.u3, 0x00, sizeof(exp->mask.src.u3));
  31.     }

  32.     if (src) {
  33.         exp->tuple.src.u.all = *src;
  34.         exp->mask.src.u.all = htons(0xFFFF);
  35.     } else {
  36.         exp->tuple.src.u.all = 0;
  37.         exp->mask.src.u.all = 0;
  38.     }

  39.     memcpy(&exp->tuple.dst.u3, daddr, len);
  40.     if (sizeof(exp->tuple.dst.u3) > len)
  41.         /* address needs to be cleared for nf_ct_tuple_equal */
  42.         memset((void *)&exp->tuple.dst.u3 + len, 0x00,
  43.                sizeof(exp->tuple.dst.u3) - len);

  44.     exp->tuple.dst.u.all = *dst;
  45. }
  46. EXPORT_SYMBOL_GPL(nf_ct_expect_init);
复制代码

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 多谢分享

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2010-02-26 15:44 |只看该作者
本帖最后由 HereItIs 于 2010-02-26 15:56 编辑

2. Let us take a real ftp traffic as an example
         1. The partial real ftp traffic

No.     Time        Source                Destination           Protocol Info
      1 0.000000    172.20.9.84           172.20.9.80           TCP      eportcomm > ftp [SYN] Seq=0 Win=65535 Len=0 MSS=1460

Frame 1 (62 bytes on wire, 62 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 0, Len: 0

No.     Time        Source                Destination           Protocol Info
      2 0.000135    172.20.9.80           172.20.9.84           TCP      ftp > eportcomm [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460

Frame 2 (62 bytes on wire, 62 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp (21), Dst Port: eportcomm (4666), Seq: 0, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
      3 0.000152    172.20.9.84           172.20.9.80           TCP      eportcomm > ftp [ACK] Seq=1 Ack=1 Win=65535 Len=0

Frame 3 (54 bytes on wire, 54 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 1, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
      4 0.006313    172.20.9.80           172.20.9.84           FTP      Response: 220 Welcome to Test's FTP service.

Frame 4 (91 bytes on wire, 91 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp (21), Dst Port: eportcomm (4666), Seq: 1, Ack: 1, Len: 37
File Transfer Protocol (FTP)

...........

No.     Time        Source                Destination           Protocol Info
     12 8.471443    172.20.9.84           172.20.9.80           TCP      eportcomm > ftp [ACK] Seq=32 Ack=95 Win=65441 Len=0

Frame 12 (54 bytes on wire, 54 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 32, Ack: 95, Len: 0

No.     Time        Source                Destination           Protocol Info
     13 10.124938   172.20.9.84           172.20.9.80           FTP      Request: PORT 172,20,9,84,18,67

Frame 13 (78 bytes on wire, 78 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 32, Ack: 95, Len: 24
File Transfer Protocol (FTP)

No.     Time        Source                Destination           Protocol Info
     14 10.125258   172.20.9.80           172.20.9.84           FTP      Response: 200 PORT command successful. Consider using PASV.

Frame 14 (105 bytes on wire, 105 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp (21), Dst Port: eportcomm (4666), Seq: 95, Ack: 56, Len: 51
File Transfer Protocol (FTP)

No.     Time        Source                Destination           Protocol Info
     15 10.126652   172.20.9.84           172.20.9.80           FTP      Request: NLST

Frame 15 (60 bytes on wire, 60 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 56, Ack: 146, Len: 6
File Transfer Protocol (FTP)

No.     Time        Source                Destination           Protocol Info
     16 10.127158   172.20.9.80           172.20.9.84           TCP      ftp-data > dhct-status [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=21742713 TSER=0 WS=5

Frame 16 (74 bytes on wire, 74 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp-data (20), Dst Port: dhct-status (4675), Seq: 0, Len: 0

No.     Time        Source                Destination           Protocol Info
     17 10.127192   172.20.9.84           172.20.9.80           TCP      dhct-status > ftp-data [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=0 TSV=0 TSER=0

Frame 17 (78 bytes on wire, 78 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: dhct-status (4675), Dst Port: ftp-data (20), Seq: 0, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
     18 10.127311   172.20.9.80           172.20.9.84           TCP      ftp-data > dhct-status [ACK] Seq=1 Ack=1 Win=5856 Len=0 TSV=21742713 TSER=0

Frame 18 (66 bytes on wire, 66 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp-data (20), Dst Port: dhct-status (4675), Seq: 1, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
     19 10.127412   172.20.9.80           172.20.9.84           FTP      Response: 150 Here comes the directory listing.

   2. Assume we are on 172.20.9.80(ftp server side), so hooks on point NF_INET_PRE_ROUTING and NF_INET_LOCAL_IN will be invoked.
         1. Big Picture

   2. What we got from Frame 1

No.     Time        Source                Destination           Protocol Info
      1 0.000000    172.20.9.84           172.20.9.80           TCP      eportcomm > ftp [SYN] Seq=0 Win=65535 Len=0 MSS=1460
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 0, Len: 0







   3. What we got from Frame 2

No.     Time        Source                Destination           Protocol Info
     2 0.000135    172.20.9.80           172.20.9.84           TCP      ftp> eportcomm [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460

Frame 2 (62 bytes on wire, 62 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp (21), Dst Port: eportcomm (4666), Seq: 0, Ack: 1, Len: 0

   4. What we got from Frame 13

No.     Time        Source                Destination           Protocol Info
     13 10.124938   172.20.9.84           172.20.9.80           FTP      Request: PORT 172,20,9,84,18,67

Frame 13 (78 bytes on wire, 78 bytes captured)
Internet Protocol, Src: 172.20.9.84 (172.20.9.84), Dst: 172.20.9.80 (172.20.9.80)
Transmission Control Protocol, Src Port: eportcomm (4666), Dst Port: ftp (21), Seq: 32, Ack: 95, Len: 24
File Transfer Protocol (FTP)


   5. What we got from Frame 16

No.     Time        Source                Destination           Protocol Info
    16 10.127158   172.20.9.80           172.20.9.84           TCP     ftp-data > dhct-status [SYN] Seq=0 Win=5840 Len=0 MSS=1460TSV=21742713 TSER=0 WS=5

Frame 16 (74 bytes on wire, 74 bytes captured)
Internet Protocol, Src: 172.20.9.80 (172.20.9.80), Dst: 172.20.9.84 (172.20.9.84)
Transmission Control Protocol, Src Port: ftp-data (20), Dst Port: dhct-status (4675), Seq: 0, Len: 0


   Now, all connection tracking data structures for this FTP traffic are constructed and followed traffic in this flow will be tracked with this data structure.

论坛徽章:
0
3 [报告]
发表于 2010-02-26 16:00 |只看该作者
能给个pdf或word的嘛

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2010-02-26 16:07 |只看该作者
多谢LZ分享。

论坛徽章:
0
5 [报告]
发表于 2010-02-26 21:17 |只看该作者
又是精品文章一篇……

论坛徽章:
0
6 [报告]
发表于 2010-02-26 21:22 |只看该作者
我很想知道这个图是拿什么画的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-02-27 18:42 |只看该作者
WIN下的Visio可以做出这样的效果

论坛徽章:
0
8 [报告]
发表于 2011-08-05 08:41 |只看该作者
这个要顶一下

论坛徽章:
0
9 [报告]
发表于 2011-08-05 13:48 |只看该作者
好帖子啊,顶

论坛徽章:
0
10 [报告]
发表于 2011-08-05 13:49 |只看该作者
能否整理下提供源码的下载啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP