解决数据库连接check_ping报错Operation not permitted

发现前端机check_ping经常告警,无法连接数据库
测试方法,在报警的server上ping 数据库server的域名:
[root@shjq-websrv8 ~]# ping s3306.db.com.cn
PING s3306.db.com.cn (10.173.10.12) 56(84) bytes of data.
64 bytes from s3306.db.com.cn (10.173.10.12): icmp_seq=1 ttl=64 time=0.144 ms
64 bytes from s3306.db.com.cn (10.173.10.12): icmp_seq=2 ttl=64 time=0.157 ms
64 bytes from s3306.db.com.cn (10.173.10.12): icmp_seq=3 ttl=64 time=0.164 ms
ping: sendmsg: Operation not permitted
64 bytes from s3306.db.com.cn (10.173.10.12): icmp_seq=8 ttl=64 time=0.160 ms
64 bytes from s3306.db.com.cn (10.173.10.12): icmp_seq=9 ttl=64 time=0.162 ms
报错:ping: sendmsg: Operation not permitted
查看系统日志:
[root@shjq-websrv8 ~]# vim /var/log/messages
122204 Mar 7 15:14:11 shjq-websrv8 kernel: printk: 363 messages suppressed.
122205 Mar 7 15:14:11 shjq-websrv8 kernel: ip_conntrack: table full, dropping packet.
122206 Mar 7 15:14:16 shjq-websrv8 kernel: printk: 418 messages suppressed.
122207 Mar 7 15:14:16 shjq-websrv8 kernel: ip_conntrack: table full, dropping packet.
122208 Mar 7 15:14:21 shjq-websrv8 kernel: printk: 887 messages suppressed.
PS:
NAT(Network Address Translation,网络地址转换)是将IP数据报报头的IP地址转化成另外一个IP地址的过程,
主要用来实现局域网内的机器访问公共网络(俗称外网)的功能。
公共IP地址是指在因特网上全球唯一的IP地址,RFC 1918协议还为局域网预留出了三个IP不会在公网上进行分配的地址块:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
这些IP地址就可以用来分配给局域网上的各种设备,这些设备在访问外网时,就需要通过一台NAT服务器进行路由转换,
通常情况下,路由器就兼备了这样一个功能。除了路由器,也可以配置linux服务器实现NAT功能。
ip_conntrack就是linux NAT的一个跟踪连接条目的模块,
ip_conntrack模块会使用一个哈希表记录 tcp 通讯协议的 established connection记录,
当这个哈希表满了的时候,便会导致nf_conntrack: table full, dropping packet错误。
ip_conntrack代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,即内核中的ip-sysctl函数配置。
每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,当这张表满了,就会在日志里面写入以上信息(ip_conntrack: table full, dropping packet)
[root@shjq-websrv8 ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
65536
[root@shjq-websrv8 ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
64603
发现实际连接数跟最大允许连接数相差无几,就是这个原因导致的报错
解决办法:
[root@shjq-websrv8 ~]# vim /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 96778 #默认ip_conntrack_max=65536,需要改大一点
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180 #ip_conntrack_tcp_timeout_established默认是保持连接5天时间,改成180的意思是3小时
[root@shjq-websrv8 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.ip_conntrack_max = 96788
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 10000
再次ping就发现正常了

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注