一:简介
防火墙(firewall),一种隔离工具。工作于主机或者网络边缘,对于进出本机或网络的报文根据事先定义好的规则作匹配检测,对于能够被规则所匹配到的报文作出相应处理的组件。很多人都以为防火墙是服务,开机能够自动运行。这里要说明,防火墙从来都不是服务,没有启动的进程,而是工作于内核空间中的规则。
netfilter/iptables(简称iptables),实现防火墙的组件。工作于内核的组件是netfilter,已经编译进内核,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。工作于用户空间的是iptables,将规则组成一个列表,实现绝对详细的访问控制功能。能够让用户能够根据自己的想法手动去插入、修改和除去信息包过滤表中的规则。所以,真正实现防火墙功能的是netfilter,而iptables只是管理规则的工具。
二:iptables原理(四表五链)
链:
报文进入主机要么经过内核进行转发,要么进入用户空间,报文从用户空间发送出去则直接从用户空间到内核空间由网卡发送出去。那么根据报文的流向,在报文流经的关键5个位置放置了5个钩子函数(hunk function),这5个钩子函数又称之为链
1.PREROUTING:报文进来主机后路由转发之前
2.POSTROUTING:报文出去主机路由转发之后
3.FORWARD:报文到达内核进行转发
4.INPUT:报文从内核空间到用户空间
5.OUTPUT:报文从用户空间到内核空间
流入:PREROUTING –> INPUT
转发:PREROUTING –> FORWARD –> POSTROUTING
流出:OUTPUT –> POSTROUTING
表:
在设计防火墙的时候,为防火墙增加了四个功能,分别对应四个表
1.filter:实现过滤,能够禁用或者启用某一个网段或者某一个IP
2.nat:实现网址转换,能够将到达的报文的源IP或者目标IP重新封装成另外一个IP
3.mangle:实现报文的封装、修改与拆分,修改其中的元数据
4.raw:实现连接追踪,很少用,不过多介绍
各表在链上实现位置:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING,OUTPUT,POSTROUTING
mangle:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
raw:PREROUTING,OUTPUT
四表五链,表实现功能,链实现路径。表在内核中都已经编译好了的,而规则也就是链就需要用户根据自己的实际情况自行添加。
三:iptables规则
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以,在添加规则时有两种方式,先通再堵,或者先堵再通。
添加规则时的考量点:
(1) 要实现哪种功能:判断添加在哪张表上
(2) 报文流经的路径:判断添加在哪条链上
链上规则的次序,即为检查的次序。因此隐含一定的法则
(1) 同类规则(访问同一应用),匹配范围小的放上面
(2) 不同规则(访问不同的应用),匹配几率大的放上面
(3) 将那些可由一条规则描述的多个规则合并为一个
(4) 设置默认策略
(5) 如果用不上,一定要关闭连接追踪功能。特别是在并发量大的负载均衡集群上
命令
在Linux的man帮助中有详细的iptables命令
iptables [-t tables] option chain [rulenum] rule-secification
-t:指定表,默认为filter,可省
option:管理规则,一般是增、删、改、查
chain:指定五个链中哪一个
rulenum:指定规则对应的数字,可省。一般在删除或者插入的时候使用到
rule-specification:规则的匹配标准,强大,使用频繁,同时内容比较多。
在man帮助中我们可以看到,rule-specification由两部分组成
match:-m,匹配条件。在基本匹配中不需要使用-m
target:处理动作,-j ACCEPT|DROP|QUEUE|RETURN
option:
-L:list,列出指定链中的所有规则
-n:numberic,以数字格式显示地址和端口号,也就是让iptables不反解IP
-v,-vv,-vvv:verbose,显示详细信息
- -line-numbers:显示规则编号
-X:exactly,显示计数器计数结果的精确值
-F:flush,清空规则链。使用链加规则编号表示清空指定的规则链
-N:new,创建新的自定义规则链
-X:drop|delete,删除用户自定义的空规则链,一般使用在-F之后,清空规则链之后删除
-Z:zero,清零规则计数器,让规则计数器重新开始计数
-P:Policy,为指定链设置默认处理机制,对filter表中的链而言,策略通常有ACCEPT, DROP, REJECT,默认策略为ACCEPT。
-E:rename,重命名自定义链,引用计数不为零的链无法改名,也无法删除
-A:append,追加
-I:insert,插入,要指定rulenum(规则号)
-D:delete,删除
删除方式:
(1) 指定匹配条件
(2) 指定规则编号
-R:replace,替换,与-I相似
rule-specification:
基本匹配:
[!]-s|- -src|- -source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围
-d|- -dst|- -destination IP|Netaddr: 检查报文中目标IP地址是否符合指定的地址范围
-p|- -protocol {tcp|udp|icmp}: 检查报文中的协议,即IP首部中的protocols所标识的协议
-i|- -in-interface IFACE: 数据报文的流入接口,仅能用于PREROUTING, INPUT及FORWARD链上
-o|- -out-interface IFACE: 数据报文的流入接口,仅能用于FORWARD, OUTPUT及POSTROUTING链上
扩展匹配:
-m:使用扩展匹配时要使用-m选项
隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项
-p tcp
- -dport port: 目标端口,可以是单个端口或者连续多个端口
- -sport port: 源端口,可以是单个端口或者连续多个端口
-p udp
- -dport port: 目标端口,可以是单个端口或者连续多个端口
- -sport port: 源端口,可以是单个端口或者连续多个端口
-p icmp
- -icmp-type: 可以使用数字表示
0:echo-reply,请求应答(Ping应答)
8:echo-request,请求响应(Ping请求)
举例
[root@ling ~]# iptables -A INPUT -s 172.18.49.82 -p icmp --icmp-type 8 -j DROP
禁止172.18.49.82的主机发送ping请求
-A:增加规则
INPUT:指定的链
-s:source IP,指定源IP
-p:指定协议icmp
-j:指定target,DROP表示拒绝
显式扩展:必须使用-m选项指定使用的扩展
1、multiport扩展(指定多个端口,最多指定15个端口)
[!] - -source-ports|- -sports port[,port]..: 指明多个源端口
[!] - -destination-ports|- -dports port[,port]..: 指明多个目标端口
举例:
[root@ling ~]# iptables -t filter -A INPUT -s 172.18.0.0/16 -d 172.18.49.82 -p tcp -m multiport --dports 22:30,80 -j ACCEPT
允许172.18网段中的所有主机访问目标地址为172.18.49.82的主机的22-30端口以及80端口
-s:源IP
-d:目标IP
-p:tcp协议
-m:显式扩展,一定要使用-m
multiport --dports: 指定目标端口
-j:执行动作,ACCEPT
2、iprange扩展(指定多个IP)
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
[!] - -src-range from [-to]: 指明连续的源IP地址范围
[!] - -dst-range from [-to]: 指明连续的目标IP地址范围
举例:
[root@ling ~]# iptables -A INPUT -p tcp -d 172.18.48.82 -m multiport --dports 80,22 -m iprange --src-range 172.18.251.100-172.18.251.200 -j ACCEPT
允许172.18.251.100-172.18.251.200网络中的所有主机访问目标IP为172.18.48.82的主机的80和22端口
-A: 增加规则
INPUT:指定链
-p:指定协议
-d:目标地址
-m:显式扩展
multiport --dports:指定目标端口
iprange --src-range:指定源IP范围
-j:动作
3、state扩展,根据连接追踪机制检查连接的状态
[!] –state state:指明状态
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf?conntrack_max
已经追踪到并记录下的连接
/proc/net/nf_conntrack
连接状态有四种:
NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED: NEW状态之后,连接追踪模板中为其建立的条目失效之前期间之内所进行的通信状态
RELATED: 相关的连接,如ftp协议的命令连接与数据库连接之间的关系
INVALIED:无法识别的连接
举例:
[root@ling ~]# iptables -A INPUT -p tcp -d 172.18.49.82 -m state --state ESTABLISHED -j ACCEPT
只允许在追踪模板中拥有条目的主机进行通信,通俗的讲也就是只允许已经建立连接的主机进行通信。
iptables保存规则
保存
iptables-save > /etc/sysconfig/iptables
还原
iptables-restore < /etc/sysconfig/iptables
以上是iptables中常用的命令及功能,更多功能请参考man版主文档