案例场景
在阿里云服务端部署了 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服务
- 进入
eth0
接口 raw/PREROUTING
:目的是在数据包进入系统的连接跟踪机制之前,对它们进行非常早期的处理。mangle/PREROUTING
:这个链用来mangle数据包,比如改变TOS等nat/PREROUTING
:这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。- 路由判断,比如,包是发往本地的,还是要转发的。
mangle/INPUT
:在路由之后,被送往本地程序之前,mangle数据包。filter/INPUT
:所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。security/INPUT
:作用是给包打上 SELinux 标记,以此影响 SELinux安全上下文的系统处理包的行为。- 到达本地程序SSH服务
技术文章持续更新,请大家多多关注呀~~
搜索微信公众号,关注我【 帽儿山的枪手 】