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、自定义链中没有任何规则,即自定义链为空。

22人参与, 0条评论 登录后显示评论回复

你需要登录后才能评论 登录/ 注册