Linux 系统防火墙
Linux 系统防火墙
1.1 防火墙基本介绍
防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。

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

1.2 防火墙服务管理
查看防火墙状态:
systemctl status firewalld启动防火墙:
systemctl start firewalldCentOS6 => iptables,CentOS7 => firewalld
关闭防火墙:
systemctl stop firewalld重启防火墙:
systemctl restart firewalld
# 或
systemctl reload firewalldrestart与reload有啥区别?答:两者的重启方式不同
restart:先关闭,在开启(先stop,在start)
reload:在不关闭服务的前提下,实际对配置文件的重新加载(不会影响业务)
1.3 防火墙配置(规则)
基本语法:
firewall-cmd [选项1] [选项2] ...查看防火墙的所有区域(预定义规则)
firewall-cmd --get-zonesfirewalld增加了区域的概念,所谓区域是指,firewalld 预先准备了几套防火墙策略的集合,类似于策略的模板,用户可以根据需求选择区域。
常见区域及相应策略规则
区域使用场景详解(了解)
Firewalld 分配这么多区域的核心意义
服务器角色或网络环境变化时,调整安全策略变得极其简单和快速。
场景:==一台笔记本服务器平时在公司用(
work区域),需要回家调试(home区域),第二天又要去咖啡馆演示(public区域)。使用 NetworkManager 等工具自动切换网络时,firewalld 可以自动将接口切换到对应的区域,无需用户干预,策略自动随之改变。==

与传统防火墙的对比
查看默认的防火墙区域
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 httpd6、查看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 selinux1.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关于防火墙的操作保持完全一致