1、iptables的基本概念
众所周知iptables是Linux系统下自带免费的包过滤防火墙。其实不然,iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 数据包过滤的防火墙功能(最常用的功能)
2、iptables规则、表和链
我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
这些规则在iptables中都是(tables)和链(chains)来描述的,iptables的规则表和链:
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现以下功能。
- filter表:负责过滤功能,防火墙;内核模块:iptables_filter
- nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
- mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
- raw表:关闭nat表上启用的连接追踪机制;iptable_raw
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
表和链的关系:
1、每个链上的规则都具有一定的功能, 相同功能的规则存在于特定的表中。
2、每个表中都都具有很多规则,这些规则可以被那些链使用。
3、iptables的转发流程
根据实际情况的不同,报文经过”链”可能不同。如果报文不需要转发,则经过input链进入本地的服务,本地服务处理之后再经过output链转发出来。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING
结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下图:
4、iptables的相关命令
4.1 查询命令
# iptables -L 默认不指定的话是filter表
# iptables -t raw -L、iptables -t mangle -L、iptables -t nat -L、iptables -t filter -L
# iptables -L INPUT 查询filter表中的指定链
# iptables -nvL INPUT 查询filter表中指定链的详细信息。v参数表示详细信息,n参数表示不对IP地址进行名称解析
# iptables --line-number -nvL INPUT 显示规则行号查询
4.2 清除规则
# iptables -F
# iptables -F INPUT 清除filter表中的指定链
根据行号删除指定规则, 先查询出行号然后根据行号删除
# iptables --line-number -nvL INPUT
# iptables -D INPUT 3
根据具体的匹配条件与动作删除规则
# iptables -t filter -D INPUT -s 2.2.2.2 -j drop
4.3 增加规则
在filter表的INPUT链的最前面插入一条规则,对于来自源IP是2.2.2.2的数据包全部丢弃
# iptables -t filter -I INPUT -s 2.2.2.2 -j drop
在filter表的INPUT链的最后追加一条规则,对于来自源IP是2.2.2.2的数据包全部接受
# iptables -t filter -A INPUT -s 2.2.2.2 -j accept
在filter表的INPUT链的的指定行增加规则,即第二行
# iptables -t filter -A INPUT 2 -s 2.2.2.2 -j accept
对端口进行限制
# iptables -t filter -A INPUT -p udp --dport 123 -j REJECT
思考?两条规则都是对源地址是2.2.2.2的地址进行处理,第一条是丢弃,第二条是接受,实际第二条是不生效的。如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,也没有机会再对报文执行相应的动作了。
参数:
-A 追加
-D 删除
-j 执行动作ACCEPT/DROP/REJECT等
-p 指定协议
-s 源地址
-d 目标地址
-i 输入接口
-o 输出接口
-sport 源端口
-dport 目的端口
4.4 修改规则
# iptables -t filter -R INPUT -s 2.2.2.2 -j drop
修改指定链的默认策略(此处一定要谨慎)
# iptables -t filter -P INPUT DROP
4.5 保存规则
在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”。
# service iptables save 该命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中
# iptables-save > /etc/sysconfig/iptables
重载规则
# iptables-restore < /etc/sysconfig/iptables
或者
# iptables-save > /etc/iptables.cfg.save
# echo "iptables-restore -n < /etc/iptables.cfg.save >/dev/null 2>&1" >> /etc/init.d/boot.local
5、iptables一般的添加原则
1、先添加白名单
# iptables -A INPUT -s 127.0.0.1 -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -s XX.XX.XX.XX/24 -j ACCEPT
2、再添加黑名单
# iptables -A IPUT -j REJECT --reject-with icmp-port-unreachable
iptables详解(1):iptables概念-朱双印博客 (zsythink.net)https://www.zsythink.net/archives/1199