Linux网络调试:iptables规则、连接跟踪表、报文跟踪

作者:李佶澳  更新时间:2018/09/01 15:27:24

  技巧    linux    刷新

目录

说明

在调查kubernetes的node上的重启linux网络服务后,pod无法联通的问题时,突然发现,没有掌握一套行之有效的调试linux网络的方法,诸如iptables规则、连接跟踪表以及跟踪报文的方法。

在iptables中追踪报文 – iptables

相关笔记:

iptables:Linux的iptables使用

使用LOG模块在任意位置打印报文信息

linux的iptables使用中介绍了一种调试方法:使用LOG模块打印日志

#在/etc/rsyslog.conf添加
kern.=debug     /var/log/kern.debug.log

可能需要手动创建文件/var/log/kern.debug.log

重启rsyslog:

touch /var/log/kern.debug.log
systemctl restart rsyslog

之后可以添加如下的iptables规则,当报文到达该规则时,会在/var/log/kern.debug.log中打印出日志:

iptables -t raw -A OUTPUT -m limit --limit 5000/minute -j LOG --log-level 7 --log-prefix "raw out: "

打印出来的日志如下:

Jun 13 19:58:21 dev-slave-110 kernel: raw prerouting: IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=13629 SEQ=15

和其它iptables一样,也可以添加IP、端口等条件:

iptables -t raw -A PREROUTING -p icmp -s 8.8.8.8/32 -m limit --limit 500/minute -j LOG --log-level 7 --log-prefix "mangle prerouting: "

iptables:Linux的iptables使用中有更多使用示例。

使用TRACE模块对报文进行全程跟踪

TRACE只能在raw表中使用

netfilter/iptables/conntrack debugging中给出了另一个方法,通过-j TRACE

iptables -t raw -A PREROUTING -p icmp -s 8.8.8.8/32 -j TRACE

man iptables-extensions中可以找到对TRACE的介绍:

This target marks packets so that the kernel will log every rule which match
the packets as those traverse the tables, chains, rules.

TRACE模块会在符合规则的报文上打上标记,将该报文经过的每一条规则打印出来,很方便的对报文做全程跟踪。TRACE模块只能在raw表中使用,还需要加载内核模块:

modprobe ipt_LOG ip6t_LOG nfnetlink_log

之后可以通过dmesg,或者在/var/log/message中查看到匹配的报文的日志:

Jun 16 17:44:05 dev-slave-110 kernel: TRACE: raw:PREROUTING:rule:2 IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=4064 SEQ=24
Jun 16 17:44:05 dev-slave-110 kernel: TRACE: raw:cali-PREROUTING:rule:1 IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=4064 SEQ=24
Jun 16 17:44:05 dev-slave-110 kernel: TRACE: raw:cali-PREROUTING:rule:3 IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=4064 SEQ=24
Jun 16 17:44:05 dev-slave-110 kernel: TRACE: raw:cali-from-host-endpoint:return:1 IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=4064 SEQ=24
Jun 16 17:44:05 dev-slave-110 kernel: TRACE: raw:cali-PREROUTING:return:5 IN=eth0 OUT= MAC=52:54:15:5d:39:58:02:54:d4:90:3a:57:08:00 SRC=8.8.8.8 DST=10.39.0.110 LEN=84 TOS=0x00 PREC=0x00 TTL=32 ID=0 PROTO=ICMP TYPE=0 CODE=0 ID=4064 SEQ=24

查看连接跟踪表 – conntrack

安装:

yum install -y conntrack-tools

使用:

$ conntrack -h
Command line interface for the connection tracking system. Version 1.4.4
Usage: conntrack [commands] [options]

Commands:
  -L [table] [options]        List conntrack or expectation table
  -G [table] parameters       Get conntrack or expectation
  -D [table] parameters       Delete conntrack or expectation
  -I [table] parameters       Create a conntrack or expectation
  -U [table] parameters       Update a conntrack
  -E [table] [options]        Show events
  -F [table]            Flush table
  -C [table]            Show counter
  -S                    Show statis

连接跟踪表的参数可以在kernel文档Documentation/networking/nf_conntrack-sysctl.txt中找到。

参考

  1. kubernetes的node上的重启linux网络服务后,pod无法联通
  2. linux的iptables使用-调试方法
  3. netfilter/iptables/conntrack debugging
  4. nftables HOWTO
  5. 利用raw表实现iptables调试
  6. iptables:Linux的iptables使用

站长微信(朋友圈有精华,一般不闲聊)

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  李佶澳的博客  小鸟笔记  软件手册  编程手册  运营手册  爱马影视  网络课程  奇技淫巧  课程文档  精选文章  发现知识星球  百度搜索 谷歌搜索