概述

概念
  • SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统,用于各个服务进程都受到约束,使其仅获取到本应获取的资源

  • 例如,电脑上下载了一个美图软件,当您全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不应该是它应做的事情

作用:

  • SELinux 域限制:对服务程序的功能进行限制,以确保服务程序做不了出格的事情

  • SELinux 安全上下文:对文件资源的访问限制,确保文件资源只能被其所属的服务程序访问

SELinux与传统的权限区别

  • 传统的文件权限与账号的关系:属于自主访问控制DAC(Discretionary Access Control),当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问该文件,注意:各种权限设置对root用户是无效的

  • SELinux的以策略规则制定特定程序读取特定文件:属于强制访问控制MAC(Mandatory Access Control),可以针对特定的进程与特定的文件资源来进行权限的控制,即使你是root在使用不同的进程时,你所能取得的权限并不一定是root,而得要看当时该进程的设置而定,则就可以针对进程来进行访问控制

SELinux工作原理

名词解释

主体(Subject)
  • 主体就是想要访问文件或目录资源的==进程==。

  • 进程得到资源流程:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。

  • 自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户

  • 强制访问控制系统中(SELinux 中),靠策略规则控制的主体则是进程

目标(Object)
  • 目标就是需要访问的文件或目录资源

策略(Policy)
  • 策略定义了系统上哪些进程可以访问哪些资源以及如何访问

  • SELinux的策略由一系列规则组成,这些规则定义了主体(如进程)和对象(如文件、网络端口等)之间的访问控制决策

  • Linux 系统中进程与文件的数量庞大,限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会极低,所以SELinux 默认定义了两个策略来制订规则

  • 2个默认策略

    • -targeted:默认策略,用于限制网络服务(dhcpd,httpd,named,nscd,ntpd,portmap,snmpd,squid,以及 syslogd),对本机系统的限制极少

    • -mls:多级安全保护策略,该策略限制更为严格

安全上下文(Security Context)
  • 安全上下文是与文件、进程、网络端口等资源相关联的一组属性,用于标识这些资源的访问控制属性

  • 进程是否能够访问文件或目录,就要其安全上下文是否匹配

  • 策略定义了哪些类型的主体可以执行哪些类型的操作,而安全上下文则实现了这些策略。例如,如果策略规定一个特定的类型不能写入一个文件,那么与该文件关联的安全上下文将阻止具有相应类型主体的进程写入该文件。

  • 例:找对象时,男人看作主体,女人就是目标,男人是否可以追到女人(主体是否可以访问目标),主要看两人的性格是否合适(主体和目标的安全上下文是否匹配),但两个人的性格是否合适,是需要靠生活习惯、为人处世、家庭环境等具体的条件来进行判断的(安全上下文是否匹配是需要通过策略中的规则来确定的)

  • 关系图:

  • 解释:

    • 当主体(进程)访问目标(文件)时,首先和 SELinux 中定义好的策略进行匹配

    • 若符合定义的规则,且主体的安全上下文和目标的安全上下文匹配则允许访问文件

    • 若安全上下文比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息

    • 注意:最终是否可以访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的rwx权限

文件安全上下文查看

先启用selinux
# 安装所需软件
[root@server ~]# yum install selinux-policy  selinux-policy-targeted  -y
# 编辑selinux配置文件
[root@server ~]# vim  /etc/selinux/config   # 先转为临时模式
SELINUX=permissive
[root@server ~]# touch /.autorelabel   # 重建文件
[root@server ~]# reboot
​
[root@server ~]# vim  /etc/selinux/config      # 改为强制模式
SELINUX=enforcing              
[root@server ~]# reboot
命令:
[root@server ~]# ls  -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
​
[root@server ~]# ll  -Z
总用量 4
-rw-------. 1 root root system_u:object_r:admin_home_t:s0 1231 11月 15 12:00 anaconda-ks.cfg
分析
  • 重点为:system_u:object_r:admin_home_t:s0

  • 安全上下文用冒号分为四个字段

  • 身份标识(Identify):相当于账号方面的身份标识,有三种类型:

    • root:安全上下文的身份是 root,默认会映射为unconfined_u

    • system_u:系统用户身份,其中“_u”代表 user

    • 注意:user 字段只用于标识数据或进程被哪个身份所拥有,系统数据的 user 字段是 system_u,用户数据 user 字段是 user_u

    • seinfo 命令

      • 作用:查询身份、角色等信息,需要安装才可使用

      • [root@server ~]# yum  install setools-console  -y
      • 格式:seinfo -参数

      • 参数:

-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;
  • 角色(role):表示此数据是进程还是文件或目录包含(了解就行)

    • object_r:代表该数据是文件或目录,r代表 role(角色的意思)

    • system_r:进程r代表 role

  • 类型(type):

    • [root@server ~]# seinfo -t | more    # 4991个类型
    • 最重要,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配

    • 在默认的targeted策略中

    • 类型字段在主体(进程)的安全上下文中被称作域(domain)

    • 类型字段在目标(文件或目录)的安全上下文中被称作类型(type)

    • 进程的域与文件的类型是否匹配需要查询策略规则

  • 灵敏度:用 s0、s1、s2 来命名,数字为灵敏度分级,数值越大,灵敏度越高

  • 例:查看之前http的默认网页文件信息

[root@server ~]# yum  install nginx  -y
[root@server ~]# systemctl start nginx
​
[root@server ~]# ls  -Zd  /usr/share/nginx/html
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html

SELinux的启动、关闭与查看

三种配置模式

  • enforcing:强制模式,启用SELinux,将拦截服务的不合法请求

  • permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截

  • disabled:关闭模式,SELinux没有运行

原理图:

模式管理

查看当前模式
[root@server ~]# getenforce
临时开启/关闭
[root@server ~]# setenforce  0      # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~]# getenforce
Permissive
​
[root@server ~]# setenforce  1     # 临时开启selinux,转为强制模式,重启失效
[root@server ~]# getenforce
Enforcing
永久关闭
[root@server ~]# vim  /etc/selinux/config 
 
SELINUX=disabled
​
[root@server ~]# reboot
注意
  • enforcing与permissive之间切换时,不需要重启系统

  • enforcing、permissive与disabled之间切换时,必须重启系统才会生效

selinux的状态

命令
[root@server ~]# sestatus
分析
[root@server ~]# sestatus
SELinux status:                 enabled           # 是否启用  
SELinuxfs mount:                /sys/fs/selinux   # selinux临时文件系统的挂载点
SELinux root directory:         /etc/selinux      # 启动目录,配置文件位置
Loaded policy name:             targeted          # 当前加载的策略类型
                                    # 策略类型
                                    #  targeted:只保护目标运行,默认
                                    #  minimum:少数选定进程进行保护
                                    #  mls:多级安全保护,最高级
Current mode:                   enforcing         # 执行的模式,重要
Mode from config file:          enforcing         # 配置文件的模式
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

selinux配置文件

[root@server ~]# vim  /etc/selinux/config 
​
SELINUX=enforcing         # 设置模式
​
SELINUXTYPE=targeted      # 设置策略类型
​
# 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可

修改安全上下文

chcon命令

作用
  • 手动修改目标的上下文策略

格式
# 方法1
chcon  [-R] [-t  type]  [-u  user]  [-r  role]  文件名
-R:递归修改,当前目录及目录下的所有文件都同时设置
-t:后面接安全上下文件的类型字段(重要)
-u:后面接身份标识
-r:后面接角色
-v:显示变动结果
# 方法2:
chcon  -R  --reference=范例文件  文件名
示例
  • 例1:单独修改

[root@server ~]# touch  test
[root@server ~]# ls  -Z  test
unconfined_u:object_r:admin_home_t:s0 test
[root@server ~]# ls -Z  /etc/hosts
system_u:object_r:net_conf_t:s0 /etc/hosts
[root@server ~]# chcon  -v  -t  net_conf_t  ~/test
正在更改 '/root/test' 的安全上下文
[root@server ~]# ls  -Z  test
unconfined_u:object_r:net_conf_t:s0 test
  • 例2:按照范例文件修改

[root@server ~]# touch  temp
[root@server ~]# ls  -Z  temp
unconfined_u:object_r:admin_home_t:s0 temp
[root@server ~]# ls  -Z  /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd
[root@server ~]# chcon  -v  --reference=/etc/passwd  ~/temp
正在更改 '/root/temp' 的安全上下文
[root@server ~]# ls  -Z  temp
system_u:object_r:passwd_file_t:s0 temp

restorecon命令

作用
  • 让文件的SELinux类型恢复为默认的SELinux类型

  • 默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型

格式:
restorecon  [-Rv]  文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
  • 例1:接上例,将~/test 恢复默认类型

[root@server ~]# cd  ~
[root@server ~]# ls  -Z  /root
[root@server ~]# ls  -Z  ~/test
[root@server ~]# restorecon -Rv  ~/test
[root@server ~]# ls  -Z  ~/test

semanage命令

作用
  • 用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等

安装
[root@server ~]# yum  install  policycoreutils-python-utils  -y
格式1:
semanage   选项    参数   文件
  • 选项:login|user|port|interface|==fcontext==|translation|boolean ,注意:fcontext查询默认安全上下文(重要)

  • 参数

 -l :查询;
 -a :添加
 -m :修改
 -d :删除
 -D :全部删除
 -t :类型
 -r :角色
 -s :用户
 -f :文件
  • 文件:设置对象文件或目录

常用命令组
  • 查询文件的默认安全上下文

[root@server ~]# semanage fcontext -l | grep  文件名
​
[root@server ~]# semanage fcontext -l | grep  /etc/passwd 
/etc/passwd[-\+]?        regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.OLD         regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.adjunct.*   regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.lock        regular file    system_u:object_r:passwd_file_t:s0 
  • 查看允许访问的端口

[root@server ~]# semanage  port  -l  |  grep  协议
[root@server ~]# semanage  port  -l  |  grep  http
http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989
[root@server ~]# semanage  port  -l  |  grep  dns
dns_port_t                     tcp      53, 853
dns_port_t                     udp      53, 853
dnssec_port_t                  tcp      8955
布尔值的查询与修改:
  • 作用:布尔值可以作为文件规则的开关来控制权限的给予:放行/阻塞

  • 常用命令:

getsebool -a # 列出目前系统上面的所有布尔值条款
getsebool   规则名
setsebool -P  规则名=1|0  # 设置写入文件
实验
实验1
  • 使用nginx服务演示安全上下文值的设定

  • 服务端操作

# 恢复快照
​
# 开启selinux
[root@server ~]# vim  /etc/selinux/config 
SELINUX=enforcing
​
[root@server ~]# reboot
​
# 查看模式
[root@server ~]# getenforce
Enforcing
​
# nginx软件安装
[root@server ~]# yum  install  nginx  -y
​
# 新建存储网页的目录
[root@server ~]# mkdir  -p  /www/zy
​
# 使用xftp将zy网站数据文件上传到/www/zy目录中
​
# 编辑nginx主配置文件
[root@server ~]# vim  /etc/nginx/nginx.conf
        root         /www/zy;
# 重启服务
[root@server ~]# systemctl restart nginx
​
# 测试,返回403,说明selinux对/www/zy的安全上下文件检测未通过
​
# 将/www/zy的策略类型改为已知可以访问的策略
[root@server ~]# ls  -Zd  /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/
​
[root@server ~]# ls -Zd  /www/zy
unconfined_u:object_r:default_t:s0 /www/zy
[root@server ~]# chcon  -Rv  -t  httpd_sys_content_t  /www/zy
​
# 注意:chcon命令也可以使用参照范例文件修改来实现访问
[root@server ~]# chcon  -R  --reference=/usr/share/nginx/html/  /www/zy
[root@server ~]# ls  -Zd  /www/zy
system_u:object_r:httpd_sys_content_t:s0 /www/zy
​
[root@server ~]# systemctl restart nginx
# 浏览器中重新测试
实验2
  • 使用nginx服务的端口号修改演示selinux的设定

# 基于上例
​
# 检查selinux的状态
[root@server ~]# getenforce
Enforcing
​
# 编辑httpd的主配置文件修改监听端口号
[root@server ~]# vim  /etc/nginx/nginx.conf
     server {
        listen       7777;
​
​
# 重启服务失败,selinux拦截端口的修改
[root@server ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
​
# 查看selinux允许的端口号
[root@server ~]# semanage port -l  |  grep  http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
​
# 使用semanage命令将7777端口号添加到http_port_t类型列表中
[root@server ~]# semanage  port  -a  -t  http_port_t  -p  tcp  7777
[root@server ~]# semanage  port -l  |  grep  http_port_t
​
# 重启服务
[root@server ~]# systemctl restart nginx
​
# 测试,浏览器输入:192.168.48.130:7777
实验3
  • 演示ssh端口号修改的selinux设定

[root@server ~]# vim  /etc/ssh/sshd_config  # 修改ssh的端口号为2222
Port 2222
​
[root@server ~]# systemctl restart sshd   # 重启服务失败
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xeu sshd.service" for details.
​
[root@server ~]# semanage port -l | grep ssh_port_t  # 查看ssh的的端口号策略
ssh_port_t                     tcp      22
[root@server ~]# semanage port -a -t ssh_port_t  -p  tcp 2222  # 策略中添加新端口
[root@server ~]# semanage port -l | grep ssh_port_t
ssh_port_t                     tcp      2222, 22
[root@server ~]# systemctl restart sshd
​
# win11中使用   ssh  root@192.168.88.130:2222  进行访问

第八章 防火墙

什么是防火墙

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

分类:

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

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

Netfilter(数据包过滤)

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

Netfilter分析内容:
  • 拒绝让Internet的数据包进入主机的某些端口

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

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

  • 分析MAC地址决定是否连接

防火墙无法完成的任务

  • 防火墙并不能杀毒或清除木马程序(假设主机开放了www服务,防火墙的设置是一定要将www服务的port开放给client端的。假设www服务器软件有漏洞,或者请求www服务的数据包本身就是病毒的一部分时,防火墙是阻止不了的)

  • 防火墙无法阻止来自内部LAN的攻击(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员工对于网络无用或滥用的情况)

iptables 与 firewalld 区别

  • netfilter数据包过滤机制是由linux内核内建的,不同的内核版本使用的设置防火墙策略的软件不一样,从红帽7系统开始firewalld服务取代了iptables服务

  • iptables 与 firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,即只是一种服务,而真正使用规则干活的是内核的netfilter

  • 总之,当前Linux 系统中存在多个防火墙管理工具,旨在方便运维人员管理 Linux 系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的

iptables

  • 早期的 Linux 系统中,默认使用 iptables 防火墙来管理服务和配置防火墙,虽然新型的 firewalld 防火墙管理服务已经被投入使用多年,但iptables 在当前生产环境中还继续使用 ,具有顽强的生命力

iptables执行原则

原则
  • 防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。

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

防火墙规则
  • 通(放行、允许)

  • 堵(阻止、拒绝)

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

规则链

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

分析
  • 数据包经过iptables处理必须闯过5个控制关卡,每个关卡放置5个规则链用于检查规则和处理,每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫规则链

规则链分类:
  • ==INPUT链:数据包流入时,即数据包从内核流入用户空间==

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

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

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

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

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

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

    • 禁止小商小贩进入社区;

    • 各种车辆在进入社区时都要登记。

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

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

规则链之间的匹配顺序
  • 主机型防火墙:

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

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

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

  • 规则链内的匹配顺序

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

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

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

  • ACCEPT:允许流量通过

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

  • LOG:记录日志信息

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

  • 例:若某天您正在家里看电视,突然听到有人敲门,透过防盗门的猫眼一看是推销商品的,便会在不需要的情况下开门并拒绝他们(REJECT)。但如果您看到的是债主带了十几个小弟来讨债,此时不仅要拒绝开门,还要默不作声,伪装成自己不在家的样子(DROP)

iptables表

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

四种规则表
  • ==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

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

安装iptables

预处理
  • RHEL(Centos)9中默认使用的是firewalld,且与iptables之间有冲突,如果需要使用 iptables 需要先停止firewalld再进行安装:

[root@server ~]# systemctl stop  firewalld
[root@server ~]# systemctl disable  firewalld
# 已经预装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)
管理命令
[root@server ~]# systemctl start  iptables   # 启动
​
[root@server ~]# systemctl enable  iptables  # 开机启动
​
[root@server ~]# systemctl status  iptables  # 查看状态
​
[root@server ~]# service  iptables save  # 保存设置,否则重启系统后恢复默认设置
# 注意:不能使用systemctl  save  iptables 命令
规则链存储文件
[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
  • 前1行为注释:

  • filter表的规则链

iptables 命令

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

格式:
  • 简化:

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

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 控制动作
参数
参数 作用
-t 对指定的表进行操作,table必须是raw,nat,filter,mangle中的一个,默认是filter
-p 指定要匹配的数据包协议类型
-s 匹配源地址IP/MASK,若有!表示取反
-d 匹配目的地址IP/MASK
-i 网卡名 匹配从这块网卡流入的数据
-o 网卡名 匹配从这块网卡流出的数据
-L 列出规则链上的所有规则,如果没有指定链,列出表上所有链的所有规则
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除指定规则
-R num 替换/修改第几条规则
-P 设置默认策略,
-F 清空所有规则(F:flush是“冲洗、冲掉”的意思)
-N 创建新规则链
-X 删除指定规则链,这个链必须没有被其它任何规则引用,而且这条链上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链
-E 用指定的新名字去重命名指定的链
-Z 把指定链,或者表中的所有链上的所有计数器清零
-j 满足某条件时该执行什么样的动作
-h 显示帮助信息
示例
  • 查看已有的防火墙规则链

[root@server ~]# iptables  -nvxL  --line
# -n 显示源   -v 详细信息  -x  自动转换为KB\MB等单位 -L写在最后列出所有规则  --line 增加行号
​
# num:规则的编号(行号)
# pkts:数据包的数量
# bytes:数据包的字节数
# target:动作(放行、拒绝)
# port:端口
# in:入站的网卡
# out:出站网卡
  • 清空规则

[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            # 查看

实验
  • 例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  # 重启服务
  • 例3:禁止某主机(192.168.48.131) ssh远程登录,允许访问web服务

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

firewalld

概述

概念
  • firewalld(Dynamic Firewall Manager of Linux systems,Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,从RHEL 7开始,用firewalld服务替代了iptables服务

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

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

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

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

  • firewalld和iptables一样自身并不具备防火墙功能,它们的作用都是用于维护规则,而真正使用规则干活的是内核防火墙模块

  • firewalld 加入了区域(zone)概念

区域 zone

作用
  • firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone),然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域,每个区域都定义了自己打开或者关闭的端口和服务列表

  • 区域:zone本质为firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换

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

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

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

以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。

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

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

  • 每个zone都有一个处理行为(default、ACCEPT、REJECT、DROP)

  • firewalld的zone根据信任级别分成9个默认zone:

区域 默认策略规则
trusted(信任区域) 允许所有的传入流量
home (家庭区域) 允许与SSH、MDNS(多播DNS)、IPP客户端、samba-客户端、DHCPv6客户端、cockpit(服务器管理工具)服务匹配的流量传入,其余拒绝
internal (内部区域) 默认值时与homel区域相同
work(工作区域) 允许 与SSH、DHCPv6客户端、cockpit服务匹配的流量传入,其余拒绝、
public (公共区域) 允许与SSH或DHCPv6客户端、cockpit服务匹配的流量传入,其余拒绝 (是默认区域)
external(外部区域) 允许与SSH服务匹配的流量传入,其余拒绝
dmz (隔离区域) 也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,允许与SSH服务匹配的流量传入,其余拒绝
block (阻塞区域) 拒绝所有传入流量,返回icmp-host-prohibited消息
drop (丢去区域) 丢弃所有传入流量,且没有任何回复,类似DROP
  • firewalld的配置文件有两个主要的目录/usr/lib/firewalld/zones(系统配置文件,尽量不要修改)和/etc/firewalld/zones(用户配置文件,可以自行修改),每个zone单独对应一个xml配置文件,文件名为<zone名称>.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  ~
  • 用法是:把可信任的IP地址添加到trusted区域,把不可信任的IP地址添加到block区域,把要公开的网络服务添加到public区域,所以常用区域为:trusted、block、public

zone文件中的过滤规则
  • 过滤规则优先级:

    • source(最高)

    • interface(次之)

    • 默认zone(最低)

  • 规则:

规则 作用
scource 源IP地址过滤(常用)
interface 网卡过滤
service 服务名(实际是关联端口)过滤
port 端口过滤
icmp-block ICMP报文过滤
masquerade IP地址伪装
forward-port 端口转发过滤
rule 自定义规则

firewall-cmd可视化界面工具

安装
# 需要再可视化界面下使用
​
[root@server ~]# systemctl  start firewalld     # 启用
​
[root@server ~]# systemctl  enable  firewalld   # 开机启动
​
        # 要先安装DDE图形化桌面
​
[root@server ~]# yum  install  firewall-config  -y  # 安装图形化界面
使用
# 虚拟机中执行,不要在xshell执行
[root@server ~]# firewall-config

firewall-cmd命令行工具

firewalld命令生效模式
  • runtime模式:运行时模式,立即生效,重启失效

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

管理命令
[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
设置命令:firewall-cmd 参数
参数 作用
--get-default-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将源自此 IP 或子网的流量导向指定的区域
--remove-source= 不再将源自此 IP 或子网的流量导向某个指定区域
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=<服务名> 设置默认区域允许该服务的流量
--add-port=<端口号/协议> 设置默认区域允许该端口的流量
--remove-service=<服务名> 设置默认区域不再允许该服务的流量
--remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
  • 例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: ens32
  sources: 
  services: cockpit dhcpv6-client http 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=端口号/传输协议
  • 例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  # 编辑服务配置文件,添加:
<service>
        <short>Nginx</short>
        <description>nginx</description>
        <port protocol="tcp"  port="80"/>
        <port protocol="tcp"  port="443"/>
</service>
​
# 再次添加服务
[root@server services]# firewall-cmd   --add-service=nginx  --permanent 
​
# 重置
[root@server services]# firewall-cmd   --reload 
​
# 查看当前区域支持的服务
[root@server services]# firewall-cmd  --zone=public  --list-service
  • 例5:禁止192.168.48.131 网段的地址进行ping

    • firewalld 富规则:用于更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有正对性的策略配置

    • 富规则优先级最高

    • 格式:

# 如:
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.48.131" protocol  value="icmp"  reject'
success
[root@server ~]# firewall-cmd  --reload    # 重置
success
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: dhcpv6-client mdns nginx ssh 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="192.168.48.131" protocol value="icmp" reject
​
# 客户端输入ping   192.168.48.130  进行测试,发现无法ping,成功
​
# 注意:恢复客户端ping,不能在服务端添加一条放行富规则,应为禁止的富规则还在,ping还是无法通信,如:
[root@server ~]# firewall-cmd  --permanent  --add-rich-rule='rule  family="ipv4"  source address="192.168.48.131" protocol  value="icmp"  accept'
[root@server ~]# firewall-cmd  --reload
​
# 客户端测试ping  192.168.48.130  失败
​
# 注意:只需删除对应规则即可

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐