nf_conntrack: table full, dropping packet.问题解决

centos6下在并发量大的时候出现这样的报错

nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.
nf_conntrack: table full, dropping packet.

看一下 nf_conntrack 表里的记录及数量

less /proc/net/nf_conntrack

wc -l /proc/net/nf_conntrack

如果表满了会连 ssh 都连不上来

默认表的最大值是 65535

cat /proc/sys/net/nf_conntrack_max

需要临时加大

echo ‘100000’ > /proc/sys/net/nf_conntrack_max

需要永久生效

在 /etc/sysctl.conf 里添加

net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 1200

这里有个坑,如果在没有开启 iptables 的情况下使用

iptables -L -t nat

会导致加载 nf_conntrack 并使用默认值, sysctl 里的值就不生效了

这时需要重启一下 iptables 才能加载 sysctl 中的值

使用iptables遇到nf_conntrack table full

环境 centos 6.6

在/var/log/messages看到报错

kernel: nf_conntrack: table full, dropping packet.

nf_conntrack 默认最大值 65536

cat /proc/sys/net/ipv4/ip_conntrack_max | wc -l

超过这个 65536 便会报错。

现在将值改为 655360 并且永久生效

首先修改/etc/sysctl.conf

net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 1200

然后修改/etc/sysconfig/iptables-config
注意如下两行

IPTABLES_MODULES="ip_conntrack"
IPTABLES_SYSCTL_LOAD_LIST=".nf_conntrack"

之后重新 iptables.

mysql绑定多个ip地址

my.cnf中有选项bind-address=127.0.0.1,是说mysql server监听的是本地发来的请求,如果是任意主机都可以请求,则写为0.0.0.0,但是这样又不太安全。监听某ip,指定此ip地址即可,但是要保证mysql的user中有允许此ip访问,否则不能对数据库操作。那么是否可以在配置里只规定几个ip呢?

简单直接回答:不可能

请参考:http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_bind-address

The MySQL server listens on a single network socket for TCP/IP connections. This socket is bound to a single address, but it is possible for an address to map onto multiple network interfaces. The default address is 0.0.0.0. To specify an address explicitly, use the –bind-address=addr option at server startup, where addr is an IPv4 address or a host name. If addr is a host name, the server resolves the name to an IPv4 address and binds to that address. The server treats different types of addresses as follows:

If the address is 0.0.0.0, the server accepts TCP/IP connections on all server host IPv4 interfaces.
If the address is a “regular” IPv4 address (such as 127.0.0.1), the server accepts TCP/IP connections only for that particular IPv4 address.

但是有此需求,就会到访问控制,那么使用防火墙iptables可实现此效果

mysql-server为192.168.1.3,只允许192.168.1.4,  192.168.1.5,  192.168.1.6来访问3306端口

在my.cnf中

bind-address = 0.0.0.0

在访问3306端口的主机中,只允许192.168.1.4-6,其他ip一律DROP掉

/sbin/iptables -A INPUT -p tcp -s 192.168.1.4 --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 192.168.1.5 --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 192.168.1.6 --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.4 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.5 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.6 -j DROP

保存防火墙规则

service iptables save

查看INPUT链包含3306的规则

echo -e "target prot opt source destination\n$(iptables -L INPUT -n | grep 3306)"

这样就实现了mysql只允许指定ip访问。

参考:

http://www.cyberciti.biz/faq/unix-linux-mysqld-server-bind-to-more-than-one-ip-address/

iptables的表和链

iptables包含4个表,5个链

其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度

4个表:filter, nat, mangle, raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter

filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前

iptables的ip(ipv4) match

这个内置的匹配不用加 -m (match)就可以实现

internet protocol ip协议

-d [!] addr[/mask] 目标地址或范围
–destination 同-d
–dst 同-d

[!] -f 第二标识,链接追踪会自动识别,不常用

-i [!] 在哪个interface,后面有+,则会匹配所有有这个名字的interface
–in-interface 同 -i

-o [!] 不在哪个interface,后面有+,则不会匹配所有有这个名字的interface
–out-interface 同 -o

-p [!] 原始协议名或识别码,在 /etc/protocols 文件中或参见http://www.iana.org/assignments/protocol-numbers.

-p 隐藏-m选项的,协议如 icmp, tcp, or udp.

-s [!] addr[/mask] 原地址或范围
–source Synonym for -s.
–src Synonym for -s.

可以用老式的 dotted-quad notation 点分四组表示法,如192.168.1.0/255.255.255.0,或

Common Inter-Domain Routing(CIDR)表示法,如192.168.1.0/24