Linux 防火墙管理

防火墙介绍

防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。

防火墙类型

按保护范围划分:

  • 主机防火墙:服务范围为当前一台主机。
  • 网络防火墙:服务范围为防火墙一侧的局域网。

按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现防火墙功能,例如华为、华三、天融信等产品。
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,例如iptables,firewalld。

按网络协议划分:

  • 网络层防火墙:工作在OSI 模型下四层,又称为包过滤防火墙。
    • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
    • 优点:对用户来说透明,处理速度快且易于维护。
    • 缺点:无法检查应用层数据,如病毒等。

在这里插入图片描述

  • 应用层防火墙/代理服务器:工作在OSI 模型七层或者承担proxy 代理网关。

    1. 异常检测协议:Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
    2. 增强的输入验证:可以有效防止网页篡改、信息泄露、木冯植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
    3. 及时补丁:修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。现在WAF(Web Application Firewall)可以为我们做这项工作了:只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,没有安装对应的补丁本身就是一 种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
    4. 基于规则的保护和基于异常的保护:基于规则的保护可以提供各种Web应用的安全规则,WAF(Web Application Firewall) 生产商会维护这个规则库,并时时为其更新。用户可以按照这些规测对应用进行全方面检测。
    5. **状态管理。**WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并組在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
    6. **其他防护技术。**WAF还有一安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、 响应监视和信息泄露保护。
    • 优点:提供应用层保护。
    • 缺点:处理速度慢等

在这里插入图片描述

Netfilter 子系统

Netfilter子系统是Linux内核中一个强大的网络过滤子系统,对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,通过编程方式来修改、丟弃或路由数据包。

Netfilter子系统工作在内核态,用户使用以下命令配置防火墙规则,告诉Netfilter子系统如何处理数据包:

  • iptables,用于过滤 IPv4 协议的数据包。

    如果 Linux 系统连接到LAN或因特网, 则iptables可用于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

  • ip6tables,用于过滤 IPv6 协议的数据包,效果等同iptables工具。

  • arptables,用于过滤 arp 协议的数据包。

    arptables既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击。如果善于运用的话,不失为一个优秀的arp防火墙。

  • ebtables,用于过滤数据链路层数据包。

    ebtables 过滤数据包比 iptables 更靠前,获得的数据更“原始”,ebtables 多用于桥模式,比如控制 VLAN ID 等。

[root@server ~ 16:02:25]# ls -l /sbin/*tables
-rwxr-xr-x. 1 root root 7016 411 2018 /sbin/ebtables
lrwxrwxrwx. 1 root root   13 92 10:19 /sbin/ip6tables -> xtables-multi
lrwxrwxrwx. 1 root root   13 92 10:19 /sbin/iptables -> xtables-multi

Nftables 子系统

Nftables子系统是netfilter的增强版,其仍保留了netfilter的架构。

nftables优点:

  • 更快的数据包处理
  • 更快的规则集更新
  • 使用单个 nft 用户空间实用程序,通过一个接口来管理所有协议,消除了以往不同前端和多个netfilter接口引起的争用问题。

静态防火墙和动态防火墙

静态防火墙

用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。

我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload 命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。

动态防火墙

用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。

我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。

Firewalld 防火墙

Firewalld 介绍

Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。

  • 在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
  • 在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
  • 用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
  • Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。

Firewalld 和 iptables 之间的关系

  • firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
  • firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。

Firewalld 区域

firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。

Firewalld 提供的区域

firewalld 防火墙提供了如下zone:

  • trusted(信任区域):允许所有的传入流量。
  • public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
  • external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
  • home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  • internal(内部区域):默认值时与homel区域相同。
  • work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  • dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
  • block(限制区域):拒绝所有传入流量。
  • drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则

数据包与zone匹配规则如下:

  1. 该源地址被分配给特定区域, 则应用该区域的规则。

  2. 如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域的规则。

  3. 如果以上都未匹配,firewalld将数据包分配给默认区域

注意事项:

  • firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域
  • 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝

Firewalld 规则

对于所有区域,区域内规则的优先级是相同的。

区域内规则匹配优先级如下:

  1. 首先匹配为该区域设置的任何端口转发伪装原则。
  2. 其次匹配该区域设置的任何允许规则。
  3. 最后匹配该区域设置的任何拒绝规则。
  4. 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
  5. 富规则中的规则优先级高于区域中其他规则。
  6. 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。

Firewalld 配置

Firewalld 配置方法

  1. 直接编辑 /etc/firewalld/ 中的配置文件
  2. firewall-cmd 命令行工具
  3. firewall-config 图形工具

Firewalld 配置文件

Firewalld 配置配置文件存放在:

  • /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
  • /etc/firewalld/目录,目录结构与/usr/lib/firewalld/一致,管理员自定义配置保存在该位置。

**提示:**我们不建议大家通过修改/etc/firewalld/目录配置防火墙。

查看zone配置
[root@server ~ 16:54:15]# cd /usr/lib/firewalld/
[root@server firewalld 16:54:27]# ls
helpers  icmptypes  ipsets  services  zones
[root@server firewalld 16:54:47]# ls zones
block.xml  external.xml  public.xml
dmz.xml    home.xml      trusted.xml
drop.xml   internal.xml  work.xml
查看服务配置
[root@server firewalld 16:55:13]# ls -l services
总用量 616
-rw-r--r--. 1 root root  412 428 2021 amanda-client.xml
-rw-r--r--. 1 root root  447 428 2021 amanda-k5-client.xml
......

[root@server firewalld 16:56:05]# cat services/http.xml 

firewall-cmd 命令行工具

两个基本概念

配置防火墙必须知道两个基本概念:

  • 防火墙的配置有两个状态:

    • runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效。
    • permanent(永久),通过选项 --permanent 指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项 --reload 重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项 --complete-reload 重新reload永久配置,将导致当前连接状态也丢失。

    建议配置防火墙一次性写两条规则:

    第一条使用选项 --permanent永久生效;

    第二条不使用选项 --permanent 立刻生效。

  • 配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项 --zone 明确指明区域,则使用默认区域。默认区域是public

zone 管理
# 查看zone清单
[root@server firewalld 16:56:05]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

# 查看激活的zone清单,也就是分配了interface和source的zone
[root@server ~ 17:05:53]# firewall-cmd --get-active-zones 
work
  sources: 10.1.8.0/24
internal
  sources: 10.1.1.0/24
public
  interfaces: ens33 ens37

# 查看默认zone
[root@server ~ 13:57:57]# firewall-cmd --get-default-zone 
public

2.修改默认zone

# 修改默认zone,该操作同时设置永久态默认zone
[root@server ~ 14:01:08]# firewall-cmd --set-default-zone=home
success
# 查看
[root@server ~ 14:01:47]# firewall-cmd --get-default-zone 
home

# 修改回去
[root@server ~ 14:01:52]# firewall-cmd --set-default-zone=public
success
[root@server ~ 14:02:08]# firewall-cmd --get-default-zone 
public

上面操作的配置规则是立即生效,但重启后就消失

3.firewall-cmd命令的增删改查

# 在zone=home的source中增加10.1.8.0/24
[root@server ~ 13:42:49]# firewall-cmd --add-source=10.1.8.0/24 --zone=home
success

# 查看zone=home的所有规则
[root@server ~ 13:43:27]# firewall-cmd --list-all --zone=home
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 10.1.8.0/24
  services: dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 只查看home的source
[root@server ~ 13:44:02]# firewall-cmd --list-sources --zone=home
10.1.8.0/24

# 将10.1.8.0/24改到internal
[root@server ~ 14:04:37]# firewall-cmd --change-source=10.1.8.0/24 --zone=internal 
success

# 在home中删除ens33接口
[root@server ~ 14:07:08]# firewall-cmd --remove-interface=ens37 --zone=home
success

4.--permanent持久化更改

[root@server ~ 14:41:25]# firewall-cmd --permanent --add-source=10.1.8.0/24 --zone=work
success
[root@server ~ 14:42:05]# firewall-cmd --permanent --add-source=10.1.1.0/24 --zone=internal 
success
# 使用--reload选项重新加载所有防火墙规则,使用permanent后需重新加载
[root@server ~ 14:44:56]# firewall-cmd --reload
success

# 如果有需要还可以创建新zone,必须配合--permanent
[root@server ~ 17:06:13]# firewall-cmd --permanent --new-zone=myweb
success

5.zone-target

# 查看zone target
[root@server ~ 17:28:13]# firewall-cmd --permanent --zone=myweb --get-target
default

# 设置zone target,可用target值为:
#    default,默认值,也就是拒绝数据包进入用户空间。
#    ACCEPT,允许数据包进入用户空间。
#    DROP,丢弃数据包,不对客户端做出任何响应。
#    REJECT,拒绝数据包进入用户空间。

[root@server ~ 17:28:57]# firewall-cmd --permanent --zone=myweb --set-target=REJECT
success
[root@server ~ 17:30:42]# firewall-cmd --permanent --zone=myweb --get-target
REJECT

6.删除一个zone

# zone不需要的时候,也可以删除,必须配合--permanent
[root@server ~ 17:30:45]# firewall-cmd --permanent --delete-zone=myweb
success

[root@server ~ 17:33:09]# firewall-cmd --reload
success
[root@server ~ 17:33:31]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
source 管理
# 来源于特定source的数据包交给特定zone处理
[root@server ~ 17:36:25]# firewall-cmd --add-source=10.1.8.0/24 --zone=work

# 查看source清单
[root@server ~ 17:39:36]# firewall-cmd --list-sources --zone=work
10.1.8.0/24

# 查看source属于哪个zone
[root@server ~ 17:37:14]# firewall-cmd --get-zone-of-source=10.1.8.0/24
work

# 查看source是否添加
[root@server ~ 17:41:06]# firewall-cmd --query-source=10.1.8.0/24 --zone=work
yes

# 变更source到其他zone
[root@server ~ 14:04:37]# firewall-cmd --change-source=10.1.8.0/24 --zone=internal 

# 删除zone中source
[root@server ~ 17:41:23]# firewall-cmd --remove-source=192.168.1.0/24 --zone=work
interface 管理
# 查看zone中interface
[root@server ~ 18:14:08]# firewall-cmd --list-interfaces 
ens37 

# 查看interface属于哪个zone
[root@server ~ 18:14:30]# firewall-cmd --get-zone-of-interface=ens33
public

# 查看interface是否添加
[root@server ~ 18:15:06]# firewall-cmd --query-interface=ens33
yes

# 将interface变更到其他zone
[root@server ~ 18:15:22]# firewall-cmd --change-interface=ens33 --zone=home

# 删除zone中interface
[root@server ~ 18:15:22]# firewall-cmd --remove-interface=ens33 --zone=home

# 如果interface不属于任何zone,使用以下命令将interface绑定到特定zone
[root@server ~ 18:15:22]#  firewall-cmd --add-interface=ens33 --zone=public
service 管理

准备httpd服务

yum install -y httpd
systemctl start httpd
# 查看系统中预定义了哪些服务
[root@server ~ 18:15:22]# firewall-cmd --get-services

# 添加放行服务
[root@server ~ 18:21:46]# firewall-cmd --add-service=http

# 查看放行服务列表
[root@server ~ 18:20:16]# firewall-cmd --list-services 
dhcpv6-client http

# 查看服务是否放行
[root@server ~ 18:21:07]# firewall-cmd --query-service=http
yes

# 删除服务
[root@server ~ 18:22:39]# firewall-cmd --remove-service=httpsuccess

firewall-cmd命令行还可以定义新的服务。

常用选项如下:

--permanent --new-service=service
    Add a new permanent and empty service.

--permanent --delete-service=service
    Delete an existing permanent service.

--permanent --service=service --set-description=description
    Set new description to service

--permanent --service=service --get-description
    Print description for service

--permanent --service=service --set-short=description
    Set short description to service

--permanent --service=service --get-short
    Print short description for service

--permanent --service=service --add-port=portid[-portid]/protocol
    Add a new port to the permanent service.

--permanent --service=service --remove-port=portid[-portid]/protocol
    Remove a port from the permanent service.

--permanent --service=service --get-ports
    List ports added to the permanent service.

--permanent --service=service --add-protocol=protocol
    Add a new protocol to the permanent service.

--permanent --service=service --remove-protocol=protocol
    Remove a protocol from the permanent service.

--permanent --service=service --get-protocols
    List protocols added to the permanent service.

--permanent --service=service --add-source-port=portid[-portid]/protocol
    Add a new source port to the permanent service.

--permanent --service=service --remove-source-port=portid[-portid]/protocol
    Remove a source port from the permanent service.

--permanent --service=service --get-source-ports
    List source ports added to the permanent service.
port 管理
# 添加放行端口
[root@server ~ 18:23:04]# firewall-cmd --add-port=5900/tcp
success

# 查看端口放行列表
[root@server ~ 18:25:02]# firewall-cmd --list-ports 
5900/tcp

# 查看端口是否放行
[root@server ~ 18:25:16]# firewall-cmd --query-port=5900/tcpyes

# 删除端口
[root@server ~ 18:25:36]# firewall-cmd --remove-port=5900/tcp
masquerade 管理
# 查看masquerade是否启动
[root@server ~ 18:25:58]# firewall-cmd --query-masquerade 
no

# 启动 masquerade
[root@server ~ 18:27:30]# firewall-cmd --add-masquerade 
success
[root@server ~ 18:28:01]# firewall-cmd --query-masquerade 
yes

# 禁用masquerade
[root@server ~ 18:28:08]# firewall-cmd --remove-masquerade

网络模型:

  • client:10.1.1.11 网关 10.1.1.10
  • server: 10.1.1.10、10.1.8.10(可以访问公网)

在这里插入图片描述

forward-port 管理

使用 port forward前,确保对应zone启用masquerade功能。

# 启动 masquerade
[root@server ~ 18:27:30]# firewall-cmd --add-masquerade 

# 添加端口转发,语法:
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
# 10.1.8.10:1022 端口,转发到 10.1.1.11:22
[root@server ~ 18:28:19]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11

# 查询端口转发清单
[root@server ~ 18:34:17]# firewall-cmd --list-forward-ports 
port=1022:proto=tcp:toport=22:toaddr=10.1.1.11

防火墙实践

# 新增一块 vmnet1 网卡,名称为ens37
[root@server ~ 13:53:28]#  nmcli connection modify 有线连接\ 1 con-name ens37 ipv4.method manual ipv4.addresses 10.1.1.10/24

[root@server ~ 13:54:10]# nmcli connection up ens37
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@server ~ 13:54:19]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens33            UP             10.1.8.10/24 fe80::20c:29ff:fee1:f29a/64 
ens37            UP             10.1.1.10/24 fe80::773b:b22a:1d9a:d3c3/64 

综合实验1:配置防火墙

  1. 10.1.8.0/24 关联到 work
  2. 10.1.1.0/24 关联到 internal
  3. ens33 ens37 关联到 public
  4. 设置 public 为默认 zone
  5. 可以通过 10.1.8.10 地址访问 web 服务,禁止访问 ssh 服务
  6. 可以通过 10.1.1.10 地址访问 ssh 服务,禁止访问 web 服务
# 准备 web 服务
[root@server ~ 14:09:24]# yum install -y nginx
[root@server ~ 14:12:44]# systemctl enable nginx.service --now

# 配置默认zone
[root@server ~ 14:41:04]# firewall-cmd --set-default-zone=public --permanent 

# 配置 source
[root@server ~ 14:41:25]# firewall-cmd --permanent --add-source=10.1.8.0/24 --zone=work
[root@server ~ 14:42:05]# firewall-cmd --permanent --add-source=10.1.1.0/24 --zone=internal 

# 加载 持久化规则,也就是使用 --permanent设置的规则,原先未加 --permanent 设置的规则则失效。
[root@server ~ 14:44:56]# firewall-cmd --reload
[root@server ~ 14:45:21]# firewall-cmd --get-active-zones 
work
  sources: 10.1.8.0/24
internal
  sources: 10.1.1.0/24
public
  interfaces: ens33 ens37

# 配置 work zone
[root@server ~ 14:45:54]# firewall-cmd --add-service=http --permanent --zone=work 
[root@server ~ 14:47:10]# firewall-cmd --remove-service=ssh --permanent --zone=work 
[root@server ~ 14:47:36]# firewall-cmd --reload

# 配置 internal zone
[root@server ~ 14:45:27]# firewall-cmd --add-service=ssh --permanent --zone=internal
[root@server ~ 14:46:12]# firewall-cmd --remove-service=http --permanent --zone=internal
[root@server ~ 14:46:21]# firewall-cmd --reload

# 设置默认zone 禁止 ssh访问
[root@server ~ 14:51:28]# firewall-cmd --remove-service=ssh --permanent 
[root@server ~ 14:56:46]# firewall-cmd --remove-service=ssh

# 通过 port 放行 http 服务
[root@server ~ 15:04:57]# grep http /etc/services |head -n 5 
#       http://www.iana.org/assignments/port-numbers
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
http            80/sctp                         # HyperText Transfer Protocol
https           443/tcp                         # http protocol over TLS/SSL

[root@server ~ 14:58:29]# firewall-cmd --remove-service=http --permanent --zone=work
[root@server ~ 14:58:52]# firewall-cmd --add-port=80/tcp --permanent --zone=work
[root@server ~ 15:00:27]# firewall-cmd --reload

综合实验2:配置防火墙

  1. 配置client网络
  2. 配置client网关为server(10.1.1.10),设置防火墙允许client访问公网
  3. 配置客户端访问 10.1.8.10:1022 端口,转发到 10.1.1.11:22
# 1. 配置 client 网络:网卡模式为vmnet1,ip地址为10.1.1.11,网关为10.1.1.10
[root@server ~ 13:53:28]#  nmcli connection modify ens33 ipv4.addresses 10.1.1.11/24 ipv4.gateway 10.1.1.10
[root@server ~ 13:54:10]# nmcli connection up ens33

# 2. 配置防火墙开启masquerade功能,也就是SNAT
[root@server ~ 15:45:25]# firewall-cmd --add-masquerade --zone=public 
[root@server ~ 15:45:25]# firewall-cmd --add-masquerade --zone=public --permanent

# 3. 配置防火墙开启端口转发功能,也就是DNAT
# 3. 10.1.8.10:1022 端口,转发到 10.1.1.11:22
[root@server ~ 18:28:19]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
[root@server ~ 18:34:09]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11 --permanent 
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐