上网行为管理软件已经很多了,然而很多种都无法实现跨NAT设备的监控,这是因为无法定位到真实的源IP地址,在NAT设备前面的设备看来,所有的流量都是NAT设备发起的,NAT设备的存在为其后面的主机提供了一层屏障。那么有没有什么办法可以精确定位真实源IP地址呢?办法是有的,只是需要NAT设备的配合。
1.使用conntrack-tools监控事件
在Linux上,NAT一般是由ip_conntrack机制实现的,Linux本身肯定可以精确定位到真实的转换前的地址,需要做的仅仅是将这些信息传递给上网行为管理系统即可,这些信息可以在/proc/net/ip_conntrack中看到,然而我们关注的不是这些信息本身,而是针对这些信息的一系列的事件,比如某IP在某时间发起了一个到某目标地址的连接,某时间段后拆除了该连接等等。
conntrack-tools工具是Netfilter社区提供的一款功能强大的ip_conntrack信息操作工具,可以方便实时的管理ip_conntrack信息,比如删除某条记录,提取事件等等。Linux的机制在内核实现,所谓的conntrack-tools只是一个用户态的信息操作工具,如果想监控ip_conntrack事件,则只需要执行conntrack -E即可
关于更多的conntrack-tools信息,请参考:http://conntrack-tools.netfilter.org/manual.html
2.总体原理 www.zhishiwu.com
以下是一条conntrack -E的输出:
[NEW] tcp 6 120 SYN_SENT src=128.129.0.3 dst=9.24.15.123 sport=4592 dport=8080 [UNREPLIED] src=9.24.15.123 dst=9.24.15.222 sport=8080 dport=4592
该条信息的意义不言自明,从字面意义上肯定是做了NAT,将源地址128.129.0.3转换为了9.24.14.222,如果说能将这类信息传递给监控网关,那么就可以做到针对真实源地址的监控,在监控网关上需要做的就是数据的整理。我们知道在监控网关上肯定有下列信息:
9.24.15.222:4592这个地址访问了9.24.15.123:8080
该数据和上述的conntrack -E输出的数据做一个汇总就能得到:
128.129.0.3:4592这个地址访问了9.24.15.123:8080
3.ip_conntrack信息导出
如果NAT设备不配合或者根本就不是Linux系统,那么就需要其它的方案来拿到NAT设备上的连接信息。因此为了使这一切可用,有两种办法,一种是提供一个针对熟知NAT设备系统的连接信息导出接口以及规定一种文件格式或者协议格式,自行开发信息导出机制,当然对于Linux的NAT设备,就是上面说的那样;另一种方法就是直接强制使用基于Linux的NAT,不过这种方法有点流氓,你必须要做到的就是你的Linux NAT设备既便宜又好用...
注解:
conntrack-tools工具功能强大,一般用于无缝双机热备环境,Linux主机可以实时的将一台机器的conntrack信息同步到相应的备机上,一旦主机宕机IP地址漂到备机,流量就会无缝的经过备机,而不需要在流量经过备机时重新生成conntrack信息(因为在重新生成的情况下,对于已经建立连接的TCP流量会有问题的)
作者 dog250