我配置了一条NAT规则实现端口转换, 进行测试。 每次测试后,用iptables -t nat -nvL 进行查看时, 发现pkts每次只加1, 但抓包时发现有6个包都进行了端口转换。 请问其余的5个包是何时进行端口转换的?
解决问题过程, 添加打印, 抓包。
(1) 在NF_HOOK, POST_ROUTING前加打印信息。
(2) ChinaUnix论坛中, 瀚海书香的回复:
NAT表只对NEW状态的数据包操作,之后的数据包直接根据conntrack信息进行相应的sip,dip等的替换
(3)数据包状态研究:
http://blog.chinaunix.net/uid-384966-id-2411274.html
1: 概述
1.a: 状态机制是iptables的一部分, 其实它只是一种连接跟踪机制。
1.b: 运行连接跟踪的防火墙称为状态防火墙。
1.c: 在iptables里, 包是和被跟踪连接的四种不同状态有关的。它们是NEW,ESTABLISHED,RELATED和INVALID。后面我们会深入地讨论每一个状态。使用--state匹配操作,我们能很容易地控制
“谁或什么能发起新的会话”。
1.d: 在内核中在内核中由Netfilter的特定框架做的连接跟踪称作conntrack(connection tracking). conntrack 可以作为模块安装, 也可以作为内核的一部分。这些模块从数据包中提取详细的唯一的信息,
因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,UDP流一般由他们的目的地址、源地址、目的端口和源端口唯一确定。
1.e:除了本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链里进行处理的,意思就是, iptables会在PREROUTING链里从新计算所有的状态。如果我们发送一个流的初始化包,状态就会
在OUTPUT链里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状态。综上,
所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。
2:conntrack 记录
tcp 6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 dport=32775 use=2
2.a 十进制6, tcp协议号(17, udp协议号);
117, 生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值;
SYN_SENT , TCP连接只在一个方向发了SYN包。
源地址, 目的地址, 源端口, 目的端口。
UNREPLIED: 这个连接没有收到任何回应。当一个连接在两个方向上都有传输时, conntrack记录就删除[UNREPLIED]标志, 然后重置。
期望得到的包的源地址, 目的地址, 源端口, 目的端口。
末尾有 ASSURED的记录表明两个方向已没有流量, 这样的记录是确定的, 在conntrack表满时时速不会被删除的, 没有ASSURED就要被删除。
对于7620 抓到的相应记录是:
ipv4 2 tcp 6 431997 ESTABLISHED src=192.168.1.18 dst=192.168.1.1 sport=50071 dport=80 src=10.10.10.10 dst=10.10.10.14 sport=80 dport=50071 [ASSURED] mark=0 use=2
ipv4 2 tcp 6 431997 ESTABLISHED src=192.168.1.18 dst=192.168.1.1 sport=50070 dport=80 src=10.10.10.10 dst=10.10.10.14 sport=80 dport=50070 [ASSURED] mark=0 use=2
对于Miiicasa 抓到的相应记录如下, 记录正常:
pv4 2 tcp 6 418 ESTABLISHED src=192.168.1.18 dst=192.168.1.1 sport=52047 dport=80 src=10.10.10.10 dst=10.10.10.14 sport=80 dport=52047 [ASSURED] mark=0 use=1
ipv4 2 tcp 6 418 ESTABLISHED src=192.168.1.18 dst=192.168.1.1 sport=52045 dport=80 src=10.10.10.10 dst=10.10.10.14 sport=80 dport=52045 [ASSURED] mark=0 use=1
2.b