CentOS通过raw表实现iptables日志输出和调试

2024-05-04 08:38

本文主要是介绍CentOS通过raw表实现iptables日志输出和调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

当系统上iptables规则过多时,如果有出现丢包或者网络不通需要查看原因时,调试iptables规则就成了一个绕不过的问题。

关于raw表

下面我们分别在CentOS 6和CentOS 7系列上配置iptables的调试日志,这主要都是通过raw表实现的。因为raw表在所有iptables规则中优先级是最高的,raw表有两条链,prerouting和output,分别作为输入和输出的第一必经点,因此作为调试是最合适不过。

环境准备

我们以调试ipv4 的ICMP报文为例,进行日志的采集。因此在机器上添加一下规则,

iptables -t raw -A PREROUTING -p icmp -j TRACE
iptables -t raw -A OUTPUT -p icmp -j TRACE

1. CentOS 6系列

由于iptables的调试日志输出依赖于内核模块,这些内核模块并不是开机就加载的,因此我们需要手动加载,在CentOS 6系列上iptables日志输出依赖于ipt_LOG(LOG是大写的)模块,所以手动加载该模块,

modprobe ipt_LOG

加载完后,我们可以通过以下命令确认下是否成功,

[root@CentOS-6-5 localhost]# sysctl net.netfilter.nf_log.2
net.netfilter.nf_log.2 = ipt_LOG

如果为NULL,那么就失败了。

2. CentOS 7系列

对于CentOS 7系列,和6系列不同,依赖的iptables日志模块不再是ipt_LOG,而是nf_log_ipv4,因此需要手动加载该模块,

[root@CentOS-7-3 localhost]# modprobe nf_log_ipv4
[root@CentOS-7-3 localhost]# sysctl net.netfilter.nf_log.2
net.netfilter.nf_log.2 = nf_log_ipv4

实际操作

我们在系统上ping其他机器的ip,

ping -c 1 192.168.0.100

为了方便观察,我们只ping一个报文。然后查看系统/var/log/messages日志,就会发现有调试日志输出,

May 19 05:08:35 CentOS-6-5 kernel: TRACE: raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=25571 SEQ=1 UID=0 GID=0 
May 19 05:08:35 CentOS-6-5 kernel: TRACE: nat:OUTPUT:policy:1 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=25571 SEQ=1 UID=0 GID=0 
May 19 05:08:35 CentOS-6-5 kernel: TRACE: filter:OUTPUT:policy:1 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=25571 SEQ=1 UID=0 GID=0 
May 19 05:08:35 CentOS-6-5 kernel: TRACE: nat:POSTROUTING:policy:1 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=25571 SEQ=1 UID=0 GID=0 May 19 05:08:35 CentOS-6-5 kernel: TRACE: raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=00:0c:29:91:3a:d6:00:0c:29:f6:b3:f3:08:00 SRC=192.168.0.100 DST=192.168.0.120 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=25248 PROTO=ICMP TYPE=0 CODE=0 ID=25571 SEQ=1 
May 19 05:08:35 CentOS-6-5 kernel: TRACE: filter:INPUT:rule:1 IN=eth0 OUT= MAC=00:0c:29:91:3a:d6:00:0c:29:f6:b3:f3:08:00 SRC=192.168.0.100 DST=192.168.0.120 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=25248 PROTO=ICMP TYPE=0 CODE=0 ID=25571 SEQ=1

可见,前面三条日志是icmp request报文经由raw表OUTPUT链->nat表OUTPUT链->filter表OUTPUT链->nat表POSTROUTING链出去;后面两条是icmp reply报文经由raw表PREROUTING链->filter表INPUT链回来。

构造异常

我们构造一种异常,在机器上添加一条规则,在filter表的OUTPUT链上配置丢弃目标ip的icmp报文,

iptables -t filter -A OUTPUT -d 192.168.0.100 -j DROP

此时我们再ping一次目标机器,会发现/var/log/messages中的日志如下,

May 19 05:20:13 CentOS-6-5 kernel: TRACE: raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=9700 SEQ=1 UID=0 GID=0 
May 19 05:20:13 CentOS-6-5 kernel: TRACE: nat:OUTPUT:policy:1 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=9700 SEQ=1 UID=0 GID=0 
May 19 05:20:13 CentOS-6-5 kernel: TRACE: filter:OUTPUT:rule:1 IN= OUT=eth0 SRC=192.168.0.120 DST=192.168.0.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=9700 SEQ=1 UID=0 GID=0

可见,报文到了filter表的OUTPUT链的第一条规则(rule:1)后就被处理了,因此我们查看下iptables的filter规则,

[root@CentOS-6-5 /var/log]# iptables-save
......
*filter
......
-A OUTPUT -d 192.168.0.100/32 -j DROP 
COMMIT
# Completed on Sun May 19 05:21:36 2019

确实有这条规则,因此删除该条规则,通行即可恢复正常。

iptables -t filter -D OUTPUT 1

这篇关于CentOS通过raw表实现iptables日志输出和调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958790

相关文章

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

spring6+JDK17实现SSM起步配置文件

《spring6+JDK17实现SSM起步配置文件》本文介绍了使用Spring6和JDK17配置SSM(Spring+SpringMVC+MyBatis)框架,文中通过示例代码介绍的非常详细,对大家的... 目录1.配置POM文件2.在resource目录下新建beans.XML文件,用于配置spirng3