Linux-iptables 小技巧

283 阅读2分钟

需求:

  1: 想要查看经过某个链时的数据包信息,用来排查数据包为什么没按照自己的期望转发。

      iptables -I FORWARD -j LOG -s 172.17.0.2 --log-prefix="Before filter FORWARD: "

      解释: 在forward链之中增加log行为的记录,把来源ip是172.17.0.2 的数据包打印在内核之中。

      内核信息的查看:dmesg | grep SRC=172.17.0.2

2: 查看iptables 之中某个表之中的所有的规则

   iptables -t 表名 -nvL  --line-number

3: iptables 删除某条规则

  iptables -D 链的名字 链的规则号 

4: iptables 查看某个表下的某个链下的规则列表

iptables -t 表名 -L 链名 -nv

5:  使用tcpdump 监控某个网卡,发现并没有数据经过,想知道是否是 FORWARD链的规则,将数据包丢弃了。

iptables -L FORWARD -nv 

显示 FORWARD链的信息,头部的DROP会显示丢弃的包的数目

FORWARD链信息

6: iptables 的snat 规则的下半部分dnat 在何时生效?

当数据回来后,经过 iptables的 PREOUTING 链规则,然后执行dnat 转换,然后进行路由选择。

验证方式:启动某个容器,在容器内ping 外网地址,宿主机在iptables 的 PREOUTING链之中增加log规则,

可以发现,在经过PREOUTING链之后,dst ip 并未变化。

7: iptables 增加 tcp 协议目标端口匹配,并打印日志

iptables -t raw -I PREROUTING -d 172.16.217.154 --protocol tcp --sport 8000 -j LOG --log-prefix="ddd "

8: iptables 如何查看模块的帮助文档

   iptables -m 模块名 --help

9: 在nat表的 PREROUTING 增加log 打印动作,访问 阿里云机器内网ip 不会打印,访问阿里云机器外网ip 会打印日志,这是什么原因?是nat表有什么特殊嘛

iptables -t nat -I PREROUTING -p tcp --dport 8899 -j LOG --log-prefix="prefix"

curl 127.0.0.1:8899

curl 外网ip:8899

回答:

 对于nat表而言,只有连接的第一个数据包会流经 nat表,例如tcp建立连接的第一个SYN 包。

所以nat表之中的规则,也就只是会应用在连接的第一个数据包上,而这个连接的后续数据包,则不会

流经这个表。

 对于阿里云的机器的访问外网得出的结果,可以在网卡上进行抓包,得出背后的原因。

抓包命令:tcpdump -n -i eth0 'src 公网ip or dst 公网ip'