Iptables是隔离主机以及网络的工具,通过自己设定的规则以及处理动作对数据报文进行检测以及处理。
本篇算是对于linux系统架构和内核功能网络部分的补充。
- 前置
内核:操作系统的内核,是极其重要的部分,主要用来执行系统资源的分配及调度。
Netfilter:Linux的源代码完全公开,程序设计师可以依据自己的需要,添加额外的功能在这种模式下诞生的。Netfilter就是Linux的第三代防火墙,在此之前,还有ipfwadm和ipchains两种防火墙,但是Netfilter功能更加出色,作为Linux的默认防火墙。
iptables:由于Netfilter需要的防火墙规则是存放在内存中的,管理人员需要一个规则编辑工具,通过这个工具对内存中的规则执行添加、删除和修改等操作,iptables就是这样一个工具。
linux的防火墙由netfilter和iptables组成 用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能netfilter(内核空间)位于Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的“内核态” iptables(用户空间)位于/sbin/iptables,是用来管理防火墙的命令的工具,为防火墙体系提供过滤规则/策略,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的“用户态"
- Netfilter的工作位置
Netfilter存放规则的内存块,被分为四张表,分别是filter、nat、mangle和raw表。
filter:filter是Netfilter中最重要的机制,其任务是执行数据包的过滤操作,也就是起到防火墙的作用。
nat:nat是防火墙上一个不可或缺的重要机制,网络地址转换,使得不同网络之间可以更好的通信。
mangle:mangle是一个很特殊的机制,通过mangle机制可以来修改数据包经过防火墙内数据包的内容。
raw:负责加快数据包穿过防火墙机制的速度,可以提高防火墙的性能
- IPTABLES 详细语法
iptables—>表—>操作—>链—>条件匹配—>处理动作
1、表
filter表:确定是否放行该数据包(过滤)
nat表:修改数据包中的源、目标IP地址或端口
managle表:为数据包设置标记
raw表:确定是否对该数据包进行状态跟踪
2、五条链:
INPUT 本机进站的数据流 (路由前)
OUTPUT 本机出站的数据流 (数据包流入口)
FORWARD 路由的数据流 (转发管卡)
POSTROUTING 路由后的数据流(数据包出口)
PREROUTING 路由前的数据流 (路由后)
3、表跟链的对应关系:
filter: INPUT——OUTPUT——FORWARD
nat: OUTPUT——PREROUTING——POSTROUTING
mangle: INPUT——OUTPUT——FORWARD——PREROUTING——POSTROUTING
- filter机制
数据包的类型主要有以下三种。
INPUT类型:网络上其他主机发送给本机进程的数据包。例如,访问本机httpd等服务的类型,对应INPUT链。
OUTPUT类型:本机进程所产生的数据包。例如,本机使用Firefox去访问网络上其他主机,对应OUTPUT链。
FORWARD类型:数据包对本机只是“路过”而已,比如路由器,对应的是FORWARD链。
- nat机制
NAT的机制有很多种,有一对一、一对多、多对多和NAPT,不管是哪一种NAT,都是由SNAT及DNAT共同搭配出来的。
PREROUTING:当下发的规则是要修改“Destination IP时”,该规则将被放在PREROUTING链中,用于执行DNAT的任务。
POSTROUTING:该链的任务是修改数据包的“来源端IP”,用于执行SNAT的部分。
OUTPUT:该链主要作用于本机产生的数据包,用来执行DNAT的功能
进一步学习:常见网络技术
- mangle机制
当一个数据包“穿过”防火墙,我们可以通过mangle的机制来修改数据包的内容,修改的范围在于mangle机制里模块的支持程度。修改IP包头的TTL值:每一种操作系统所生成的数据包的IP包头内的TTL值都不一样,可以根据需要自行修改。修改IP包头的DSCP值或对数据包设置特征:网络应用中,可能会对某些特定通信协议有特殊的需求,例如,QoS就是对不同类型的协议数据包分配不同的带宽。QoS机制主要由两个不同的部分组成,其一是“数据包分类器”,其二是“带宽分配器”。通过IP包内DSCP值来分类,使用mangle机制为数据包标示识别码
- 完整结构
- 数据包的状态
在Linux系统中,将数据包的状态分为四种,分别是ESTABLISHED、NEW、RELATED和INVALID
1)ESTABLISHED:
主要数据包能够成功穿过防火墙,那么之后的所有数据包(包括反向的所有数据包),其状态都会是ESTABLISHED。
2)NEW:
指的是每条连接中的第一个数据包,一般在高级防火墙中用到。
3)RELATED:
被动产生的应答数据包,而且这个数据包不属于现在任何的连接。与协议无关,只要应答的数据包是因为本机送出的一个数据包而导致的另一条连接的产生,那么这个新连接的所有数据包都属于RELATED状态的数据包。
4)INVALID:
状态不明的数据包,也就是不属于ESTABLISHED、NEW、RELATED状态的数据包。凡是INVALID状态的数据包皆可以视为“恶意”的数据包。所以需要将所有INVALID状态的数据包丢弃掉。
- 规则的匹配方式
iptables的匹配方式采用“first match”,即优先匹配。
当我们往防火墙添加规则时,这些规则都是按照“先后顺序”,一条一条的被放进链中,第一条加进来的规则,放在第一的位置,最后一条加进来的规则,则放在最后的位置。
当一个数据包进入INPUT链之后,从INPUT链的第一条规则逐一向下匹配,如果被第一条匹配中,就有此规则来执行允许或丢弃,不管后面规则的内容是什么。否则,依次向下匹配。如果都没有匹配中,则会执行链底端的默认规则。注意,每一条链的底部都会有一条默认规则。
iptables的规则语法可以分成两部分,其一是“基本语法”,其二是“高级语法”。
基本语法:就是有filter自己的模块,可以提供的简单匹配和过滤方式。
高级语法:就是filter本身模块无法提供,需要调用其它模块,以提供更加精确的匹配和过滤操作。
- 用法
0)查询已有的规则
iptables -L -t filter iptables -L -t nat iptables -L -t mangle
1)删除已有规则
iptables -F #删除一条规则 iptables -L -n --line-number iptables -D DOCKER 1
2)设置链的默认策略
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
3)阻止指定IP地址
BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
4)端口转发——将来自422端口的流量全部转到22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
5)防止DoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
6)新建一条规则
iptables -A DOCKER -s 192.168.250.0/24 -d 192.168.250.2 -p tcp --dport 33061 -j ACCEPT
参考资料:
- https://www.pianshen.com/article/48961506905/
- https://www.linuxprobe.com/25-iptables-common-examples.html
- https://www.pianshen.com/article/1061236864/
- https://www.zsythink.net/archives/1199