10.防火墙

目录

1. 什么是防火墙

1.1. 分类:

1.2. Netfilter(数据包过滤)

1.2.1. 定义

1.2.2. Netfilter分析内容:

1.3. 防火墙无法完成的任务

1.4. iptables 与 firewalld 区别

2. iptables

2.1. iptables执行原则

2.1.1. 原则

2.1.2. 防火墙规则

2.2. 规则链

2.2.1. 概念

2.2.2. 分析

2.2.3. 规则链分类:

2.2.4. 规则链之间的匹配顺序

2.2.5. iptables 流量处理动作

2.3. iptables表

2.3.1. 四种规则表

2.4. 安装iptables

2.4.1. 预处理

2.4.2. 管理命令

2.4.3. 规则链存储文件

2.5. iptables 命令

2.5.1. 原则

2.5.2. 格式:

3. firewalld

3.1. 概述

3.1.1. 概念

3.1.2. firewalld特点

3.2. 区域 zone

3.2.1. 作用

3.2.2. 分析

3.2.3. zone文件中的过滤规则

3.3. firewall-cmd可视化界面工具

3.3.1. 安装

3.3.2. 使用

3.4. firewall-cmd命令行工具

3.4.1. firewalld命令生效模式

3.4.2. 管理命令


1. 什么是防火墙

防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。

10.防火墙_第1张图片

1.1. 分类:

硬件防火墙:由厂商设计好的主机硬件,其操作系统主要以提供数据包数据的过滤机制为主,并去掉不必要的功能

软件防火墙:保护系统网络安全的一套软件(或称为机制),如Netfilter(数据包过滤机制)

1.2. Netfilter(数据包过滤)

1.2.1. 定义

netfilter 是一个工作在 Linux 内核的网络数据包处理框架,用于分析进入主机的网络数据包,将数据包的头部数据(硬件地址,软件地址,TCP、UDP、ICMP等)提取出来进行分析,以决定该连接为放行或拒绝的机制,主要用于分析OSI七层协议的2、3、4层。

1.2.2. Netfilter分析内容:

拒绝让Internet的数据包进入主机的某些端口

拒绝某些来源IP的数据包进入

拒绝让带有某些特殊标志(flag)的数据包进入,如:带有SYN的主动连接标志

分析MAC地址决定是否连接

1.3. 防火墙无法完成的任务

防火墙并不能杀毒或清除木马程序(假设主机开放了www服务,防火墙的设置是一定要将www服务的

port开放给client端的。假设www服务器软件有漏洞,或者请求www服务的数据包本身就是病毒的一部

分时,防火墙是阻止不了的)

防火墙无法阻止来自内部LAN的攻击(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员

工对于网络无用或滥用的情况)

1.4. iptables 与 firewalld 区别

netfilter数据包过滤机制是由linux内核内建的,不同的内核版本使用的设置防火墙策略的软件不一样,

从红帽7系统开始firewalld服务取代了iptables服务

iptables firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,即

只是一种服务,而真正使用规则干活的是内核的netfilter

总之,当前Linux 系统中存在多个防火墙管理工具,旨在方便运维人员管理 Linux 系统中的防火墙策略,

我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是

保持一致的

2. iptables

早期的 Linux 系统中,默认使用 iptables 防火墙来管理服务和配置防火墙,虽然新型的 firewalld 防火

墙管理服务已经被投入使用多年,但iptables 在当前生产环境中还继续使用 ,具有顽强的生命力

2.1. iptables执行原则

2.1.1. 原则

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中

定义的行为(即放行或阻止)。

如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略

2.1.2. 防火墙规则

通(放行、允许)

堵(阻止、拒绝)

当默认策略为拒绝时,就要设置允许规则,否则数据包都进不来;若默认策略为允时,就要设置拒绝规则,否则数据包都能进来,防火墙也就失去了作用

2.2. 规则链

2.2.1. 概念

iptables 服务把用于过滤流量的策略条目称之为规则,多条规则组成一个规则链

2.2.2. 分析

数据包经过iptables处理必须闯过5个控制关卡,每个关卡放置5个规则链用于检查规则和处理,每一道关

卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把

这些关卡都叫规则链

流程图

10.防火墙_第2张图片

2.2.3. 规则链分类:

10.防火墙_第3张图片

INPUT链:数据包流入时,即数据包从内核流入用户空间

OUTPUT链:向外发送数据包(流出)时,即数据包从用户空间流出到内核空间,一般不配置

FORWARD链:处理数据包转发时,即在内核空间中,从一个网络接口进入,到另一个网络接口去(转发

过滤)

PREROUTING链:在对数据包作路由选择之前,即互联网进入局域网

POSTROUTING链:在对数据包作路由选择之后,即局域网出互联网

注意:从内网向外网发送的流量一般都是可控且良性的,因此使用最多的是INPUT 规则链,该规则链可以增大黑客人员从外网入侵内网的难度

例:物业管理公司有两条规定:

(1)禁止小商小贩进入社区;

(2)各种车辆在进入社区时都要登记。

(3)这两条规定是用于社区正门的(流量必须经过的地方),而不是每家的防盗门。根据防火墙策略的匹配顺序,可能会存在多种情况。

(4)如:来访人员是小商小贩,则会被保安拒之门外,也就无需再对车辆进行登记。若来访人员乘坐一辆汽车进入社区正门,则“禁止小商小贩进入社区”的第一条规则就没有被匹配到,因此按照顺序匹配第二条策略,即需要对车辆进行登记。如果是社区居民要进入正门,则这两条规定都不会匹配到,因此会执行默认的放行策略

2.2.4. 规则链之间的匹配顺序

主机型防火墙:

(1)入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING--> INPUT --> 本机的应用程序

(2)出站数据(从防火墙本机向外部地址发送的数据包) :本机的应用程序–> OUTPUT --> POSTROUTING

网络型防火墙:转发数据(需要经过防火墙转发的数据包) : PREROUTING --> FORWARD -->

POSTROUTING

规则链内的匹配顺序

(1)自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)

(2)若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)

2.2.5. iptables 流量处理动作

当规则链匹配后应采用以下几种动作来处理匹配流量

ACCEPT:允许流量通过

REJECT:拒绝流量通过,拒绝后回复拒绝信息

LOG:记录日志信息

DROP:拒绝流量通过,流量丢弃不响应

例:若某天您正在家里看电视,突然听到有人敲门,透过防盗门的猫眼一看是推销商品的,便会在不需要

的情况下开门并拒绝他们(REJECT)。但如果您看到的是债主带了十几个小弟来讨债,此时不仅要拒绝开门,还要默不作声,伪装成自己不在家的样子(DROP)

2.3. iptables表

规则链容纳了各种流量匹配规则,规则表则存储了不同功能对应的规则链,总之表里有链,链里有规则

2.3.1. 四种规则表

filter表:用于对数据包过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),包含三个规则链,INPUT、 FORWARD、 OUTPUT,所谓的防火墙其实基本上是指这张表上的过滤规则,常用

nat表:network address translation,网络地址转换功能,主要用于修改数据包的源、目标IP地址、端口,包含三个规则链,OUTPUT、 PREROUTING、 POSTROUTING

mangle表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类

型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,由于需要相应的路由设备支持,因此应用并不广泛,包含全部五个规则链

raw表:是自1.2.9以后版本的iptables新增的表,用于是否对该数据包进行状态跟踪,在匹配数据包时,raw表的规则要优先于其他表,包含两个规则链,OUTPUT、PREROUTING

注意:最终定义的防火墙规则链,都会添加到这四张表中的其中一张表中,如图:

10.防火墙_第4张图片

2.4. 安装iptables

2.4.1. 预处理

RHEL(Centos)9中默认使用的是firewalld,且与iptables之间有冲突,如果需要使用 iptables 需要先停

firewalld再进行安装:

[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# systemctl status firewalld

10.防火墙_第5张图片

# 已经预装iptables
[root@server ~]# yum install iptables

[root@server ~]# which iptables
/usr/sbin/iptables

[root@server ~]# systemctl status iptables
○ iptables.service - IPv4 firewall with iptables
		Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor
preset: disabled)
		Active: inactive (dead)

10.防火墙_第6张图片

2.4.2. 管理命令

[root@server ~]# systemctl start iptables # 启动

[root@server ~]# systemctl enable iptables # 开机启动

[root@server ~]# systemctl status iptables # 查看状态

[root@server ~]# service iptables save # 保存设置,否则重启系统后恢复默认设置
# 注意:不能使用systemctl save iptables 命令

10.防火墙_第7张图片

2.4.3. 规则链存储文件

[root@server ~]# vim /etc/sysconfig/iptables

# Generated by iptables-save v1.8.7 on Wed Nov 15 13:01:36 2023
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [15:2100]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Nov 15 13:01:36 2023

10.防火墙_第8张图片

前1行为注释:

filter表的规则链

2.5. iptables 命令

2.5.1. 原则

iptables 命令根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,若匹配成,则iptables 会根据策略规则所预设的动作来处理这些流量,由于策略规则的匹配顺序是从上至下,则要把较为严格、优先级较高的策略规则放到前面,以免发生错误

2.5.2. 格式:

简化:

iptables [-t 表名] 选项 [链名] [条件] [-j 控制动作]

详细:

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --
sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 控制动作

2.5.3. 参数

10.防火墙_第9张图片

2.5.4. 示例

查看已有的防火墙规则链

[root@server ~]# iptables -nvxL --line
# -n 显示源 -v 详细信息 -x 自动转换为KB\MB等单位 -L写在最后列出所有规则 --line 增加行号

# num:规则的编号(行号)
# pkts:数据包的数量
# bytes:数据包的字节数
# target:动作(放行、拒绝)
# port:端口
# in:入站的网卡
# out:出站网卡

10.防火墙_第10张图片

清空规则

[root@server ~]# iptables -F # 清空规则
[root@server ~]# iptables -nL # 查看规则链
[root@server ~]# systemctl restart iptables
[root@server ~]# iptables -nL # 由于未保存,则恢复原状

[root@server ~]# iptables -F 		# 再次尝试清空规则链
[root@server ~]# service iptables save 		# 保存服务状态
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@server ~]# systemctl restart iptables		 # 重启服务
[root@server ~]# iptables -nL 		# 查看

10.防火墙_第11张图片

10.防火墙_第12张图片

2.5.5. 实验

例1:搭建web服务器,设置任何人都能通过80端口访问http

[root@server ~]# mkdir -p /www/web
[root@server ~]# echo "hello world" > /www/web/index.html
[root@server ~]# yum install nginx -y
[root@server ~]# vim /etc/nginx/nginx.conf
root /www/web;
[root@server ~]# systemctl start nginx

[root@server ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@server ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@server ~]# systemctl restart iptables
[root@server ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target	 prot opt source destination
ACCEPT 	tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

例2:禁止所有人使用ssh进行远程登录

[root@server ~]# iptables -F # 清空
[root@server ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
# 此时ssh已断开连接,可以尝试新来你姐

# 恢复ssh连接
[root@server ~]# iptables -D INPUT 1 # 删除INPUT链中第1条规则,恢复ssh
[root@server ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

[root@server ~]# service iptables save # 保存服务
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@server ~]# systemctl restart iptables # 重启服务

10.防火墙_第13张图片

例3:禁止某主机(192.168.223.130) ssh远程登录,允许访问web服务

[root@server ~]# iptables -F
[root@server ~]# iptables -I INPUT -p tcp -s 192.168.223.130 --dport 22 -j REJECT # -I 表示在已存在的记录之前插入一条新纪录
[root@server ~]# iptables -I INPUT -p tcp -s 192.168.223.130 --dport 80 -j ACCEPT
[root@server ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.223.130      0.0.0.0/0            tcp dpt:80
REJECT     tcp  --  192.168.223.130      0.0.0.0/0            tcp dpt:22 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@server ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@server ~]# systemctl restart iptables

3. firewalld

3.1. 概述

3.1.1. 概念

firewalldDynamic Firewall Manager of Linux systemsLinux 系统的动态防火墙管理器)服务是

默认的防火墙配置管理工具,从RHEL 7开始,用firewalld服务替代了iptables服务

RHEL 9采用firewalld管理netfilter子系统,默认情况,firewalld则是交由内核层面的nftables包过滤框

架来处理

3.1.2. firewalld特点

firewalld可以动态修改单条规则,不需要像iptables那样,修改规则后必须全部刷新才可生效

firewalld默认动作是拒绝,则每个服务都需要去设置才能放行,而iptables里默认是每个服务是允许,需

要拒绝的才去限制

iptables防火墙类型为静态防火墙firewalld 防火墙类型为动态防火墙

firewalldiptables一样自身并不具备防火墙功能,它们的作用都是用于维护规则,而真正使用规则干活

的是内核防火墙模块

firewalld 加入了区域(zone)概念

3.2. 区域 zone

3.2.1. 作用

firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone),然后根据数据包的源IP地址或传入

的网络接口等条件将流量传入相应区域,每个区域都定义了自己打开或者关闭的端口和服务列表

区域:zone本质为firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不

同而选择合适的策略集合,从而实现防火墙策略之间的快速切换

例:有一台笔记本电脑,每天都要在公司、咖啡厅和家里使用。

这三者的安全性按照由高到低的顺序是:家庭、公司办公室、咖啡厅。

若希望指定如下防火墙策略规则:在家中允许访问所有服务;在公司办公室内仅允许访问文件共享服务;

在咖啡厅仅允许上网浏览。

以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可

以自动切换了,从而极大地提升了防火墙策略的应用效率。

3.2.2. 分析

firewalld的一个zone就是一个可信等级,一个等级对应一套过滤规则(规则集合)

数据包必须要经过某个zone才能入站或出站

每个zone都有一个处理行为(defaultACCEPTREJECTDROP

firewalldzone根据信任级别分成9个默认zone

10.防火墙_第14张图片

firewalld的配置文件有两个主要的目录/usr/lib/firewalld/zones(系统配置文件,尽量不要修改)

/etc/firewalld/zones(用户配置文件,可以自行修改),每个zone单独对应一个xml配置文件,文件

名为名称>.xml

[root@server ~]# cd /usr/lib/firewalld/zones
[root@server zones]# ls
block.xml dmz.xml drop.xml external.xml home.xml internal.xml public.xml
trusted.xml work.xml

[root@server zones]# cd /etc/firewalld/zones
[root@server zones]# ls
public.xml public.xml.old
[root@server zones]# cd ~

10.防火墙_第15张图片

10.防火墙_第16张图片

用法是:把可信任的IP地址添加到trusted区域,把不可信任的IP地址添加到block区域,把要公开的网络

服务添加到public区域,所以常用区域为:trusted、block、public

3.2.3. zone文件中的过滤规则

过滤规则优先级:

(1)source(最高)

(2)interface(次之)

(3)默认zone(最低)

规则:

10.防火墙_第17张图片

3.3. firewall-cmd可视化界面工具

3.3.1. 安装

[root@server ~]# systemctl start firewalld # 启用
[root@server ~]# systemctl enable firewalld # 开机启动

# 安装DDE图形化桌面

[root@server ~]# yum install firewall-config -y # 安装图形化界面

3.3.2. 使用

# 虚拟机中执行,不要在xshell执行
[root@server ~]# firewall-config

3.4. firewall-cmd命令行工具

3.4.1. firewalld命令生效模式

runtime模式:运行时模式,立即生效,重启失效

permanent模式:永久模式,重启生效

3.4.2. 管理命令

[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# systemctl start firewalld
[root@server ~]# systemctl enable firewalld
[root@server ~]# systemctl status firewalld

3.4.3. 设置命令:firewall-cmd 参数

10.防火墙_第18张图片

例1:基本命令

[root@server ~]# firewall-cmd --version # 查看版本

[root@server ~]# firewall-cmd --help # 查看帮助信息

[root@server ~]# firewall-cmd --state # 显示状态

[root@server ~]# firewall-cmd --get-services # 查看防火墙管理的服务

[root@server ~]# firewall-cmd --list-all # 查看区域中的规则

[root@server ~]# firewall-cmd --panic-on # 启用紧急模式

[root@server ~]# firewall-cmd --panic-off # 关闭紧急模式

例2:设置当前zone

[root@server ~]# firewall-cmd --get-zones # 查看所有支持的区域

[root@server ~]# firewall-cmd --get-default-zone # 查看当前默认的区域

[root@server ~]# firewall-cmd --set-default-zone=trusted # 设置当前默认区域为信任区域
[root@server ~]# firewall-cmd --get-default-zone # 查看你当前默认区域
[root@server ~]# firewall-cmd --set-default-zone=public # 设置当前默认区域为public区
域
success
[root@server ~]# firewall-cmd --get-default-zone # 查看你当前默认区域

例3:firewalld区域中添加http服务,使其为放行状态

[root@server ~]# yum install nginx -y
[root@server ~]# systemctl start nginx
# 浏览器测试网页,被拒绝
[root@server ~]# firewall-cmd --get-default-zone
[root@server ~]# firewall-cmd --list-all # 查看当前区域中开方的服务
[root@server ~]# firewall-cmd --permanent --zone=public --add-service=http
success

[root@server ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp  #端口要带上传输协议
success

[root@server ~]# firewall-cmd --reload   #防火墙重启
success
[root@server ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client http mdns ssh
  ports: 80/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 浏览器测试通过

# 放行服务格式:
firewall-cmd --permanent --zone=public --add-service=服务名

# 放行端口格式:
firewall-cmd --permanent --zone=public --add-port=端口号/传输协议

10.防火墙_第19张图片

例4:某些服务需要编辑zone文件才能添加服务,添加nginx服务

[root@server ~]# firewall-cmd --get-services # 查看所有区域支持的服务

[root@server ~]# yum install nginx -y # 安装nginx

[root@server ~]# firewall-cmd --add-service=nginx --permanent # 报错,需要编辑区域文件

[root@server ~]# vim /etc/firewalld/services/nginx.xml # 编辑服务配置文件,添加:

        Nginx
        nginx
        
        



# 再次添加服务
[root@server services]# firewall-cmd --add-service=nginx --permanent

# 重置
[root@server services]# firewall-cmd --reload

# 查看当前区域支持的服务
[root@server services]# firewall-cmd --zone=public --list-service

10.防火墙_第20张图片

10.防火墙_第21张图片

例5:禁止192.168.48.131 网段的地址进行ping

firewalld 富规则:用于更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址

和目标地址等诸多信息进行更有正对性的策略配置

富规则优先级最高

格式:

你不得不吐嘈:"这是地球上最丑陋的命令形式,没有之一",书写时很容易出错,所以建议你在文件编辑器修

改到没有毛病再粘贴到shell终端窗口中

可以通过输入 \ 换行书写

示例:

10.防火墙_第22张图片

# 如:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="源IP"
service name="http" reject'

你不得不吐嘈:"这是地球上最丑陋的命令形式,没有之一",书写时很容易出错,所以建议你在文件编辑器修

改到没有毛病再粘贴到shell终端窗口中可以通过输入 \ 换行书写

示例:

[root@server ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.223.130" protocol value="icmp" reject'
success
[root@server ~]# firewall-cmd --reload # 重置
success

[root@server ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client http mdns nginx ssh
  ports: 80/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	rule family="ipv4" source address="192.168.223.130" protocol value="icmp" reject

# 客户端输入ping 192.168.223.129进行测试,发现无法ping,成功
# 注意:恢复客户端ping,不能在服务端添加一条放行富规则,应为禁止的富规则还在,ping还是无法通信,
如:
[root@server ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.223.130" protocol value="icmp" accept'
[root@server ~]# firewall-cmd --reload
# 客户端测试ping 192.168.223.129 失败
# 注意:只需删除对应规则即可

你可能感兴趣的:(RHCE,网络)