追踪网络流量就这么简单 | 小白篇 | iptables

0 阅读4分钟

案例场景

在阿里云服务端部署了 SSH 服务监听其22端口,通过客户端电脑远程连接到SSH服务。目的是追踪服务端入栈的网络流量。

今天我们通过 iptables LOG机制,它允许将匹配特定规则的数据包信息记录到系统日志中,用于调试、监控或审计网络流量。
我们将网络数据包所触发到的链,配置日志规则后达到追踪网络流量的目的。


根据此案例,一条入栈的网络数据包,要经过的iptables表为:raw、mangle、nat、filter、security。经过的链为:PREROUTING、INPUT。

下面将涉及入栈的每个表链中全部增加上 iptables log规则,进行全链路追踪。
raw表

iptables -t raw -I PREROUTING 1 -p tcp --dport 22 -m limit --limit 100/minute -j LOG --log-prefix "raw-prerouting-ssh-in: " --log-level 7

mangle表

iptables -t mangle -I PREROUTING 1 -p tcp --dport 22 -m state --state NEW -m limit --limit 100/minute -j LOG --log-prefix "mangle-prerouting-ssh-in: " --log-level 7
iptables -t mangle -I INPUT 1 -p tcp --dport 22 -m state --state NEW -m limit --limit 100/minute -j LOG --log-prefix "mangle-input-ssh-in: " --log-level 7

nat表

iptables -t nat -I PREROUTING 1 -p tcp --dport 22 -m state --state NEW -m limit --limit 100/minute -j LOG --log-prefix "nat-prerouting-ssh-in: " --log-level 7

filter表

iptables -t filter -I INPUT 1 -p tcp --dport 22 -m state --state NEW -m limit --limit 100/minute -j LOG --log-prefix "filter-input-ssh-in: " --log-level 7

security表

iptables -t security -I INPUT 1 -p tcp --dport 22 -m state --state NEW -m limit --limit 100/minute -j LOG --log-prefix "security-input-ssh-in: " --log-level 7

以上规则参数的含义:
-t 指定哪个表
-A 增加链中的规则
-I 增加链中的规则,可指定规则顺序
-p 指定协议
--dport 目的端口
-m 使用的模块
--state 这个是netfilter框架中指对网络连接的状态,其中状态分别是 NEW、ESTABLISHED、RELATED、INVALID。
--limit 记录限制,例如 1/minute 代表一分钟内只记录一次
-j 执行动作
--log-prefix 日志前缀
--log-level 日志等级,分别为:debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic。其中,error和err、warn和warning、panic和emerg分别是同义词,也就是说作用完全一样的。


接下来我们触发ssh连接后,来查看dmesg日志。
需要注意:centos 则查看/var/log/message 而ubuntu系统则看/var/log/kern.log

首先分析下日志的各个字段的含义
raw-prerouting-ssh-in 通过指定--log-prefix选项,这是我们在日志记录中使用的前缀
IN=eth0 OUT= 这表示从该接口传入数据包。对于传出数据包将为空。
MAC 00:16:3e:0c:35:51目标MAC地址,ee:ff:ff:ff:ff:ff为源MAC地址,08:00为上层协议代码,表示IPv4协议。
SRC源IP地址
DST目的IP地址
LEN数据包的长度
TOS服务类型 (Type of Service)。值 0x14通常表示低延迟请求。
PREC=0x00: 优先级 (Precedence)。0x00 表示 Routine (普通) 优先级(现代网络较少使用)。
TTL=55: 生存时间 (Time To Live)。数据包在到达服务器之前已经过了 64 - 55 = 9 跳路由器(常见初始 TTL 为 64)。这个跳数对于从公网访问来说是合理的。
ID=0: IP 标识符。值为 0,可能由发送主机生成,也可能由路径上的 NAT 设备重写。
DF: 标志 (Flags)。Don't Fragment (不分片) 位被置位。表示如果包太大无法通过某段网络,应丢弃而不是分片。
PROTO=: 使用什么类型协议
SPT=: 源端口
DPT=: 目标端口
WINDOW=65535: 接收窗口大小。客户端通告的最大窗口大小为 65535 字节(最大值),表示它愿意一次接收大量数据。
RES=0x00: 保留字段。值为 0,未使用。
SYN: TCP 标志 (Flags)。SYN (Synchronize) 标志被置位。这是 TCP 三次握手的第一步,表示客户端请求建立一个新的连接。
URGP=0: 紧急指针。值为 0,表示此数据包中没有紧急数据。


最后入栈的数据包要经过以下步骤才能到达SSH服务

  1. 进入eth0接口
  2. raw/PREROUTING:目的是在数据包进入系统的连接跟踪机制之前,对它们进行非常早期的处理。
  3. mangle/PREROUTING :这个链用来mangle数据包,比如改变TOS等
  4. nat/PREROUTING :这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。
  5. 路由判断,比如,包是发往本地的,还是要转发的。
  6. mangle/INPUT :在路由之后,被送往本地程序之前,mangle数据包。
  7. filter/INPUT :所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。
  8. security/INPUT :作用是给包打上 SELinux 标记,以此影响 SELinux安全上下文的系统处理包的行为。
  9. 到达本地程序SSH服务

技术文章持续更新,请大家多多关注呀~~
搜索微信公众号,关注我【 帽儿山的枪手 】