1. iptables历史
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
参考文档:
- Basic iptables howto
- iptables详解
- ipatebles详解(1):iptales概念
- iptables命令
- 25个iptables常用示例
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例
2. 规则链
iptables工作在用户空间中,是定义规则的工具,本身并不算是防火墙。它定义的规则,可以让内核空间中的netfilter来读取,并且实现让防火墙工作。netfilter的架构就是在整个网络流程的若干位置设置一些关卡(HOOK),而在每个关卡上登记了一些规则,所以这些关卡的术语叫做规则链。
在内核空间中,netfilter选择了5个位置,来作为控制的关卡,专业点叫做规则链。朱双印大神的博客中给出了直观的图像:
根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING
五个规则链的作用如下:
- INPUT链:处理输入数据包。
- OUTPUT链:处理输出数据包。
- PORWARD链:处理转发数据包。
- PREROUTING链:用于目标地址转换(DNAT)。
- POSTOUTING链:用于源地址转换(SNAT)。
3. 表的概念
我们再想想另外一个问题,我们对每个”链”上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。
我们把具有相同功能的规则的集合叫做”表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表的作用。
iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下”表”:
- filter表:负责过滤功能,防火墙;内核模块:iptables_filter
- nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
- mangle表:拆解报文,做出修改,并重新封装的功能;iptable_mangle
- raw表:关闭nat表上启用的连接追踪机制;iptable_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张”表”中。
4. 数据包流向
可以将数据包通过防火墙的流程总结为下图:
我们在写iptables规则的时候,要时刻牢记这张路由次序图,灵活配置规则。
5. 规则
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。规则由匹配条件和处理动作组成。
匹配条件分为基本匹配条件与扩展匹配条件:
基本匹配条件包括源地址Source IP和目标地址 Destination IP。
扩展匹配条件包括源端口Source Port,目标端口Destination Port等等。
动作也可以分为基本动作和扩展动作,此处列出一些常用动作:
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换,解决外网用户访问内网的问题。
- REDIRECT:在本机做端口映射。
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
6. 安装iptables
ubuntu
1 | apt-get install iptables |
centos
1 | yum install iptables |
7. iptables命令详解
命令格式:
1 | iptables [选项] [参数] |
选项包括:
1 | -t:指定要操纵的表; |
命令选项输入顺序:
1 | iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作 |
8. iptables示例
8.1. 清除已有iptables规则
1 | iptables -F |
8.2. 开放指定的端口
1 | iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即允许本机访问本机) |
8.3. 屏蔽IP
1 | iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 |
8.4. 查看已添加的iptables规则
1 | iptables -L -n -v |
8.5. 删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
1 | iptables -L -n --line-numbers |
比如要删除INPUT里序号为8的规则,执行:
1 | iptables -D INPUT 8 |
8.6. 备份规则文件
1 | iptables-save -t filter > iptables.bak |
8.7. 持久化iptables规则
持久化iptables规则,重启依然生效
1 | apt-get install iptables-persistent |