- 论坛徽章:
- 0
|
所有的连接跟踪都通过ip_conntrack_tuple_hash[0]和ip_conntrack_tuple_hash[1]链在哈希表ip_conntrack_hash中,
ip_conntrack_tuple_hash其实就是ip_conntrack_tuple.目的转换是在连接跟踪之后做的,连接的信息在做nat转换之前就已经建立好了,也就是说original tuple 和 reply tuple 就被设置了.另外特别注意的是任何NAT处理规则都不会对
original方向的tuple进行改变,只是对reply方向的的tuple按规则进行改变.
我们举个例子:
iptables -t nat -A PREROUTING -d 20.0.0.1/8 -j DNAT --to-destination 10.0.30.1:80
假设src ip 192.168.30.1 sport 100, 访问 dst ip 20.0.0.1 dport 200
在连接跟踪建立之后,nat之前
original方向的tuple应该是192.168.30.1/100---------20.0.0.1/200
reply方向的tuple应该是 20.0.0.1/200------------- 192.168.30.1/100
nat之后应该是
original方向是 192.168.30.1/100----------20.0.0.1/200
reply方向是 10.0.30.1/80----------------192.168.30.1/100
包在进入了你的客户监听程序后,你得到的socket的信息192.168.30.1/100---10.0.30.1/80 还有socket的协议(udp,tcp)等信息.
你把这些信息封装到一结构里,然后传入内核,内核得到信息后可以自行构建tuple,你这里可以构建reply tuple,并通过他找到连接跟踪信息,再由连接跟踪信息取orgin tuple,就可以得到转换前的地址啦
[ 本帖最后由 fly6 于 2009-1-19 16:52 编辑 ] |
|