Linux 系统防火墙

1.1 防火墙基本介绍

防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。

防火墙选择让正常请求通过,从而保证网络安全性。

对于Linux防火墙而言, 当网络访问到服务器后, 防火墙会首先判断,该请求对应访问的端口号是否在防火墙中已经被放行, 如果没有, 直接返回拒绝连接, 如果已经放行, 可以访问相关的服务项

1.2 防火墙服务管理

查看防火墙状态:

systemctl status firewalld

启动防火墙:

systemctl start firewalld

CentOS6 => iptables,CentOS7 => firewalld

关闭防火墙:

systemctl stop firewalld

重启防火墙:

systemctl restart firewalld
# 或
systemctl reload firewalld

restart与reload有啥区别?答:两者的重启方式不同

restart:先关闭,在开启(先stop,在start)

reload:在不关闭服务的前提下,实际对配置文件的重新加载(不会影响业务)

1.3 防火墙配置(规则)

基本语法:

firewall-cmd [选项1] [选项2] ...

查看防火墙的所有区域(预定义规则)

firewall-cmd --get-zones

firewalld增加了区域的概念,所谓区域是指,firewalld 预先准备了几套防火墙策略的集合,类似于策略的模板,用户可以根据需求选择区域。

常见区域及相应策略规则

区域

默认策略

trusted

允许所有数据包

home

拒绝流入的流量,除非与流出的流量相关,允许ssh,mdns,ipp-client,amba-client,dhcpv6-client服务通过

internal

等同于home

work

拒绝流入的流量,除非与流出的流量相关,允许ssh,ipp-client,dhcpv6-client服务通过

public(默认)

拒绝流入的流量,除非与流出的流量相关,允许ssh,dhcpv6-client服务通过

external

拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过

dmz

拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过

block

拒绝流入的流量,除非与流出的流量相关,非法流量采取拒绝操作

drop

拒绝流入的流量,除非与流出的流量相关,非法流量采取丢弃操作

区域使用场景详解(了解)

区域

适用场景

解释与注意事项

trusted (信任区域)

最高信任度的内部网络

场景:用于完全受控、隔离的内部网络,如纯粹的机房内部集群、测试环境集群。 注意:这是最不安全的策略(因为允许所有连接),除非你100%信任网络内的所有机器和用户,否则不要在连接互联网的机器上使用。

home (家庭区域)

家庭网络

场景:用于连接家庭Wi-Fi或受信任的家庭局域网的个人电脑或服务器。 特点:在 public区域的基础上,额外允许一些方便家庭局域网使用的服务,如打印机共享 (ipp-client)、文件共享 (samba-client)、设备发现 (mdns)。它比 public更宽松,但比 internal更具体。

internal (内部区域)

内部办公网络

场景:用于公司或组织的内部办公网络。你信任网络内的大部分用户,但仍然需要基础防火墙。 特点:其默认策略与 home区域完全相同。你可以将 internal视为 home的别名,或者根据你所在组织的策略,对其进行微调,使其比 home更严格或更宽松。

work (工作区域)

办公网络

场景:用于公司或组织的办公网络,但信任级别略低于 internal特点:比 home/internal区域更严格一些。它不允许打印机共享 (ipp-client) 和文件共享 (samba-client) 等服务,只允许最核心的管理(ssh)和网络配置(dhcpv6-client)服务。适用于需要更多限制的办公环境。

public (默认区域)

公共网络

场景这是最常用的区域,也是新接口的默认选择。适用于连接公共、不可信的网络,如: - 咖啡馆、机场的Wi-Fi - 数据中心托管的面向公众的服务器(Web服务器、邮件服务器等) 特点限制最严格的常规区域。只允许已被明确允许的入站连接(如你配置过的 httphttps服务),以及响应出站请求的返回包。默认只放行SSH和DHCP。

external (外部区域)

外部网络/网关

场景:专门用于配置为网络网关/防火墙的服务器。这台服务器通常有两张网卡,一张对内,一张对外。 特点:为外部网络启用了IPv4地址伪装(MASQUERADE),这是网关实现 NAT 转换的关键功能。默认策略类似 public,非常严格。

dmz (隔离区域)

非军事区/隔离区

场景:用于托管面向公众但需要与内部网络严格隔离的服务器的网络段,如一个公开的游戏服务器或应用服务器。 特点:策略极其严格(类似 public),仅允许极少数特定服务(如游戏端口、Web端口)。即使DMZ中的服务器被攻陷,攻击者也很难以此为跳板进入受保护的内部网络(internal, home)。

block (限制区域)

主动拒绝

场景:希望明确拒绝所有未经允许的入站连接,并告知对方“被拒绝”(发送reset包)。 效果:连接尝试会立即收到拒绝信号,客户端会立刻知道目标端口是关闭的。可用于临时“封锁”某个接口。

drop (丢弃区域)

静默丢弃

场景最高级别的安全限制。希望防火墙“隐身”,直接丢弃所有未经允许的包,不给予任何响应。 效果:连接尝试会一直等待直到超时。从攻击者视角看,目标IP地址就像不存在一样。block更安全

  • Firewalld 分配这么多区域的核心意义

服务器角色或网络环境变化时,调整安全策略变得极其简单和快速。

场景:==一台笔记本服务器平时在公司用(work区域),需要回家调试(home区域),第二天又要去咖啡馆演示(public区域)。使用 NetworkManager 等工具自动切换网络时,firewalld 可以自动将接口切换到对应的区域,无需用户干预,策略自动随之改变。==

  • 与传统防火墙的对比

特性

传统防火墙 (e.g., iptables)

Firewalld with Zones

配置单元

一套复杂的规则链(Rule Chains)

区域(Zone),即策略模板

管理方式

静态的,针对单台机器编写规则

动态的,基于接口所处的网络环境

灵活性

更改策略复杂,容易出错

更改策略简单快速(只需切换区域)

适用场景

网络环境单一、固定的简单服务器

现代复杂环境:笔记本服务器、多网卡服务器、云环境

  • 查看默认的防火墙区域

firewall-cmd --get-default-zone
​
#显示内容:
public
  • 查看当前有哪些区域是“活跃的”(即已绑定到网络接口)

firewall-cmd --get-active-zones
  • 列出当前区域有哪些具体的规则

firewall-cmd --list-all
​
# 显示内容:
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
    
  在其中, 目前主要关注 services 和 ports 二部分的内容, 分别用于表示当前规则放行的服务或者端口有哪些
  
  同时也表示, 在防火墙配置中, 支持端口放行或服务(又或者协议)放行的方式
  • 为特定网络接口改变区域

firewall-cmd --permanent --zone=<新区域名> --change-interface=<接口名>
​
#将接口 ens33 永久分配到 internal区域
firewall-cmd --permanent --zone=internal --change-interface=ens33
​
#必须重新加载防火墙才能使永久配置生效
firewall-cmd --reload
  • 端口号与网络服务名称的映射表

    /etc/services:将网络服务的人类可读名称(如 http)映射到其标准的端口号和传输层协议(如 80/tcp

  • 添加允许的服务或端口(重点)

    • 添加允许的服务

      • 格式: firewall-cmd [--zone=public] --add-service=服务名称

      • 案例:把ntp服务添加到防火墙的规则中

        firewall-cmd --zone=public --add-service=ntp
      • 案例:把ftp服务添加到防火墙的规则中

        firewall-cmd --zone=public --add-service=ftp
    • 添加允许的端口号

      • 格式: firewall-cmd [--zone=public] --add-port=端口号/tcp或udp

        SSH:22端口、FTP:21端口、Apache:80端口、MySQL:3306端口、PHP:9000端口、Ngin
        ​
        tcp协议与udp协议的区别?
        答:tcp可靠传输协议(慢),udp不可靠传输协议(快)
      • 案例:把80端口/tcp协议添加到防火墙允许的规则中

        firewall-cmd --zone=public --add-port=80/tcp
  • 从防火墙规则中移除某个服务或端口

    • 移除服务:firewall-cmd [--zone=public] --remove-service=ntp

    • 移除端口:firewall-cmd [--zone=public] --remove-port=80/tcp

  • 防火墙规则永久模式(permanent)

```Properties
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload        =>      让规则立即生效
```

总结:

1- 如何查看当前防火墙的规则:
firewall-cmd --list-all
#显示
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160   # 表示针对是哪张网卡
  sources:
  services: cockpit dhcpv6-client ssh  # 当前放行了哪些服务
  ports:                               # 当前放行了哪些端口
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
​
2- 如何添加放行规则:
firewall-cmd --add-service 指定放行的服务 --permanent
或
firewall-cmd --add-port 指定放行的端口/tcp或udp --permanent
​
3- 如何删除放行规则
firewall-cmd --remove-service 指定放行的服务 --permanent
或
firewall-cmd --remove-port 指定放行的端口/tcp或udp --permanent
​
4- 设置后, 让其立即生效规则
firewall-cmd --reload

需求说明:

需求一: 查询当前防火墙规则中,ssh服务是否已经被放行?
firewall-cmd --list-all
​
需求二: 如果需求一查询后,发现已经放行, 请尝试将其永久删除放行?
firewall-cmd --remove-service ssh --permanent
​
# 立即让规则生效
firewall-cmd --reload
​
需求三:思考, 尝试重新使用MX连接服务器,请问是否还可以连接呢? 为什么 
# 正常的结果:连接不上,因为 ssh服务在取消放行后,无法支持远程连接操作了,连接请求会被防火墙直接拒绝
​
# 非正常结果:依然可以连接,一般的原因是仅仅是将服务给取消放行,但是没有执行立即生效,导致服务其实依然在放行中,重新执行下立即让规则生效命令即可
​
需求四: 尝试将SSH服务在防火墙中添加永久放行规则
# 演示服务放行(底层逻辑,其实依然是放行的端口)
firewall-cmd --add-service ssh --permanent
firewall-cmd --reload
或
# 演示端口放行
firewall-cmd --add-port 22/tcp --permanent
firewall-cmd --add-port 22/udp --permanent
firewall-cmd --reload
​
什么时候选择服务,什么时候选择端口放行呢?
​
当这个服务仅需要开发某一个端口的时候,此时用服务或者端口均可以
​
当这个服务需要占用多个端口,同时也需要放行多个端口,建议优先使用服务放行方案,如果该程序并不是一个服务,只能使用端口方案
​
需求五: 添加后,尝试直接使用Xshell,观察是否可以连接? 为什么
# 正常结果:可以连接成功的,因为一旦放行后,远程连接请求就不会被防火墙所拦截,正常使用
​
# 异常结果:如果依然连接不上,大概率是忘记执行立即生效规则

1.4 管理 SELinux

1、SELinux 介绍

SELinux:Security-Enhanced Linux, 是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Corporation)

开发的 Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中

DAC:Discretionary Access Control 自由访问控制

MAC:Mandatory Access Control 强制访问控制

DAC环境下进程是无束缚的

MAC环境下策略的规则决定控制的严格程度

MAC环境下进程可以被限制的

策略被用来定义被限制的进程能够使用那些资源(文件和端口)

默认情况下,没有被明确允许的行为将被拒绝

2、SELinux安全上下文

传统Linux,一切皆文件,由用户,组,权限控制访问,在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问,所有文件和端口资源和进程都具备安全标签:安全上下文(security context)

安全上下文有五个元素组成:

user:role:type:sensitivity:category

实际上下文:存放在文件系统中,ls -Z ; ps -Z

期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中 semanage fcontext -l

五个安全元素:

  • User:指示登录系统的用户类型,进程:如system_u为系统服务进程,是受到管制的,unconfined_u为不管制的进程,用户自己开启的,如 bash,文件:system_u系统进程创建的文件, unconfined_u为用户自已创建的文件

  • Role:定义文件,进程和用户的用途:进程:system_r为系统服务进程,受到管制。unconfined_r 为不管制进程,通常都是用户自己开启的,如 bash,文件:object_r

  • Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t

  • Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0

  • Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy, c0-c1023共1024个分类, Target 策略不使用category

3、启用和禁用SELinux

SELinux的状态:

  • enforcing:强制,每个受限的进程都必然受限

  • permissive:允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志

  • disabled:禁用

相关命令:

  • getenforce: 获取selinux当前状态

  • sestatus : 查看selinux状态

  • setenforce 0|1 0: 设置为permissive 1: 设置为enforcing

4、管理文件安全标签

默认安全上下文查询与修改semanage:来自policycoreutils-python包

[root@secure ~]#yum install -y policycoreutils-python
[root@secure ~]#ll -Z /testdir/index.html
#查看默认的安全上下文
[root@secure ~]#semanage fcontext -l
​
#添加安全上下文
semanage fcontext -a -t httpd_sys_content_t '/testdir/index.html'
restorecon -Rv /testdir
​
#删除安全上下文
semanage fcontext  -d -t httpd_sys_content_t   '/testdir/index.html'

5、管理端口标签

#查看端口标签
semanage port -l
​
#添加端口
semanage port -a -t port_label -p tcp|udp PORT
semanage port -a -t http_port_t  -p tcp 9527
​
#删除端口
semanage port -d -t port_label -p tcp|udp PORT
semanage port -a -t http_port_t -p tcp 9527
​
#案例:
[root@centos7 ~]#cat /etc/selinux/config | grep 'g$'
SELINUX=enforcing
​
[root@centos7 ~]#touch /.autorelabel
​
[root@centos7 ~]#reboot
​
[root@centos7 ~]#yum install httpd -y
​
[root@centos7 ~]#vim /etc/httpd/conf/httpd.conf
Listen 9527
​
[root@centos7 ~]#systemctl restart httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
​
[root@centos7 ~]#systemctl restart httpd

[root@centos7 ~]#semanage port -a -t http_port_t -p tcp 9527
​
[root@centos7 ~]#systemctl restart httpd

6、查看SELinux帮助

#yum -y install selinux-policy-devel ( centos7.2) 
#yum -y install selinux-policy-doc
​
#man -k _selinux
pam_selinux (8)      - PAM module to set the default security context
​
#man 8 selinux

1.5 Ubuntu 防火墙说明

Ubuntu 上默认的防火墙管理工具为ufw(简易防火墙)

  • 查看防火墙状态:查看ufw防火墙的状态, 及其目前放行规则信息

    sudo ufw status
  • 开启防火墙: 开启防火墙, 并开启开机自启项

    sudo ufw enable
  • 关闭防火墙: 关闭防火墙 并关闭开机自启项目

    sudo ufw disable
ubuntu方案: 

    第一步: 关闭ufw简易防火墙 (如果有,一定要关闭,否则就会出现多个防火墙同时作用于操作系统)

    sudo ufw disable
   
    第二步: 安装与centos同源的防火墙(root用户)

    apt install firewalld

    第三步: 与centos stream关于防火墙的操作保持完全一致