一次防火墙无法重启的排查过程和总结

事情是这样的,昨天下午本人正在苦逼的搬砖,旁边的同事突然说有台服务器的防火墙无法启动了。昨天该同事一直在补每台服务器的防火墙规则漏洞,发现这台服务器的防火墙规则和配置文件中的不一样,就想重启一下结果无法启动了。

以前也遇到过系统上正在运行的防火墙规则和配置文件的不一致,一般都是重启下防火墙就可以了,这台服务器估计是上架后没有注意一直没有发现,所以就想补下这个漏洞。

然后我就上服务器操作了下,service iptables restart 没反应,一直卡在“应用防火墙规则”这一步,service iptables status 提示没有加载防火墙模块,第一个反应就是模块不知怎么的没有了,那就手动加载下呗,

modprobe ip_tables 没反应,停掉。仔细一想,防火墙启动的时候会自动加载相关模块,没有模块是因为防火墙没有启动,那为什么手动加模块没有反应呢。找日志,一般这么妖的问题系统日志总能找到一点蛛丝马迹。

具体日志如下:

INFO: task modprobe:29339 blocked for more than 120 seconds.

Not tainted 2.6.32-431.el6.x86_64 #1

"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

modprobe      D 0000000000000009     0 29339      1 0x00000080

ffff880202857e48 0000000000000086 ffffea0005e17460 ffffffff810129de

ffff880202857dd8 ffffffff811238d1 ffffffff8100bb8e ffff880202857e48

ffff8802bc5c05f8 ffff880202857fd8 000000000000fbc8 ffff8802bc5c05f8

Call Trace:

[<ffffffff810129de>] ? copy_user_generic+0xe/0x20

[<ffffffff811238d1>] ? probe_kernel_write+0x41/0x70

[<ffffffff8100bb8e>] ? apic_timer_interrupt+0xe/0x20

[<ffffffff810555dd>] ? mutex_spin_on_owner+0x8d/0xc0

[<ffffffff8152907e>] __mutex_lock_slowpath+0x13e/0x180

[<ffffffffa01f4000>] ? ip_tables_init+0x0/0xb0 [ip_tables]

[<ffffffff81528f1b>] mutex_lock+0x2b/0x50

[<ffffffffa01f4000>] ? ip_tables_init+0x0/0xb0 [ip_tables]

[<ffffffff8145709d>] register_pernet_subsys+0x1d/0x50

[<ffffffffa01f4015>] ip_tables_init+0x15/0xb0 [ip_tables]

[<ffffffff8100204c>] do_one_initcall+0x3c/0x1d0

[<ffffffff810bc531>] sys_init_module+0xe1/0x250

[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b

时间点比较吻合,根据关键字百度了下,有个人碰到一样的问题,系统日志也极其相似,说是有2个iptables的操作造成死锁了。

文章链接: http://www.ithao123.cn/content-8293762.html

这时候我就仔细问了下同事的操作过程,同事说下完service iptables restart后防火墙一直没有重启完成在等待某个进程的响应,就把这个命令给kill了,再执行service iptables restart就不行了。

那就去看下是否有相关进程卡住了,top后发现有个进程的状态一直是R的状态,根据我的理解(不知道对不对)进程的状态一般都是S(interruptible sleep),这个R状态的进程有点异常,根据top里面的该进程的command去ps果然发现了一个与防火墙相关的异常进程

#ps aux|grep modprobe

有一个加载防火墙内核的进程状态为D,不可中断的睡眠进程,所谓D,就是不接收任何外来信号的进程。果然kill、kill -9 都无法杀死这个进程。处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO。那会不会是IO等待引起的呢。这时候使用iotop去观察服务器的IO情况,并没有发现该进程有大量的IO操作,同时检测NFS的状态也是正常的,那么就不是IO等待引起的。

这个进程到底卡在哪一步了,执行 ps axopid,comm,wchan | grep modprobe

发现进程运行到register_pernet_subsys这一步,搜了下相关资料,register_pernet_subsys就是防火墙启动加载内核模块这一步.

参考资料:http://blog.chinaunix.net/uid-20786208-id-5132450.html

这时候又生一计,这个进程杀不死,那能不能把该进程的父进程给kill了呢,ps一样发现进程的父进程ID居然是1。

正常情况下,子进程被终止时会通过 SIGCHLD 信号通知父进程,父进程可以做一些清理工作或者重新启动一个新的进程。但在某些情况下,父进程会在子进程之前被终止,那么这些子进程就没有了“父亲”,被称为孤儿进程。
init 进程会成为所有孤儿进程的父进程。init 的 pid 为1,是Linux系统的第一个进程,也是所有进程的父进程。

如果把PID为1的进程给kill了,那这个系统基本就瘫痪了。

所以折腾到最后的结果是,只能reboot系统才能解决这个问题。

时间: 2024-08-17 06:28:10

一次防火墙无法重启的排查过程和总结的相关文章

小问题不简单,一个无线故障的排查过程

本文不是为了说明解决了多难的问题,而是提供了查找app连接服务端的问题的几种解决问题的思路和方法 研发人员反映有个手机app业务在3G网络下刷新不了,是连接的测试环境的服务,通过办公网和wifi正常. 研发认为可能是在3G网络或者是服务器所在IDC机房问题,问题出现有一段时间了. 真这么神奇?专治疑难杂症30年的我得查查- 找来一台andriod手机,root过的,安装ssh终端模拟器app,希望直接连接网络进行测试. 发现能ping ,说明网络是通的,不能telnet服务端口. 想通过curl

两起变量初始化问题的排查过程

[文章摘要] 变量初始化看似很简单,但如果初始化位置不当或忘记初始化,则会导致程序行为异常. 本文基于作者的实际项目经验,对近期遇到的两起变量初始化问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考. [关键词] C语言  变量  初始化  开发 一.问题1的排查过程 在对某程序版本进行自测的过程中,发现在程序运行一段时间之后,某指针(pDBConn)就一直为空(NULL),使得该程序的正常流程无法执行. 我们找到了对该指针(pDBConn)进行赋值操作的代码,程序的框架如下: -

记一次生产环境Nginx日志骤增的问题排查过程

摘要:众所周知,Nginx是目前最流行的Web Server之一,也广泛应用于负载均衡.反向代理等服务,但使用过程中可能因为对Nginx工作原理.变量含义理解错误,或是参数配置不当导致Nginx工作异常.本文介绍的就是福建开机广告Nginx的参数location处理静态文件配置不当引发的nginx日志骤增到14G的问题排期过程. 一.问题现象及系统介绍 现象:12月15日 21:02分,正在外面吃宵夜,手机收到监控平台的一条"服务器磁盘空间<20%"报警短信. 系统介绍:为了看此

一次线上页游服务器响应缓慢排查过程

最近线上一组服务器玩家反馈响应缓慢,记录下排查过程. 1.使用top命令查看服务器负载情况, top - 15:59:37 up 26 days,  3:42,  6 users,  load average: 2.98, 2.74, 2.70 Tasks: 180 total,   1 running, 167 sleeping,  12 stopped,   0 zombie Cpu(s):  8.1%us,  2.4%sy,  0.0%ni, 65.7%id, 23.6%wa,  0.0%

记一次erlang 节点CPU严重波动排查过程

新服务上线后观察到,CPU在10 ~ 70%间波动严重,但从每秒业务计数器看业务处理速度很平均. 接下来是排查步骤: 1. dstat -tam 大概每10s一个周期,网络流量开始变得很小,随后突然增大,CPU也激增. 网络流量变化和从性能计数器结果上并不符合,服务相关业务较为复杂,先找出那个业务占用网络流量. 2. iftop 找出流量最大的几个目标IP,并且周期的流量变为0随后激增. 通过IP 知道是外部http接口地址,因为接口调用是异步进行的,性能计算是执行开始记录的,而不是结束记录,因

mysql error code &#39;1064&#39; 排查过程

下午自测代码,在这个update上卡了一个半小时,大大的降低了开发的生产力,把排查过程发出来,好的士兵不会掉进同一个陷阱.先把异常堆栈打出来. 2016-03-28 17:23:38.420 main DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory:463] - Finished creating instance of bean 'Sybase' 2016-03-28 17:23:38.42

一起数据库中过期用户数据堆积问题的排查过程

[文章摘要] 对于使用数据库来存放大量用户的软件来说,过期数据的清理机制需要慎重设计.如果设计不当,则会导致数据的误删除或清理不完全. 本文对某数据清理模块因参数配置不当而导致的过期用户数据堆积问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考. 一.问题描述 在某软件系统中,为了让不同种类的用户享受对应的服务,引入了一个信箱服务等级的概念,即不同服务等级的用户具有不同的权限."一分钱,一分货",对于运营商来说,高服务等级的用户收取高的资费,提供高质量的服务. 为了维护不

记crond导致备份失败的排查过程

今天上班的路上收到一条短信,显示线上所有实例备份都失败了.备份失败是大事,于是到公司的第一件事儿就是排查备份失败的原因. 这两天迁移了数据库管理平台,当然涉及到数据库备份功能,备份失败肯定和平台迁移有一定关系,我们先聊聊线上备份方案: 目前线上的备份方案是: 1.有一个前端页面可以配置备份任务 2.备份任务配置好了,会自动刷新到系统的crontab定时通过ansible远程执行. 排查过程: 1.查看备份报告,显示所有的备份文件大小都是0,初步估计是备份失败了而不是元数据没有更新的问题. 2.去

一起空指针引发的程序问题的排查过程

      [文章摘要] 在C程序中,指针操作是难点和精华所在.指针一旦使用不当,极有可能造成程序的崩溃. 本文对一空指针引发的程序问题的排查过程进行了详细的介绍,为相关软件问题的分析及解决提供了有益的参考. 一.问题描述 最近,某程序在测试过程中突然崩溃.日志中出现如下内容: #0  0xf64f2b3a in FunctionA(event=666,dlgindex=0, ucErrNo=1 '\001') at src/A.c:6838 #1  0xf64e3a4f in Function