在Linux系统内核空间中,有面向网络的防火墙实现。这个防火墙是由软件实现的,是逻辑上的防火墙。用户可以设置某些的“安全设定”,配置到这个网络防火墙的“安全框架”中。这个“安全框架”就是netfilter。
netfilter是处于内核态的,netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
1. 网络地址转换(Network Address Translate)
2. 数据包内容修改
3. 以及数据包过滤的防火墙功能。
刚刚我们提到用户可以在netfilter中自定义“安全设定”,就需要一个中间代理把用户态的“安全设定”配置到内核态中的“安全框架(netfilter)”,这个代理就是iptables。
iptables可以提供给我们用户一些选项来自定义netfilter的功能。这次我们讨论使用iptables进行TCP数据报过滤。
在命令行输入sudo iptables -L
查看防火墙管理的三个“链”:
Chain INPUT表示进入路由器的数据报、Chain FORWARD表示经过路由器的数据报、Chain OUTPUT表示从路由器从路由器出去的数据报。这里三者默认都是ACCEPT(接收)。
target代表如何处理捕获的数据报,共有3种可定义的方法:ACCEPT(接收)、REJECT(拒绝)、DROP(丢弃)。prot代表协议;opt代表选项;source代表源地址;destination代表目的地址;最后一列是描述。
举个例子,下面是wireshark抓取的正常发送的数据报:
接下来我们使用iptables在OUTPUT链中DROP掉有PSH标志位的TCP报文
在Chain OUTPUT中多了一行过滤规则。sudo iptables -A OUTPUT -p tcp --tcp-flags PSH PSH --dport 9000 -j DROP
-A <Chain name>
指定过滤规则的链,这里指定了输出链。
-p <protocol> [options]
指定协议和协议的选项,这里指定了tcp的标志位PSH。
--dport <port>
指定目的端口(destination port)号,这里指定了9000。同时可以使用--sport <port>
指定源端口号。
-j <DROP|REJECT|ACCEPT>
指定过滤方法,这里指定了丢弃(DROP)。
iptables更多的选项和用法可以用命令iptables -h
查看。
接着我们在这个过滤规则下重新抓取刚才的数据报:
这次发送的数据报的PSH标志都被过滤掉了,接收方应用层对并不知道数据报已经到达,造成了接收方窗口溢出。
最后,使用iptables --delete
删除过滤规则前,需要知道过滤规则的行号。在命令行输入sudo iptables -L --line-numbers
查看。
刚才的过滤规则在OUTPUT链的行号2,现在可以输入sudo iptables --delete OUTPUT 2
删除规则。再次查看过滤表。
已成功删除。
注:本文为小Yip原创,未经许可不得在任何平台转载。如需转载,与作者联系~
欢迎加入linux交流群:734638086,分享工作经验。
关注微信公众号:技术训练营(微信ID:TechBootcamp),获取更多资讯~
微信扫一扫,发现更精彩。
如果觉得《使用iptables进行TCP数据包过滤》对你有帮助,请点赞、收藏,并留下你的观点哦!