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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机