(*pskb)->nfct = &ip_conntrack_untracked.info[IP_CT_NEW];
事实上将一个占位者设置给skb的nfct,这样可以保持其它代码的一致性。可见,必要时同时采取三种方式比较有效:1.增大conntrack_max;2.减少状态保存时间;3.分离无关流量。然而除了第三种方式,其余两种方式在操作时必须给自己十足的理由那么做才行,对于1,比必须明白内核内存被占有的方式,对于2,看看本文的前半部分。
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
最后有个提问:对于没有keepalive的TCP连接而言,试想服务器和客户端在establish状态之后5天内都没有互相通信,5天后的一天,服务器主动发送了一个数据包给客户端,然而此时防火墙/NAT设备上的conntrack状态已经过期被删除,此时该数据包将会被认为是NEW状态的数据包,被DROP,客户端永远收不到这个数据包,进而也不会发送ACK,服务器端不断重发,不断被防火墙DROP,当重发次数达到一定次数后,服务器RESET该连接,然而客户端如何得知,只有客户端主动发包才能打破这个僵局,然而谁能保证客户端一定会主动发包?这是不是Linux的ip_conntrack的一种缺陷,设计5天时间的establish状态是不是一种极限措施,然而谁又能保证5天内两端不断通信呢?