目录
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,也因此获得广泛的应用。
netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space 内核空间)的防火墙功能体系。
iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”(User Space 用户空间)的防火墙功能体系。
iptables是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理。为了更方便的管理防火墙规则,iptables采用了" 表"和“链”的分层结构。
1、filter表:用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。filter表对应的内核模块威为iptable_filter,表内含INPUT,FORWARD,OUTPUT三个链。
2、nat表:(Network Address Translation)用来修改数据包的ip地址、端口号等信息。nat表对应的内核模块为iptable_nat,表内含PREROUTING,POSTROUTING,OUTPUT三个链。
3、mangle表:用来修改数据包的TOS(Type Of Service)TTL(Time To Live),或者为数据包设置Mark标记,以实施流量整形、策略路由等高级应用。mangle表对应的内核模块为iptable_magle,表内含PREROUTING,POSTROUTING,INPUT,OUTPUT五个链。
4、raw表:这是自1.2.9以后版本新增的表,用于决定是否对数据包进行状态跟踪。raw表对应的内核模块为iptable_raw。内含OUTPUT,PREROUTING两个链。
在四个规则表中,常用filter表和nat表,因此在这里只讨论介绍这两个表的防火墙应用。
1、INPUT链:当收到访问防火墙本机地址的数据包时,应用本链中的规则。
2、OUTPUT链:当防火墙本机向外发送数据包时,应用本链中规则。
3、FORWARD链:当接收到需要通过防火墙中转发送给其他地址的数据包时,应用本链中规则
4、PREROUTING:在数据包做路由选择之前,应用本链中规则
5、POSTROUTING:在对数据包做路由选择之后,应用本链中规则
其中,INPUT,OUTPUT链主要用在“主机型防火墙”中,即主要针对服务器本机进行保护的防火墙,而FORWARD,PREROUTING,POSTROUTING链多用在“网络型防火墙”中,如使用Linux防火墙作为网关服务器,在公司内网与internat之间进行安全控制。
规则表之间的顺序:raw>mangle>nat>filter
规则链之间的顺序:
1.入站数据流向:
来自外界的数据包到达防火墙后,首先被 PEROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应该发往何处);如果数据包的目标地址是防火墙本机,那么内核将其传递给 INPUT 链进行处理(决定是否允许通过),通过后再交给系统上层的应用程序进行相应
2.转发数据流向:
来自外界的数据包到达防火墙后,首先被 PREOUTING 链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址,则内核将其传递给 FORWARD 链进行处理(允许转发、拦截或丢弃),最后交给 POSTROUTING 链进行处理(是否修改数据包的地址等)
3.出站数据流向:
防火墙本机向外部地址发送数据包,首先被 OUTPUT 链处理,然后进行路由选择,再交给 POSTROUTING 链进行处理(是否修改数据包的地址等)
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
- #关闭firewalld防火墙
- [root@localhost ~]# systemctl stop firewalld
- [root@localhost ~]# systemctl disable firewalld
-
- #安装iptables防火墙
- [root@localhost ~]# yum -y install iptables iptables-services.x86_64
-
- #设置iptables开机自启并启动
- [root@localhost ~]# systemctl enable --now iptables.service
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下。
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给出任何回 应信息
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
SNAT:修改数据包的源地址
DNAT:修改数据包的目的地址
MASQUERADE:伪装成一个非固定公网IP地址
防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助 动作,并没有真正处理数据包。 注:需要大写
在熟练编写各种防火墙规则之前,首先要掌握查看规则、添加规则、删除规则、清空链内规则等基本操作
选项 功能
-A 在指定链末尾追加一条iptables -A INPUT(操作)
-I 在指定链中插入一条新的,未指定序号默认作为第一条iptables -I INPUT(操作)
-P 指定默认规则iptables -P OUTPUT ACCEPT(操作)
-D 删除iptabies -t nat -D INPUT(操作)
-R 修改、替换某一条规则iptables -t nat -R INPUT(操作)
-L 查看iptables -t nat -L(查看)
-n 所有字段艺术字形式显示(比如任意ip地址事0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名)iptables -L -n,iptables -nL,iptables -vnL
-V 查看时显示更详细信息,常跟-L一起使用(查看)
–line-numbers 规则带编号iptables -t nat -L -n --line-numbers /iptables -t nat -L --line-numbers
-F 清除链中所有规则iptables -F(操作)
-x 清空自定义链的规则,不影响其他链iptables -×
-Z 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号Iptables -t nat -S,iptables -t nat -S POSTROUTING 1
- iptables -t filter -A INPUT -p tcp -j ACCEPT
- #在末尾增加规则
- iptables -I INPUT 2 -p tcp -dport -j ACCEPT
- #在第二行插入规则
- iptables [-t 表名] -n -L [链名] [--line-numbers]
- #或
- iptables - [vn]L
若要查看 filter表OUTPUT链的所有规则,并显示序号,可以执行以下操作
查看所有规则
-D 删除
-F 清空
- iptables -D INPUT 4
- # 删除fieter表的INPUT链的第四个规则
- iptables -t filter -D INPUT -p icmp - j REJECT
- #如果规则比较多,把匹配条件写完整更稳妥
- iptables -F INPUT
- #清空filter表的INPUT规则
注意:
l.-F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改
2.-P设置了DROP后,使用-F 一定要小心!
防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
3.如果不写表名和链名,默认清空filter表中所有链里的所有规则
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
iptables [-t表名] -P <链名> <控制类型>
要设置默认策略,需要先进行清空规则
- iptables -F
- iptables -P FORWARD DROP
- #–般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
- iptables -t filter -P FORWARD DROP
- iptables -P OUTPUT ACCEPT
上面提到过,设置的默认策略是不受-F清空影响的,所以想要重新设置默认策略,需要使用iptables -P 重新进行设置。
在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免“误杀”。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。
根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配
可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p 协议名
地址匹配:-s 源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
例如,若要丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除ICMP协议之外的数据包
iptables -A FORWARD ! -p icmp -j ACCEPT //感叹号”!”表示取反
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。
端口匹配: --sport 源端口、–dport 目的端口
可以是个别端口、端口范围
–sport 1000 匹配源端口是1000的数据包
–sport 1000:3000 匹配源端口是1000-3000的数据包
–sport :3000 匹配源端口是3000及以下的数据包
–sport 1000: 匹配源端口是1000及以上的数据包
注意: --sport和–dport 必须配合-p <协议类型>使用
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
多端口匹配:
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
IP范围匹配:
-m iprange --src-range IP范围
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP #禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包
MAC地址匹配:
-m mac --mac-source MAC地址
[root@localhost ~]# iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP #禁止来自某MAC地址的数据包通过本机转发
状态匹配:
-m state --state 连接状态
常见的连接状态:
NEW :与任何连接无关的,还没开始连接
ESTABLISHED :响应请求或者已建立连接的,连接态
RELATED :与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
INVALID:不能被识别属于哪个连接或没有任何状态S
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP #禁止转发与正常TCP连接无关的非–syn请求数据包(如伪造的网络攻击数据包)