Linux 防火墙
基础知识
安全技术:
-
IDS:Intrusion Detection Systems,入侵检测系统
-
IPS:Intrusion Prevention System,入侵防御系统
-
FireWall:防火墙
防火墙概念
防火墙是作用与内网和外网之间,根据定义的策略来过滤流量的软件或者硬件。
防火墙分类
可以根据作用范围和实现逻辑分类
根据作用范围分类
-
主机防火墙:针对于单个主机进行防护。
-
网络防火墙:处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网
根据实现逻辑分类
-
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
-
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
linux的防火墙:netfilter
netfilter组件是集成在内核中的,采用模块化设计的,工作在内核空间。
netfilter的钩子函数
钩子函数:hook(勾子) function。是系统预留的一些函数,可以允许外部用户调用钩子函数。可以通过一些工具来向这五个钩子函数中写入规则
netfilter在五个位置放了五个不同的钩子函数,
-
INPUT
-
OUTPUT
-
FORWARD
-
PREROUTING
-
POSTROUTING
netfilter的报文流向
-
到本机的某进程:PREROUTING –> INPUT
-
由本机转发的:PREROUTING –> FORWARD –> POSTROUTING
-
由本机某进程发出的:OUTPUT –> POSTROUTING
PREROUTTING:报文的总进口
POSTROUTING:报文的总出口
linux防火墙的管理工具
-
iptables:用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
-
firewalld:CentOS7提供的,就是基于iptables的二次开发
-
nettable:CentOS8提供的
iptables的相关概念
-
iptables由五表、五链和一些规则组成。
-
iptables中的五链对应netfilter的五个钩子函数。
优先级从高到低:
security -->raw-->mangle-->nat-->filter
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理
链:多条规则就形成了一条链
表:把具有相同功能的规则的集合叫做”表”
五表:
-
filter:负责过滤功能,防火墙;内核模块:iptables_filter
-
nat:network address translation,网络地址转换功能;内核模块:iptable_nat
-
mangle:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
-
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
-
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
表和链的关系
表是具有相同功能的链的集合。
# 查看对应链上的规则都在哪些表中:iptables -vnL -t table_name
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。
iptables中的规则
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理。
在实际的使用过程中,往往是通过”表”作为操作入口,对规则进行定义的
查看iptables的规则:
#查看iptables表的规则:
iptables -t 表名 -L
#查看指定表的指定链中的规则:
iptables -t 表名 -v -L
#例如:查看filter表的所有规则
[root@CentOS8 ~]# iptables -t filter -L
-t:指定表的类型:
-L:list,列出所有规则
-v:显示详细信息
-n:number,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。
不指定表名,默认使用的是filter这张表。
#使用 -v 选项显示的详细信息
# pkts:对应规则匹配到的报文的个数。
# bytes:对应匹配到的报文包的大小总和。
# target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。
# prot:表示规则对应的协议,是否只针对某些协议应用此规则。
# opt:表示规则对应的选项。
#in:表示数据包由哪个接口(网卡)流入,即从哪个网卡来。
# out:表示数据包将由哪个接口(网卡)流出,即到哪个网卡去。
# source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
# destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段
#范例:查看filter表中的INPUT链的所有规则
root@CentOS8 ~]# iptables -t filter --line-numbers -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
# -–line-numbers:显示规则的编号
# policy表示当前链的默认策略
# packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。
# bytes表示当前链默认策略匹配到的所有包的大小总和。
管理iptables的规则
增加规则:
#范例:拒绝10.0.0.11主机的报文
[root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -j DROP
[root@CentOS8 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.0.0.11 anywhere
# -I:insert, 插入,要指明插入至的规则编号,默认为第一条
# -j:targetname [per-target-options] 指定规则的处理动作
# -s:为source之意,表示源地址。
# -A: 表示在链的尾部追加规则,-I表示在链的首部插入规则
注意:
# 1.如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。
# 2.可以在添加规则时,指定新增规则的编号,将规则添加到指定的位置
[root@CentOS8 ~]# iptables -t filter -I INPUT 2 -s 10.0.0.11 -j DROP
# -I INPUT 2:表示在2这个位置插入这条规则
删除规则:
-
方法一:根据规则的编号去删除规则
-
方法二:根据具体的匹配条件与动作删除规则
# 范例:删除filter表中的INPUT链上面的第一条规则
[root@CentOS8 ~]# iptables -t filter -D INPUT 1
# -D选项表示删除指定链中的某条规则,-D INPUT 1表示删除INPUT链中的第1条规则
# 范例:删除filter表中,INPUT链上,源地址是10.0.0.11,处理动作是DROP的这条规则
[root@CentOS8 ~]# iptables -t filter -D INPUT -s 10.0.0.11 -j DROP
清除所有规则
-
清除指定链中的所有规则:iptables -t 表名 -F 链名
-
清除指定表中的所有规则: iptables -F
#范例:清除filter表中,INPUT链上的所有规则
[root@CentOS8 ~]# iptables -t filter -F INPUT
修改链的默认策略
# 例如:修改filter表中的INPT链的默认策略为DROP
[root@CentOS8 ~]# iptables -t filter -P INPUT DROP
# 当链中没有任何规则时,防火墙会按照默认动作处理报文
白名单和黑名单
-
白名单:只有指定的特定主机可以访问,其它全拒绝
-
黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式
保存规则:
默认所做的操作是临时生效的,重启失效
#CentOS6把保存iptables规则:
service iptables saeve #将规则覆盖保存至/etc/sysconfig/iptables文件中
CentOS 7,8
方法一:
iptables-save > /PATH/TO/SOME_RULES_FILE
iptables-restore < /PATH/FROM/SOME_RULES_FILE(在rc.local中加入这条命令) #iptables-restore:加载规则
#将规则存在一个文件,通过开机自动加载这个文件来实现。
方法二:
安装iptables.service
因为安装这个软件以后,它的/etc/sysconfig/iptables这个文件带有他自己默认的规则,通过:
iptables-save > /etc/sysconfig/iptables来覆盖它默认的规则。从而实现规则的的保存。
iptables的匹配条件
-
基本匹配条件:直接能用的条件
-
扩展匹配条件:需要调用对应的扩展模块
iptables的基本匹配条件
- 源地址
- 目标地址
- 网卡名称
- 协议类型
源地址和目标地址
使用-s选项来指定源地址,可以是网段或者是一台具体的主机。多个地址或者网段用逗号隔开。
使用-d选项来指定目标地址,可以是网段或者是一台具体的主机
不指定任何目标地址,则目标地址默认为0.0.0.0/0,同理,如果我们不指定源地址,源地址默认为0.0.0.0/0,0.0.0.0/0表示所有IP
只能表示离散的地址(单个地址逗号隔开),不能表示一个连续的地址(例如10.0.0.11-10.0.0.19)
#范例:来自10.0.0.11这个设备的数据表都丢弃
[root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -j DROP
网卡名称
有多块网卡时,指定从那块网卡流入或者流出。
-i: 本机有多个网卡时,我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机
-o: 当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出
#-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。
协议类型
匹配不同协议类型的数据包
使用-p参数来匹配指定的协议类型。
#例如: 匹配到来自10.0.0.11这个设备的tcp数据包就拒绝
[root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -p tcp -j REJECT
#centos6中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, esp, ah, sctp
#centos7中,-p选项支持如下协议类型:
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
#当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。
扩展匹配条件
需要调用指定的扩展模块才能使用的匹配条件。
扩展匹配条件分为:
-
隐式扩展:和协议名称一样的模块,使用-p执行协议类型的时候,会自动分配一个同名的模块。
-
显示扩展:需要使用 -m 参数手动指定模板才能使用
隐式扩展
和协议同名的扩展模块:只需要使用-p选项指定协议,会自动调用同名的扩展模块。
-
tcp
-
udp
-
icmp
tcp 协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围 #[!] 表示可以取反
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
#范例:拒绝外来报文的目标端口为本机的22号端口
[root@CentOS8 html]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j DROP
#注意
1.-m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件
2.使用 -p 指定报文协议,但是没有使用 -m 指定扩展模块时,会默认使用和协议名称相同的模块
3.连续的端口表示方法: num1:num2
udp 协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
icmp 协议的扩展选项:
ICMP协议:Internet Control Message Protocol,翻译为互联网控制报文协议,它主要用于探测网络上的主机是否可用,目标是否可达,网络是否通畅,路由是否可用等
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
使用 –icmp-type 表示根据具体的type与code去匹配对应的icmp报文
ping回应报文,它的type为0,code也为0
ping请求报文对应的type为8,code为0
#范例:禁止所有icmp类型的报文进入本机
[root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
#范例:实现能ping通别人,但是不想让别人ping通我们
[root@CentOS8 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
–icmp-type 8/0 表示icmp报文的type为8,code为0才会被匹配到,也就是只有ping请求类型的报文才能被匹配到
我们之所以能够ping通别人,是因为别人回应我们的报文的icmp type为0,code也为0,所以无法被上述规则匹配到,所以我们可以看到别人回应我们的信息
显式扩展模块
-
multiport:可以指定离散的端口号,使用逗号隔开
-
iprange:指定一个连续的ip地址范围
-
mac
-
string:匹配含有指定字符串的报文
-
time:匹配指定时间段的报文
-
connlimit
-
limit
-
state
iprange扩展模块:
两个扩展匹配条件:
–src-range:
–dst-range
#例如:
[root@CentOS8 html]# iptables -t filter -I INPUT -m iprange --src-range 10.0.0.10-10.0.0.13 -j DROP
string模块:
常用扩展匹配条件:
–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
–string:指定需要匹配的字符串
#例如: #含有hello1这个字符串的报文就丢弃掉
[root@CentOS8 html]# iptables -t filter -I INPUT -m string --algo bm --string "hello1" -j DROP
#范例:禁止访问谷歌
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
time模块:根据将报文到达的时间与指定的时间范围进行匹配
(注意:CentOS 8 此模块有问题)
#常用扩展匹配条件如下:
–timestart:用于指定时间范围的开始时间,不可取反
–timestop:用于指定时间范围的结束时间,不可取反
–weekdays:用于指定”星期几”,可取反
–monthdays:用于指定”几号”,可取反
–datestart:用于指定日期范围的开始日期,不可取反
–datestop:用于指定日期范围的结束时间,不可取反
#范例:每天早上9点到下午6点不能看网页
[root@CentOS8 html]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
connlimit扩展模块:限制每个IP地址同时链接到server端的链接数量
–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制
#范例:限制每个ip地址(客户端)只能开启两个ssh连接到service
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
state扩展模块:用来识别报文是主动发出去的还是被动接收的。
state连接的概念:两台机器能进行正常的通信就算建立了连接。
state连接的状态:
NEW:连接中的第一个包,状态就是NEW,
ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
RELATED:有关系的报文
INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID
UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接
#范例:实现只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙
[root@centos8 ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@centos8 ~]#iptables -A INPUT -m state --state NEW -j REJECT
iptables自定义链
target相关概念
target:iptables中的动作,报文被规则匹配到以后,target能是一个”动作”,target也能是一个”自定义链”,当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理
自定义链:用来解决多条规则的情况下,方便我们对不用服务的规则进行管理。
自定义链并不能直接使用,而是需要被默认链引用才能够使用
创建自定义链
使用 -N 选项可以创建自定义链。
自定义链并不能直接使用,而是需要被默认链引用才能够使用
#范例:创建一个叫做IN_WEB的自定义链
[root@CentOS8 ~]# iptables -t filter -N IN_WEB
[root@CentOS8 ~]# iptables -vL -t filter
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain IN_WEB (0 references)
pkts bytes target prot opt in out source destination
#自定义链的引用计数为0 (0 references),也就是说,这条自定义链还没有被任何默认链所引用,所以,即使IN_WEB中配置了规则,也不会生效
在自定义链中配置规则
#范例:实现别的主机不能ping通本机
[root@CentOS8 ~]# iptables -t filter -I IN_WEB -p icmp --icmp-type 8/0 -j REJECT
#因为没有在默认链里面引用自定义规则,所以配置的规则不生效。
引用自定义的规则
[root@CentOS8 ~]# iptables -t filter -I INPUT -j IN_WEB
#自定义链在哪里创建,应该被哪条默认链引用,取决于实际的工作场景,因为此处示例的规则是匹配入站报文,所以在INPUT链中引用自定义链
#IN_WEB链的引用计数已经变为1,表示这条自定义链已经被引用了1次,自定义链还可以引用其他的自定义链
修改自定义的链名
-E”选项可以修改自定义链名
删除自定的链
”-X”选项可以删除自定义链,但是删除自定义链时,需要满足两个条件:
1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。
2、自定义链中没有任何规则,即自定义链为空。