免费注册 查看新帖 |

Chinaunix

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

conntrack+icmp:发现一个奇怪的现象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-30 10:49 |只看该作者 |倒序浏览
NAT服务器上想跟踪icmp的连接
ping x.x.x.x//从内网ping本地外网服务器

grep ^icmp /proc/net/ip_conntrack总是没有连接记录
grep conn /proc/slabinfo也不见对象数量有任何改变

开始怀疑是没有生成连接,但是在NAT上是不可能,排除
ping www.sohu.com却能看到记录,不过不是每次都能
经过一番折腾,查看代码后才知原因所在
static int icmp_packet(struct ip_conntrack *ct,
                       struct iphdr *iph, size_t len,
                       enum ip_conntrack_info ctinfo)
{
/* FIXME: Should keep count of orig - reply packets: if == 0,
           destroy --RR */
/* Delete connection immediately on reply: won't actually
           vanish as we still have skb */

if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
//icmp ping包的连接立即会消失,如果echo reply延迟很小的话
//因此利用grep ^icmp /proc/net/ip_conntrack和grep conn /proc/slabinfo通常跟踪不到
if (del_timer(&ct->timeout))
ct->timeout.function((unsigned long)ct);
} else
ip_ct_refresh(ct, ICMP_TIMEOUT);
return NF_ACCEPT;
}

只有ping -f x.x.x.x可增加跟踪到的概率,或ping 不存在的地址也能看到

个人觉得在收到echo reply后应该能够延迟几秒钟再回收连接记录,否则
flooding ping导致的开销不小

论坛徽章:
0
2 [报告]
发表于 2007-04-30 11:16 |只看该作者
NAT服务器在用tcpdump抓icmp包的时候
tcpdump -i eth0 -nnn icmp//eth0为外网

11:20:27.694467 x.x.x.x > y.y.y.y: icmp: echo request
11:20:27.694467 y.y.y.y > 10.1.9.8: icmp: echo reply

reply包尽然是内网地址。

分析后发现:
1.该包显然是经过conntrack和NAT处理后包
2.tcpdump是采用af_packet协议抓包的,命令行已经隐含指出协议类型为ip协议。因此packet_create时直接dev_add_pack到ip包。而不是通常的ETH_P_ALL
3.因此net_rx_action中reply包先由ip_rcv处理,经过PREROUTING后包已被改写(do_bindings),因此再传给packet_rcv时目的地址已经成为内网地址了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP