无状态TCP的ip_conntrack

优化Linux TCP Conntrack
本文探讨了Linux系统中TCP conntrack机制存在的问题及其优化方法。通过调整sysctl参数nf_conntrack_tcp_loose和nf_conntrack_tcp_be_liberal,可以简化TCP状态跟踪,使TCP更接近UDP的行为。此外,还介绍了如何通过更改nf_conntrack_l4proto进一步优化TCP处理流程。
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,故而连接失效!
### 配置 `ip_conntrack` 参数 为了优化和调整 Linux 系统中的网络连接跟踪功能,可以修改内核参数来适应不同的需求。对于 `ip_conntrack_in` 相关的配置,主要涉及以下几个方面: #### 增大跟踪的最大条目数量 通过设置 `net.netfilter.nf_conntrack_max` 可以增加系统能够追踪的最大并发连接数。这有助于防止因连接表溢出而导致丢包或其他性能问题。 ```bash echo "3276800" > /proc/sys/net/netfilter/nf_conntrack_max ``` 或者永久化此更改到 `/etc/sysctl.conf` 文件中并应用: ```bash sysctl -w net.netfilter.nf_conntrack_max=3276800 ``` #### 调整协议超时时间 减少某些类型的连接在建立后的最大存活期限可以帮助释放不再活跃的会话记录,从而提高资源利用率。例如,TCP 已建立状态下的默认超时时长可以从常规值缩短至更短的时间间隔。 ```bash sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1200 ``` 同样适用于 UDP 和 ICMP 协议: ```bash sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=180 sysctl -w net.netfilter.nf_conntrack_icmp_timeout=30 ``` 这些操作可以通过编辑 `/etc/sysctl.conf` 来实现持久化的效果[^1]。 #### 故障排查技巧 当遇到与 `ip_conntrack` 相关的问题时,可采取如下措施进行诊断: ##### 查看系统统计信息 利用 `netstat` 或者更为现代的替代品如 `ss` 命令来获取有关当前活动连接的信息,并过滤掉特定错误条件的数据。 ```bash netstat -s | grep "dropped because of missing route" ``` ##### 使用 dmesg 日志分析 结合管道命令 (`|`) 对 `dmesg` 输出的日志消息进行筛选,以便快速定位可能存在的警告或错误提示。 ```bash dmesg | less ``` 也可以直接使用 `grep` 结合关键词搜索具体的异常情况。 ##### 安装必要的工具集 如果发现缺少一些常用的网络调试工具,则可通过软件包管理器安装它们,比如 `traceroute`, `ifconfig`, `netstat` 等等。 ```bash yum -y install traceroute net-tools lrzsz ``` 以上步骤能帮助更好地理解和解决与 `ip_conntrack` 机制相关的各种挑战[^3][^4].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值