Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372504
  • 博文数量: 80
  • 博客积分: 6032
  • 博客等级: 准将
  • 技术积分: 730
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-05 20:07
文章分类

全部博文(80)

文章存档

2007年(1)

2006年(22)

2005年(57)

我的朋友

分类: LINUX

2005-10-17 13:19:41

  • 加大ip_conntrack_max.
  • 查看是哪里增加了连接.
  • 马上断开连接
  • 改变默认超时

用NAT上网,最近老是报conntrack表满的错,加大ip_conntrack_max就没问题了.
查看是哪里一下增加了这么多连接.
cat /proc/net/ip_conntrack > /root/conntrack_table
grep 192.168.0.201 conntrack_table > 201_table
居然有1800行,也就是说201这台机器就发出了1800个连接,当然不够.看看端口,688*,还有888*,估计是bt了
暂时封一下吧,不应该在nat中过滤,应该在filter的forward中过滤,因为prerouting只会检查头一次
iptables -t filter -A FORWARD -s 192.168.0.201 -p tcp --dprot ! 22:80 -j DROP
没有新连接增加了,而且原来那1800个马上断开连接了

conntrack established 状态的默认超时时间居然是5天!!!,刚才看到的很多连接都是一天以前的了,为什么默认超时这么长啊?
我现在改成300秒
echo 300 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
把这个超时时间改的太短也不恰当,5天是有5天的道理的,不过是有些长了,但是1天还是不错的。
如果改为300秒的话,当telnet(或ssh)外网的服务器,在空闲300秒后连接就有可能断掉。
/proc/net/ip_conntrack中记录多一些没有什么问题的,因为内核使用的是hash表,所以记录的增多并不会线性的增加处理时间的

在编译时更改超时

Timeouts

Something to note is that timeouts are reset to the maximum each time a connection sees traffic. Timeouts are set in /usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_tcp.c at compile time. Here is the relevant section of code:

static unsigned long tcp_timeouts[]
= { 30 MINS, /* TCP_CONNTRACK_NONE, */
5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */
2 MINS, /* TCP_CONNTRACK_SYN_SENT, */
60 SECS, /* TCP_CONNTRACK_SYN_RECV, */
2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */
2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */
10 SECS, /* TCP_CONNTRACK_CLOSE, */
60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */
30 SECS, /* TCP_CONNTRACK_LAST_ACK, */
2 MINS, /* TCP_CONNTRACK_LISTEN, */
};

There is no absolute timeout for a connection.

conntrack记录

我们先来看看怎样阅读/proc/net/ip_conntrack里的conntrack记录。这些记录表示的是当前被跟踪的连接。如果安装了ip_conntrack模块,cat /proc/net/ip_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
     

conntrack模块维护的所有信息都包含在这个例子中了,通过它们就可以知道某个特定的连接处于什么状态。首先显示的是协议,这里是tcp,接着是十进制的6(译者注:tcp的协议类型代码是6)。之后的117是这条conntrack记录的生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。接下来的是这个连接在当前时间点的状态。上面的例子说明这个包处在状态 SYN_SENT,这个值是iptables显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一TCP SYN包。再下面是源地址、目的地址、源端口和目的端口。其中有个特殊的词UNREPLIED,说明这个连接还没有收到任何回应。最后,是希望接收的应答包的信息,他们的地址和端口和前面是相反的。

连接跟踪记录的信息依据IP所包含的协议不同而不同,所有相应的值都是在头文件linux/include/netfilter-ipv4/ip_conntrack*.h中定义的。IP、TCP、UDP、ICMP协议的缺省值是在linux/include/netfilter-ipv4/ip_conntrack.h里定义的。具体的值可以查看相应的协议,但我们这里用不到它们,因为它们大都只在conntrack内部使用。随着状态的改变,生存时间也会改变。

最近patch-o-matic里有一个新的补丁,可以把上面提到的超时时间也作为系统变量,这样我们就能够在系统空闲时改变它们的值。以后,我们就不必为了改变这些值而重编译内核了。

这些可通过/proc/sys/net/ipv4/netfilter下的一些特殊的系统调用来改变。仔细看看/proc/sys/net/ipv4/netfilter/ip_ct_*里的变量吧。

当一个连接在两个方向上都有传输时,conntrack记录就删除[UNREPLIED]标志,然后重置。在末尾有 [ASSURED]的记录说明两个方向已没有流量。这样的记录是确定的,在连接跟踪表满时,是不会被删除的,没有[ASSURED]的记录就要被删除。连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip- sysctl函数设置。默认值取决于你的内存大小,128MB可以包含8192条目录,256MB是16376条。你也可以在 /proc/sys/net/ipv4/ip_conntrack_max里查看、设置

阅读(1012) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~