无状态TCP的ip_conntrack

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:
Linux的ip_conntrack实现得过于沉重和精细。而实际上有时候,根本不需要在conntrack中对TCP的状态进行跟踪,只把它当UDP好了,我们的需求就是让系统可以将一个数据包和一个五元组标示的流相关联,因为很多的基于流的策略都设置在conntrack结构中,所以当关联好之后,就可以直接取出策略来作用于数据包了,不再需要为每一个数据包都来一次策略匹配。
        TCP的状态本就不应该在途中被检测,这也是TCP/IP的设计者的中心思想。还好,Linux提供了两个sysctl参数可以在一定程度上放弃对TCP状态的精细化监控,它们是:
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.ip_conntrack_tcp_be_liberal = 1
相关的代码解释是:
/* "Be conservative in what you do,     be liberal in what you accept from others."     If it's non-zero, we mark only out of window RST segments as INVALID. */ static int nf_ct_tcp_be_liberal __read_mostly = 0;  /* If it is set to zero, we disable picking up already established    connections. */ static int nf_ct_tcp_loose __read_mostly = 1; 

在ip_conntrack的逻辑中,如果一个包没有在conntrack哈希中找到对应的流,就会被认为是一个流的头包,流程如下:

TCP对数据包的要求太高了,在上述的loose参数不为1的情况下,tcp_new要求新到来的第一个包必然要有SYN标志,否则不予创建conntrack,数据包将成为游离数据包,NAT等都将失去作用,即便是中间的数据包,be_liberal不为1时,tcp_packet要求数据包必须in_window。这就是为何TCP的establish conntrack超时时间设置5天那么久的原因,还好,有上述两个参数,我们可以避开这个,将TCP尽可能地和UDP同等对待。我的方式更猛,索性将TCP的nf_conntrack_l4proto换成了nf_conntrack_l4proto_udp4,这样连sysctl参数都不用设置了。
NAT问题的解释

一条TCP连接,经过Linux Box,被NAT,过了120秒+之后,连接断开!这个解释很简单,我将net.netfilter.nf_conntrack_tcp_timeout_established设置成了120秒,此后conntrack超时被删除!再有数据时,按照上面的tcp_new流程,数据包将成为游离数据包,NAT依赖conntrack,故失效,连接依赖NAT,故而连接失效!


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1268853


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
基于阿里云,构建一个企业web应用上云经典架构,让IT从业者体验企业级架构的实战训练。
相关文章
|
网络协议
TCP协议的状态
TCP协议的状态
101 0
|
网络协议 Linux
TCP状态转换图文解说
TCP状态转换图文解说
244 0
TCP状态转换图文解说
|
监控 网络协议 网络安全
zabbix自定义TCP 11种状态监控模板(十四)
zabbix自定义TCP 11种状态监控模板 如果一直对多个主机同时增加监控项那么会非常麻烦,在实际生产中有很多时候我们都需要对一批机器同时增加多个相同的监控项,如果一个一个手动添加将会非常麻烦,因此就有了模板的诞生,我们只需要创建一个模板,让需要监控的主机链接模板即可
250 0
zabbix自定义TCP 11种状态监控模板(十四)
|
编解码 网络协议 网络架构
计算机网络基础 和 tcp 三次握手四次挥手,tcpdump抓包分析 协议过滤 分析,连接状态,标志位详解
wireshark 软件过滤及转码使用 ,TCP tcpdump 连接状态,标志位详解
247 1
|
网络协议 安全 Linux
查看http的并发请求数与其TCP连接状态
查看http的并发请求数与其TCP连接状态
322 0
|
网络协议
分析几种TCP状态转换中的非正常转换
  1、服务器从listen状态变成close状态的原因:   服务器在监听端口的时候,此时有些资源加载的有问题导致服务没开启,此时服务器会从listen状态变成closed状态。
951 0
|
网络协议 Linux PHP
TCP TIME_WAIT状态解析及问题解决
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/80557158 一、TCP四次挥手过程 TCP在建立连接时需要握手,同理,在关闭连接的时候也需要握手。
2526 0
|
网络协议
《UNP》学习之TCP状态转换
CLOSED:TCP起始状态 LISTEN:绑定端口后进入listen状态,一般是服务端 SYN_SENT:发送SYN连接请求,主动打开连接的一方进入SYN_SENT SYN_RCVD:接收到SYN连接请求后进入SYN_RCVD,同时发送SYN,ACK。
1140 0