`

浅析 /proc/net/nf_conntrack 文件(转)

 
阅读更多
/proc/net/nf_contrack 是连接跟踪文件,它里面的内容由 nf_conntrack.ko 模块写入。在 iptables 中使用 -m state 选项时,iptables 不但加载 xt_state.ko 模块,且 nf_conntrack.ko 模块也会被加载进来。一般而言,xt_state.ko 和 nf_conntrack.ko 这两个模块在许多 Linux 发行版里是默认编译进内核的。
下面通过几个试验来浅析一下 nf_conntrack 中的内容。
先打开一个已经连接不上了的网站,然后查看一下该文件内容:
[root@beyes   beyes]# cat /proc/net/nf_conntrack

ipv4     2 udp      17 168 src=192.168.1.104 dst=192.168.1.1 sport=53221 dport=53 src=192.168.1.1 dst=192.168.1.104 sport=53 dport=53221 [ASSURED] mark=0 zone=0 use=2
ipv4     2 tcp      6 115 SYN_SENT src=192.168.1.104 dst=66.85.191.46 sport=49535 dport=80 [UNREPLIED] src=66.85.191.46 dst=192.168.1.104 sport=80 dport=49535 mark=0 zone=0 use=2
ipv4     2 tcp      6 116 SYN_SENT src=192.168.1.104 dst=66.85.191.46 sport=49536 dport=80 [UNREPLIED] src=66.85.191.46 dst=192.168.1.104 sport=80 dport=49536 mark=0 zone=0 use=2
ipv4     2 udp      17 19 src=192.168.1.104 dst=192.168.1.1 sport=43652 dport=53 src=192.168.1.1 dst=192.168.1.104 sport=53 dport=43652 mark=0 zone=0 use=2
  
将上面的每一行,根据每个空白所分隔作为一个字段,比如第 1 个字段是 ipv4,第 2 个字段是 2,第 3 个字段是 udp 等。
首先看第 1 条记录
该条记录主要是描述 DNS 解析的。首先客户端对服务器发出一个请求包,当这个数据报到达防火墙时,该连接在 state 模块里就认为是 NEW 状态,因此, nf_conntrack 模块随即将该连接信息添加到  /proc/net/nf_contrack 文件中来。下面是主要字段的说明:
第 3 个字段表示使用 udp 协议。
第 4 个字段中的 17 表示 udp 的协议编号,可以在 /etc/protocols 文件中查询到。
第 6 和 第 7 个字段  src=192.168.1.104 dst=192.168.1.1 分别指出了发出 udp 包的源地址 192.168.1.104 和发往的目的地址 192.168.1.1 。这里需要说明的是,我这里的上网环境是路由器拨号,个人计算机接在路由器上。因此,对于客户机来说,路由器192.168.1.1 是一个 DNS,而真正的 DNS 是在路由器里设置的,比如可以自动获取 ISP 所提供的 IP 或者自定义一个。
第 8 到第 13 个字段指出了客户机和路由器的 IP 地址,以及通讯时所用的端口,DNS 服务器使用 53 端口,客户机则随机使用。
第 14 个字段 [ASSURED] 表示客户端和路由器之间的连接已经确认。
第 5 个字段的值关系到两个文件,一个是 /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream ,另一个是  /proc/sys/net/netfilter/nf_conntrack_udp_timeout 。第 1 个文件中的值是 180,第 2 个文件中的值是 30 。像上面第 1 条 DNS 查询记录,当建立连接后,连接记录就会写到 /proc/net/nf_contrack 文件中,然后就开始从 180 秒(nf_conntrack_udp_timeout_stream)倒计时,如果时间到那么就将该条记录从文件中删除。如果 DNS 查询在发出后的 30 秒(nf_conntrack_udp_timeout)内还不能得到服务器的回应,那么也会删除掉该条记录,注意若是这种情况,那第 14 个字段的值为 [UNREPLIED],表示服务器不响应客户端。
再看第 2, 第 3 条记录
在了解了上面的第 1 条记录后,第 2, 第 3 条记录的解释也就大同小异了。注意看到,它的第 14 个字段的值是 [UNREPLIED] ,表示服务器无法响应客户端的请求。另外,第 6 个字段 SYN_SENT 表示连接状态。在 TCP 协议中,在客户端发送带有 SYN 标记的数据包后,这条 TCP 的连接状态就会设置为 SYN_SENT (顾名思义,已经发送了 SYN),当这个带有 SYN 标记的数据包送达防火墙时,防火墙上的 TCP 连接状态也会设置为 SYN_SENT,而对于 state 模块来说,则是 NEW 状态。接着,服务器的应答数据包里会带有 SYN 和 ACK 标记,如果能收到该应答包,那么 TCP 的连接就进入 SYN_RECV 状态。如果没有等到服务器的应答,那么防火墙就必须根据第 5 个字段的信息来处理这条连接。
第 5 个字段和上面的 UDP 的一样,也是一个时间值。它表示,如果客户端在超过 120 秒后还无法得到服务器端的应答,那么该连接状态在防火墙上就要被清除。这个 120 秒是由 /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_sent 文件所给出。
当服务器对 SYN 请求发出应答数据包时,TCP 连接进入 SYN_RECV 状态,当应答数据包通过防火墙时,防火墙在 nf_conntrack 文件中也会将状态更新为 SYN_RECV。此时,对于 state 模块来说,它就是一个 ESTABLISHED 状态了。如果客户端不能接着响应服务器,那么防火墙在 60 秒后会清除该连接记录,这个 60 秒是由 /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_recv 文件所给出的。
最后,当客户端和服务器端完成三次握手 后,nf_conntrack 模块也会将 /proc/net/nf_contrack 文件中的连接信息更新为 ESTABLISHED。注意,这里的 ESTABLISHED 状态是 TCP 连接状态,而不是 state 模块所描述的 ESTABLISHED 状态,state 的 “连接” 状态已经在TCP 的 SYN_RECV 时已经设立。当 TCP 的 ESTABLISHED 状态建立后,客户端和服务器就通过该条连接传输数据与通讯。如果在连接建立后,但一直没有传输任何数据包,那么防火墙会在 432000 秒之后清除该条记录,此时客户端和服务器端的连接将被迫中断。432000 这个时间值由 /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established 这个文件给出。如果在此时间内,如果又有数据传输,那么这个值又自动恢复为 432000 自动延续生命周期。
分享到:
评论

相关推荐

    AppTrafficAnalyzer,一个应用程序,可以通过读取/proc/net/xt_qtaguid/stats来分析应用程序的流量.zip

    它通过读取Linux内核的特定文件`/proc/net/xt_qtaguid/stats`来获取数据,以此来实现对应用流量的详细监控。这个工具对于开发者、系统管理员以及普通用户来说都非常有用,因为它可以帮助他们了解哪些应用程序在后台...

    linux 操作系统 GTK /proc文件 系统监视器

    4. **网络监控**:`/proc/net/dev`文件提供了网络接口的接收和发送字节数,可以用来监测网络流量。 5. **进程监控**:`/proc`目录下每个数字目录对应一个进程,通过遍历这些目录,可以获取到进程的CPU和内存使用...

    读取/proc/cpuinfo获取CPU信息demo

    在Linux操作系统中,`/proc/cpuinfo`是一个虚拟文件,它提供了系统CPU的详细信息。这个文件并不存储在硬盘上,而是由内核动态生成,每次读取时都会反映出当前系统的实时状态。通过读取`/proc/cpuinfo`,我们可以获取...

    读取/proc/cmdline 文件中的标志位信息

    ### 读取/proc/cmdline 文件中的标志位信息 #### 概述 在Linux系统中,`/proc/cmdline` 文件记录了系统启动时传递给内核的命令行参数。这些参数对于理解系统的启动配置至关重要,并且对于进行系统调试、故障排查...

    linux /proc 文件 系统监控器 GTK

    6. **/proc/net/***:网络相关的信息,如网络接口状态、连接统计等。 7. **/proc/进程ID/status**:每个进程的详细信息,包括PID、状态、优先级、内存使用等。 GTK(GIMP Toolkit)是用于创建图形用户界面的库,...

    Linux内核参数优化调整

    - `/proc/sys/net/ipv4/tcp_wmem` 和 `/proc/sys/net/ipv4/tcp_rmem`:设定TCP连接的写入和读取缓冲区大小,推荐值分别为8192、436600、873200字节。 - `/proc/sys/net/core/somaxconn`:设定`listen()`函数的最大挂...

    linux 内存清理/释放命令总结

    echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: dmidecode | grep -A16 Memory Device$ # sync # echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/...

    /proc 文件分析

    * `/proc/meminfo`:提供了内存的信息,例如总内存、可用内存、交换空间等。 * `/proc/process`:提供了进程的信息,例如进程的 ID、名称、状态等。 * `/proc/diskstats`:提供了磁盘的信息,例如磁盘的大小、使用...

    通过Linux系统的内核观察/proc/pid/statm

    通过 Linux 系统的内核观察 /proc/pid/statm 通过 Linux 系统的内核观察 /proc/pid/statm 输出解释了 CPU 以及 CPU0 等的每行的每个参数的意思。其中,/proc/pid/statm 的输出结果可以分为两大类:一类是任务虚拟...

    MTK Android常用的命令记录(CPU-GPU频率调整等).pdf

    2. **固定GPU频率**:可以通过写入特定值到`/proc/gpufreq/gpufreq_opp_freq`来固定GPU频率,例如`echo 450000 > /proc/gpufreq/gpufreq_opp_freq`。若要恢复动态电压和频率调整(DVFS),可写入0,如`echo 0 > /...

    使用 /proc 文件系统来访问 Linux 内核的内容.rar

    /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件...

    NetfilterConnectionELK:快速的bash脚本记录iptables的netfilter跟踪日志,并将日志发送到ELK堆栈进行图形化和警报

    /bin/bashconns= $( cat /proc/sys/net/netfilter/nf_conntrack_count )echo " $( date ) $( hostname ) $( hostname -i ) nf_conntrack $conns " >> /var/log/conntrack #####在CentOS 7中,脚本略有不同#!...

    Qt实现的基于/proc的Linux资源管理器

    基于Ubuntu下/proc虚拟文件系统实现的类似Windows的资源管理器,文章介绍:https://blog.csdn.net/z18223345669/article/details/122377005;内含项目文件和设计报告

    支持linux百万级并发的参

    支持linux百万级并发的参数, To support over 500k users, you *need* - A 64 bits hardware/kernel (AMD64, Opterons) - At least 8GB of ram - A recent linux kernel ...echo 7 >/proc/sys/net/ipv4/tcp_retries2

    Linux系统的参数配置优化技巧

    6. **TCP连接已建立状态的超时时间**:通过`echo "1800" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established`,将已建立连接的超时时间从5天缩短为半小时,这有助于减少无效连接占用资源,防止...

    hello_proc.tar.gz_device_create_file_proc_hello

    3. **创建/proc文件**:接着,你可以创建一个/proc下的文件,如`/proc/device_name`。当用户空间应用程序读写这个文件时,内核模块会接收到相应的请求并处理。 4. **处理I/O请求**:在内核模块中,定义read、write...

    linux驱动开发proc文件初步

    在`/proc/sys/fs`目录下,可以找到与文件系统相关的内核参数,比如最大文件大小限制、文件句柄的最大数量等。 **2.2 /proc/sys/fs/binfmt_misc - 二进制可执行格式杂项** `/proc/sys/fs/binfmt_misc`包含了与二...

    proc文件系统简介

    5. **网络信息**:网络相关的状态可以通过`/proc/net`子目录下的文件查看,如`/proc/net/dev`列出网络接口的统计信息,`/proc/net/tcp`和`/proc/net/udp`则展示了TCP和UDP套接字的状态。 6. **系统统计**:`/proc/...

    set_irq_affinity

    通过把sudo service irqbalance stop;...irq=$(cat /proc/interrupts | grep eth1 | cut -d':' -f 1); echo $irq for i in $irq ; do sudo cat /proc/irq/$i/smp_affinity_list ; done 查看绑定后的效果

    Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名

    当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无...

Global site tag (gtag.js) - Google Analytics