iptables基本概念介绍和常见使用方法
ipatbles:
(一):
理解:一个命令行工具,用户通过iptables将其设定的安全规则执行到对应的“安全框架”netfilter中。netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙。
机制:按照网络管理员定义的规则rules(条件),当数据包头符合这样的条件,就这样处理这个数据包。
实现: 规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、 UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
netfilter作为内核中是真正的防火墙,所有进出的报文都要通过这些关卡,符合进出条件的才能通过,符合阻拦条件的则被阻止。如上:input关卡和output关卡,这些关卡在iptables中被称为"链"。
(二):
当客户端发来的报文访问的目标地址不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他“关卡”,也就是其他“链”。分别是 路由前( PREROUTING )、转发( FORWARD )、路由后(POSTROUTING)
(三):
iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):raw --> mangle --> nat --> filter
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
(四):
(五):
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
表:我们把具有相同功能的规则的集合叫做"表",不同功能的规则,我们可以放置在不同的表中进行管理
机制:每条"链"都是一个"关卡",每个通过这个"关卡"的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,
处理动作:
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
(六):iptables实际操作:
iptables –t filter –L (或者iptables -L): -t选项,指定要操作的表; 使用-L选项,列出对应的表的规则
以上命令会显示出了5条链,如:INPUT链、FORWARD链、OUTPUT链,每条链中都有自己的规则,把“链”比作“关卡”,不同的“关卡”拥有不同的能力,INPUT链、FORWARD链、OUTPUT链都拥有“过滤”的能力。所以,当我们要定义某条“过滤”的规则时,我们会在filter表中定义。
添加规则
1: 在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作
示例:iptables -t filter -A INPUT -s 150.165.1.1 -j DROP
2: 在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作
示例:iptables -t filter -I INPUT -s 150.165.1.1 -j ACCEPT
3: 在指定表的指定链的指定位置添加一条规则
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
示例:iptables -t filter -I INPUT 5 -s 150.165.1.1 -j REJECT
4: 设置指定表的指定链的默认策略(默认动作),并非添加规则。
命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT
删除规则
按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则。
命令语法:iptables -t 表名 -D 链名 规则序号
示例:iptables -t filter -D INPUT 3
上述示例表示删除filter表中INPUT链中序号为3的规则。
按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作
示例:iptables -t filter -D INPUT -s 150.165.1.1 -j DROP
上述示例表示删除filter表中INPUT链中源地址为150.165.1.1并且动作为DROP的规则。
删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则。
命令语法:iptables -t 表名 -F 链名
示例:iptables -t filter -F INPUT
删除指定表中的所有规则。
命令语法:iptables -t 表名 -F
示例:iptables -t filter -F
修改规则:
如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。
修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
示例:iptables -t filter -R INPUT 3 -s 150.165.1.1 -j ACCEPT
上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 150.165.1.1为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。
修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令。
命令语法:iptables -t 表名 -P 链名 动作(这里注意不要修改默认动作为DROP)
示例:iptables -t filter -P FORWARD ACCEPT
上例表示将filter表中FORWARD链的默认策略修改为ACCEPT
保存规则
保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后
service iptables save
注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services。
或者使用如下方法保存规则
iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
iptables规则中的匹配条件:
-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。
#示例如下
iptables -t filter -I INPUT -s 192.16.1.111,192.16.1.118 -j DROP
iptables -t filter -I INPUT -s 192.16.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -s 192.16.1.0/24 -j ACCEPT
-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。
#示例如下
iptables -t filter -I OUTPUT -d 192.16.1.111,192.16.1.118 -j DROP
iptables -t filter -I INPUT -d 192.16.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.16.1.0/24 -j ACCEPT
-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)。
#示例如下
iptables -t filter -I INPUT -p tcp -s 192.168.1.14 -j ACCEPT
iptables -t filter -I INPUT ! -p udp -s 192.168.1.14 -j ACCEPT
-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。
#示例如下
iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP
-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
#示如下
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP
tcp扩展模块
常用的扩展匹配条件如下:
-p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
-p tcp -m tcp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.14 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.14 -p tcp -m tcp ! --sport 22 -j ACCEPT
multiport扩展模块
常用的扩展匹配条件如下:
-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.14 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.14 -p tcp -m multiport --dports 22,80:88 -j REJECT