<
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

Linux防火墙与包管理器

字数:18465 写于:2022-02-23
最新更新:2022-02-23 阅读本文预计花费您53分钟

软件包

简介

Linux中的软件安装包一般分为源码包和二进制包:

源码包:一般是使用C语言等高级语言编写但未经过编译的包,安装时需要编译,所以时间长且安装步骤多,容易报错,但方便程序员阅读和修改源码

二进制包:源码包经过编译后形成二进制包,安装简单,安装速度快,但依赖性强,需要安装其他环境。二进制包通常有两大主流的管理系统:

  • RPM包管理系统:全称为Red-Hat Package Manager(红帽软件包管理器),由Red Hat公司开发的软件包管理系统,广泛应用于 RHEL(Red Hat Enterprise Linux)、CentOS、Fedora、openSUSE 等发行版。RPM主要负责底层包管理,并为上层包管理器提供支持,使用.rpm格式的软件包,通常搭配dnf/yum等高级包管理工具进行软件仓库访问、依赖管理和软件安装。

  • DPKG(Debian Package)包管理系统:是 Debian及其衍生发行版(如Ubuntu、Linux Mint等)的底层包管理工具,使用.deb格式的软件包,上层通常使用apt包管理工具进行软件仓库访问、依赖管理和软件安装。

源码包安装

由于未经过编译,源码包安装一般需要先安装gcc等编译器。源码包的安装一般要经过以下步骤:

  1. 通过tar命令解压
  2. 进入解压缩的目录下
  3. 阅读INSTALL文件,INSTALL一般为安装说明
  4. 执行 ./configure设置安装在默认路径下,也可以使用 ./configure –prefix=/usr/local/路径自定义安装路径,执行完会根据配置项生成 Makefile 文件
  5. 执行make 命令进行编译。如果报错,除错后执行make clean删除编译产生的临时文件即可。
  6. 执行make install 命令进行安装
  7. 源码包的卸载只需删除安装目录即可,不会遗留任何垃圾文件。

apt包管理器

简介

apt(Advanced Package Tool)是基于dpkg的包管理工具,也是Debian 及其衍生系统(如 Ubuntu)的默认包管理工具,用于软件的安装、升级、卸载和管理。它简化了依赖关系处理,能够自动从配置的软件源下载软件包。

apt是新一代的包管理工具(自Debian 8和Ubuntu 16.04起引入),整合了apt-getapt-cache的常用功能,提供更友好的输出、进度条和颜色提示,适合交互式命令行操作。apt-get是早期的包管理工具,自1998年起就已成为 Debian 的核心组件,专注于稳定性和脚本兼容性,提供更少的输出,适合在自动化脚本使用。二者使用相同的底层机制和软件源,可以根据具体场景选择其一使用。

apt命令

apt [命令] [选项] [参数]

  • -y 自动回答”yes”,常用于交互式执行命令
  • -q 静默模式(减少输出)
  • -v 显式详细的版本信息
  • -‌-reinstall 重新安装已存在的包
  • -‌-no-install-recommends 不安装推荐的附加包
  • -‌-install-suggests 安装建议的包(默认不安装)
安装与卸载
  • apt install 包名1 包名2..安装指定软件包,可以通过包名=版本安装指定的版本
  • apt remove 包名删除软件包,但保留配置文件
  • apt purge 包名删除软件包及其配置文件
  • apt autoremove自动删除不再需要的依赖包
  • apt -‌-fix-broken install尝试修复损坏的依赖
更新
  • apt update更新软件包列表(不安装软件,仅刷新可用版本信息)
  • apt upgrade升级所有已安装软件包(不删除旧依赖)
  • apt full-upgrade升级所有已安装软件包,但会移除阻碍升级的包
查询
  • apt show 包名显示包的详细信息(描述、版本、依赖等)
  • apt search 关键词搜索包含关键词的包
  • apt list –installed列出已安装的所有包
  • apt list –upgradable查看可升级的软件包

修改软件仓库源

在Debian或Ubuntu系统中,APT的软件仓库源配置文件位于/etc/apt/sources.list路径下,以及/etc/apt/sources.list.d/目录中(该目录一般为空),sources.list文件内容类似于:

deb http://archive.ubuntu.com/ubuntu focal main restricted deb http://security.ubuntu.com/ubuntu focal-security main restricted deb http://archive.ubuntu.com/ubuntu focal-updates main restricted

1.首先备份文件

cp /etc/apt/sources.list /etc/apt/sources.list.bak

2.修改URL,以阿里云镜像为例,Ubuntu 22.04 Jammy

deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

3.更新软件源缓存即可

apt update

dnf包管理器

dnf(Dandified yum)是基于RPM包管理器的高级前端工具,使用 Python2和Python3编写,是yum的下一代替代品。dnf不仅可以安装本地的.rpm文件,还能自动处理依赖关系,并直接从远程软件仓库下载软件包,它提供了更智能、更稳定的软件包管理方案。从Fedora 22开始,dnf 成为默认的包管理器,并在RHEL 8、CentOS 8及其衍生系统中正式取代了传统的yum,dnf兼容yum的大部分配置,大部分命令也只需要将yum替换为dnf就可直接执行。

dnf命令

以下是dnf命令的常用选项,具体命令参考后文:

dnf [命令] [选项] [参数]

  • -y 自动回答 “yes”,常用于非交互式执行dnf命令
  • -q 静默模式,减少命令输出
  • -‌-best 始终选择最新版本包
  • -‌-exclude=包名:在操作时排除指定的包
  • -‌-enablerepo=仓库名:使用指定的仓库
  • -‌-allowerasing 允许删除冲突的软件包以满足依赖
安装与卸载
  • dnf install 包名 安装软件包,可以通过包名-版本号形式指定包名,以安装特定版本的包
  • dnf reinstall 包名重新安装包
  • dnf remove 包名卸载软件包(或dnf erase)
  • dnf autoremove 包名删除依赖
更新
  • dnf upgrade更新所有可升级的软件包(旧版兼容语法为dnf update)
  • dnf update 包名更新指定的包
升级时必须指定包名,否则会升级所有可更新的包,包括Linux内核、库文件、应用程序等,升级Linux内核可能带来硬件驱动的兼容性问题(但升级时,新版内核安装,旧版会保留,启动时可选择),可以手动指定-‌-exclude=kernel*来避免升级内核文件

可以编辑/etc/yum.conf文件,添加以下配置来永久避免Linux内核的升级

exclude=kernel*
查询
  • dnf info查看包信息
  • dnf search “关键词”根据关键词搜索包
  • dnf list installed列出已安装的包
  • dnf list installed 包名查看某个包是否已安装
  • dnf list available 包名查看可用的包版本
  • dnf deplist 包名查看依赖关系
  • dnf provides 文件路径或关键词查看指定的文件属于哪个包
仓库管理
  • dnf repolist列出启用的仓库
  • dnf repolist all列出所有仓库(包括禁用)
  • dnf config-manager –enable 仓库ID启用仓库
  • dnf config-manager –disable 仓库ID禁用仓库
  • dnf config-manager –add-repo 仓库URL添加新仓库
软件包组管理
  • dnf group list查看可用的软件组
  • dnf group install “组名”安装一个软件组
  • dnf group remove “组名”删除软件组

更新dnf仓库源

dnf使用的仓库源信息与yum完全相同,配置国内的镜像源方法参考”修改yum软件仓库源”

yum包管理器

yum是一个由RedHat社区开发,基于RPM包管理的Shell前端软件包管理器,被广泛用于Fedora、RedHat以及CentOS中。yum能自动从指定的服务器下载RPM包并且安装,并自动处理依赖性关系

修改yum软件仓库源

网络yum源的配置文件路径为 /etc/yum.repos.d/CentOS-Base.repo ,配置信息类似于:

[base] name=CentOS-$releasever - Base - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

上述文件中配置信息的作用:

  • [base]  容器名称,放在[]中
  • name  容器说明,自由写
  • mirrorlist  镜像站点
  • baseurl  yum源服务器地址,默认为CentOS官方地址,国内可使用阿里云镜像地址
  • enabled  该容器是否失效,enable=0为不生效,enable=1为生效但会略写。
  • gpgcheck  为1则RPM的数字证书失效,0为不生效
  • gpgkey  数字证书公钥文件保存位置

可以将上述配置项中的baseurl修改为国内的源(上述配置已经改为了阿里云的源),来获得更快的下载速度

1.备份原文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.修改仓库源地址 3.理旧缓存并生成新缓存 对dnf执行: dnf clean all dnf makecache 对yum执行 yum clean all yum makecache

yum安装软件

yum命令中的包名不需要包的全名

查询包

yum list  列出所有可用的软件包

yum search 关键字 搜索服务器上所有和关键字相关的包

安装与升级

yum -y install 包名

  • -y  对询问自动回答yes
升级、卸载
  • yum -y update 包名
  • yum -y remove 包名
升级时必须写包名,否则会升级所有包,包括Linux内核,可能带来硬件驱动的兼容性问题。在卸载时会卸载包和包的所有依赖,但依赖可能还是其他包的依赖,因此可能导致其他软件功能失效,因此这两条命令谨慎使用

yum安装软件包组

  • yum grouplist  列出所有可用软件组
  • yum groupinstall 软件组名 安装软件组
  • yum groupremove 软件组名 卸载软件组

RPM包管理器

RPM(Red Hat Package Manager)是一种在RHEL、CentOS、Fedora等Red Hat系列Linux中广泛使用的包管理工具,用于安装、卸载、升级、查询和验证软件包。RPM软件包通常以.rpm(编译好的二进制包)或.src.rpm(源码包)结尾。但RPM只能处理本地的包文件,没有联网下载功能,且不会自动解决依赖问题,因此往往直接使用dnf或yum来完成软件包的安装。即便如此,它依旧是yum、dnf等高级的包管理器的基础,yum和dnf需要依赖于RPM来完成实际的软件包安装、卸载和查询等操作。

RPM包安装的默认路径为:

路径 文件
/etc/ 配置文件
/usr/bin/ 可执行命令安装目录
/usr/lib/ 程序使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man 帮助文件保存位置

通过RPM包安装的软件,大部分会附带systemd服务单元文件,服务启动时会自动去默认路径下寻找可执行命令,因此大部分软件可以通过系统服务管理命令service、systemctl命令管理

RPM包命令

RPM包管理器只能处理本地文件,不会从远程仓库自动下载软件,执行下述命令前需要提前下载好软件包,并且需要提前安装好软件的依赖环境

RPM包

RPM包全名类似于 httpd-2.2.3-29.el5.i386.rpm ,其命名规则为

  1. 包名
  2. 版本号,格式通常为“主版本号.次版本号.修正号”
  3. 发布次数,表示RPM包是第几次编译后发布的
  4. 适合的Liunx平台,如el5表示支持RHEL 5.x/CentOS 5.x下安装
  5. 适合的硬件平台,目前RPM支持的平台有:i386、i586、i686、sparc和alpha,noarch为支持所有硬件平台。
  6. 后缀名,.rpm是编译好的二进制包,可用rpm命令直接安装;.src.rpm表示是源码包,需要编译以后才能安装

rpm模块依赖查询网站: www.rpmfind.net

在以下命令中,有些命令要求使用包的全名(如安装时要明确指定安装包的全名,以区分不同版本的包),有些命令可以使用简易的包名(如查询已安装的包),指定错误的参数可能导致命令执行失败!
安装升级与卸载
  1. rpm -[i或U]vh 包全名 安装或升级软件
  • -i  安装(install)
  • -U  升级(upgrade)
  • -v  显示详细信息(verbose)
  • -h  显示进度(hash)
  • - -nodeps  不检测依赖性(通常仅用于实验测试)
  1. rpm -e 包名 卸载软件
  • - -nodeps  不检测依赖性
查询包信息
1. 查询是否安装了某个包

rpm -q 包名

  • -q  查询(query)
2. 列出所有已经安装的rpm包

rpm -qa 

  • -a  所有(all)
3. 查询rpm包详细信息

rpm -qi 包名

  • -i  查询信息(information)
  • -p  添加-p查询未安装包的信息(package),对于未安装的包,包名应为完整包名
4. 查询包文件安装位置

rpm -ql 包名

  • -l  列表(list)
  • -p  未安装包的信息(package),包名应为完整包名
5. 查询某个系统文件属于哪个rpm包

rpm -qf 文件名

  • -f  系统文件(file)
6. 查询rpm包的依赖环境

rpm -qR 包名

  • -R  查询包的依赖(requires)
  • -p  未安装包的依赖(package),包名应为完整包名
包校验

rpm -V 已经安装的包名

校验包中的文件是否正确,会返回包的验证信息

包文件提取

rpm2cpio 包全名 | cpio -idv 文件绝对路径

cpio:标准工具,用于创建档案文件和从档案文件中提取文件

rpm2cpio命令用于将rpm包转换为cpio格式

示例: rpm2cpio coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls 该命令可用于 /bin 目录下的 ls 目录被误删除,因而无法使用 ls 命令时,从 coreutils-8.4-19.el6.i686.rpm 包中提取 ls 目录到 bin 目录下,修复 ls 命令

防火墙

UFW

UFW(Uncomplicated Firewall)是Ubuntu和其他Debian系列操作系统默认的防火墙管理工具,是基于iptables或nftables的封装,它的目标是简化防火墙配置过程,让用户无需深入了解复杂的 iptables 语法,也能快速设置基本的网络访问控制策略。

UFW的执行策略

默认情况下,UFW的默认执行策略会拒绝所有入站流量(但默认允许ICMP(Ping)入站),允许所有出站流量。

ufw default deny incoming ufw default allow outgoing

对于用户添加的规则,UFW使用首次匹配优先策略,这意味着先添加的规则优先生效,数据包在匹配到第一条适用规则后会立即执行处理,因此当两个规则冲突时,先添加的规则将生效,如果没有匹配的规则,则回退到执行默认策略。

如:先添加拒绝所有22端口的流量,再添加允许某个IP地址的流量可以通过22端口 sudo ufw deny 22 sudo ufw allow from 192.168.1.100 to any port 22 由于ufw deny 22优先生效,来自192.168.1.100的流量依旧无法通过22端口,第二条命令无效 因此需要先取消第一条规则,然后添加第二条规则 sudo ufw delete deny 22 sudo ufw allow from 192.168.1.100 to any port 22 sudo ufw deny 22
首次使用UFW时,由于没有添加其他规则,UFW的默认执行策略会拒绝所有入站流量,因此它会断开远程ssh连接。在首次启用前,需要放行ssh服务使用的端口: ufw allow ssh (默认端口)或ufw allow 2222/tcp(自定义端口),然后再启用UFW:ufw enable

ufw命令

启用/关闭UFW
  • ufw enable 启用UFW
  • ufw disable关闭UFW
  • ufw status verbose查看UFW 的状态
查看状态
  • ufw status查看UFW的状态(基本信息),显示防火墙状态和正在生效的规则
  • ufw status verbose查看UFW 的状态(详细信息),包括防火墙状态、日志状态、防火墙的默认策略、正在生效的用户规则
防火墙未启用时,ufw status verbose命令只会返回防火墙状态 Status: inactive 防火墙启用状态下,执行ufw status verbose会返回防火墙的详细信息 Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip
To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6)
第一行为防火墙状态 第二行为日志状态 第三行为防火墙默认规则 第四行New profiles: skip表示当系统新增服务及其配置文件(如新安装了MySQL并生成了/etc/ufw/applications.d/mysql),UFW 不会自动为其添加允许规则,需要手动添加 ufw allow 'MySQL' 剩余行为生效的规则
开放/关闭端口
  • ufw allow 端口号[/协议]开放指定端口和协议
  • ufw deny 端口号[/协议]关闭指定端口和协议
1. 允许在端口53上传入tcp和udp数据包 ufw allow 53 2.允许在端口53上传入tcp数据包 ufw allow 53/tcp 3.拒绝端口 53 上的传入 udp 数据包 ufw deny 53/udp
通过服务管理规则

UFW允许通过服务直接添加规则,UFW会从/etc/services读取服务列表,用户可以直接指定拒绝/允许某个服务的流量

  • ufw allow 服务名
  • ufw deny 服务名
1.允许ssh服务的流量 ufw allow ssh
通过IP管理规则
  • ufw allow from IP地址允许某个IP访问所有端口
  • ufw deny from IP地址拒绝某个IP访问任何端口
通过编号管理规则

ufw会根据规则的添加顺序为规则编号,可以通过编号删除规则,也可以插入新规则在指定编号位置,删除或插入规则,后续的规则会自行排列,用户无法手动调整编号顺序。

  • ufw status numbered列出编号
  • ufw delete 编号删除指定编号
  • ufw insert 编号 规则在指定编号位置插入规则,编号需要小于当前规则的数量
在编号2位置插入指定规则 ufw insert 2 deny from 45.7.7.11
移除现有规则

ufw delete 已添加的规则

1.如果执行过 ufw deny 80/tcp 要移除该规则,则直接执行 ufw delete deny 80/tcp

组合语法

同时指定IP、端口号、协议等

ufw allow/deny [from 源] [to 目标] [port 端口] [proto 协议] [app 应用名]

  • 上述参数可以选择其中的几项
  • 源(from)和目标(to)参数可以是IP地址、IP段、域名,也可以是一个特殊参数any表示所有地址
1.允许IP地址 192.168.0.4访问端口 22 ufw allow from 192.168.0.4 to any port 22 2.允许 IP 地址 192.168.0.4 使用 TCP 访问端口 22 ufw allow from 192.168.0.4 to any port 22 proto tcp

禁用PING

默认情况下,UFW 允许ping(icmp)请求,要想禁用ping请求,需要编辑/etc/ufw/before.rules注释以下行,或者将其中的”ACCEPT”改为”DROP”(该部分属于IPTables的用法)

# ok icmp codes for INPUT -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

日志管理

  • ufw logging on启用日志
  • ufw logging off禁用日志
关于日志条目的解析参考: Interpreting Log Entries

Firewalld

Firewalld是Red Hat系列Linux发行版(如 RHEL、CentOS、Fedora)默认的动态防火墙管理工具,建立在 Linux 内核的iptables/nftables 之上,提供了比传统命令行工具更简洁、灵活的配置方式。与静态规则配置不同,Firewalld支持动态更新防火墙规则,无需重启防火墙即可动态添加、修改或移除规则,并引入了区域(zone)的概念,zone是Firewalld预先准备的几套防火墙策略模板,用户可以根据不同生产场景选择合适的策略集合,从而实现防火墙策略之间的快速切换,为不同的网络接口分配不同的信任级别,从而实现更精细的访问控制。

常用的区域

区域 默认策略
trusted(信任) 允许所有数据包
block(阻塞) 拒绝所有数据包
drop(丢弃) 丢弃所有数据包,并且不回复信息
home(家庭) 仅接受与流出数据有关,或者与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关的数据包
public(公共) 仅接受与流出数据有关,或与ssh、dhcpv6-client服务相关的数据包
internal(内部) 仅接受与流出数据有关,或与ssh、mdns、ipp-client、dhcpv6-client服务相关的数据包
work(工作) 仅接受与流出的流量,或与ssh、ipp-client与dhcpv6-client服务相关的数据包
external(外部) 仅接受与流出流量和ssh服务相关的数据包
DMZ(隔离) 又称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,仅接受与流出的流量相关和ssh服务相关的数据包

firewalld默认提供了9个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,文件位于/usr/lib /firewalld/zones/目录下。用户对区域进行修改后,会在/etc/firewalld/zones目录下生成对应的(用户自定义)配置文件。

防火墙开启与关闭

命令 说明
systemctl start firewalld 开启防火墙
systemctl stop firewalld 关闭防火墙
systemctl enable firewalld 开机自启动防火墙
systemctl disable firewalld 禁止开机自启动
systemctl status firewalld 查看防火墙状态

命令与参数

firewall-cmd [参数]

参数 说明
-‌-state 查看防火墙是否在运行
-‌-get-default-zone 查看当前生效的防火墙区域
-‌-set-default-zone=区域名 设置生效的防火墙区域
-‌-get-zones 显示所有可用的区域
-‌-get-active-zones 显示当前正在使用的区域与网卡名称
-‌-zone=区域名 -‌-list-all 列出指定区域的所有配置参数
-‌-list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
-‌-get-services 查看当前域所有支持的服务(需要放行的服务需要自行添加)
-‌-list-services 查看当前区域允许放行的服务列表
-‌-add-service=服务名 设置当前区域允许该服务的流量通过
-‌-add-port=端口号/协议 设置当前区域允许该端口的流量通过
-‌-remove-service=服务名 设置默认区域禁止该服务的流量通过
-‌-remove-port=端口号/协议 设置当前区域禁止该端口的流量通过
-‌-add-source= 将源自此IP或子网的流量导向指定的区域
-‌-remove-source= 不再将源自此IP或子网的流量导向某个指定区域
-‌-add-interface=网卡名 将源自该网卡的所有流量都导向某个指定区域
-‌-change-interface=网卡名 将某个网卡与区域进行关联
-‌-list-all 显示当前区域的网卡、资源配置,以及开放了哪些端口、服务
-‌-reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
-‌-panic-on 开启应急状况模式(关闭所有网络连接,包括远程ssh连接)
-‌-panic-off 关闭应急状况模式

生效模式,更新防火墙规则

默认情况下,firewalld配置的防火墙策略为当前生效模式(Runtime),系统重启时会失效。想让配置策略永久生效,需要添加-‌-permanent参数使用永久模式(Permanent),如:永久开放10800端口:firewall-cmd -‌-add-port=10800/tcp -‌-permanent ,但该模式配置的策略需要执行firewall-cmd -‌-reload命令重新加载后才会生效。

命令 说明
firewall-cmd -‌-reload 重新加载防火墙配置
firewall-cmd -‌-complete-reload 重新加载防火墙,不中断用户的连接,如远程连接(防火墙出严重故障时使用)

示例

1. 查看区域信息

查看public区域的所有信息 # firewall-cmd --zone=public --list-all 返回值的含义: Target:default //目标 icmp-block-inversion:yes/no //是否允许ICMP协议类型的数据包通过防火墙 Interfaces: //关联的网卡 sources: //来源,可以是IP地址或mac地址 services: //允许的服务 ports: //允许的端口,即本地开放的端口 protocols: //允许通过的协议 masquerade: yes/no //是否允许伪装,可改写来源IP地址及mac地址 forward-ports: //允许转发的端口 source-ports: //允许的来源端口 icmp-blocks: //可添加的ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许 rich rules: //富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。

2. 放行端口

永久放行10800-10805端口的tcp数据 # firewall-cmd --permanent --add-port=10800-10805/tcp 重新加载防火墙配置 # firewall-cmd --reload

3. 为网卡绑定区域

一般情况下,一台主机会有多个网卡,比如一块对公网,一块对内网,因此网卡使用的防火墙策略也不一样,可以单独为某个网卡绑定某个区域。通过firewall-cmd –set-default-zone命令设置的区域会对所有网卡生效,但如果该网卡绑定了单独的区域,则单独绑定区域的优先级更高。

将网卡eth0默认区域修改为external # firewall-cmd --permanent --zone=external --change-interface=eth0

4. 查询服务是否放行

如:查询SSH和HTTPS协议的流量是否允许放行

查询public区域中SSH协议的流量是否被放行 # firewall-cmd --zone=public --query-service=ssh 查询public区域中https协议的流量是否被放行 # firewall-cmd --zone=public --query-service=https

5. 放行协议流量

把HTTPS协议的流量设置为永久允许放行

在public区域中放行https协议的流量 # firewall-cmd --permanent --zone=public --add-service=https 重新加载防火墙配置 # firewall-cmd --reload

端口转发

端口转发命令格式如下,目标IP地址为所要访问服务器的IP地址:
firewall-cmd –permanent –zone=区域 –add-forward-port=port=源端口号:proto=协议:toport=目标端口号:toaddr=目标IP地址

将9000端口转发到22端口,使得用户能通过9000端口使用ssh远程连接服务 # firewall-cmd --permanent --zone=public --add-forward-port=port=9000:proto=tcp:toport=22:toaddr=192.168.0.1 重新加载防火墙配置 # firewall-cmd --reload

富规则

富规则也叫复规则,表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置,它的优先级在所有的防火墙策略中也是最高的。

拒绝192.168.0.1/24网段的所有用户访问本机的ssh服务 # # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.1/24" service name="ssh" reject" 重新加载防火墙配置 # firewall-cmd --reload

IPTables

IPTables 是Linux系统内核提供的防火墙工具,基于内核的 Netfilter 框架实现,用于管理网络数据包的过滤、网络地址转换(NAT)和流量整形。它通过定义规则链(Chains)和规则表(Tables) 来控制数据包的流向,是 Linux 网络安全的核心组件之一。

IPTables 提供了底层的防火墙控制能力,但其配置较为复杂,命令冗长、规则顺序敏感,且配置是静态的,修改规则往往需要手动保存并重启服务才能生效。因此现代系统逐渐转向 nftables

策略与规则链

IPTables会根据管理员书写的策略来决定防火墙是否放行数据包通过,基本的策略规则有四种:ACCEPT、REJECT、LOG、DROP。IPTables会按照从上到下的顺序来读取配置的策略规则,在找到匹配项后立即执行规则定义的行为(如:放行或阻止流量),若在读取完所有的策略规则之后没有匹配项,则会执行默认的策略。

IPTables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链。由于防火墙策略规则是按照从上到下的顺序匹配执行的,因此一定要把允许规则放到拒绝规则前,否则所有的流量就将被拒绝,因此规则链最后一条往往为拒绝规则。

当防火墙的默认策略为拒绝时,需要添加相应的规则链来放行允许进入服务器的数据,否则服务器将拒绝所有数据包;而当防火墙的默认策略为允许时,则需要添加相应的拒绝规则链,否则防火墙就失去了它的作用。一般情况下,INPUT流量的默认策略为拒绝,OUTPUT流量默认策略为允许。

数据包分类与处理方式

根据数据包的不同处理位置,数据包分为

  • 在进行路由选择前处理数据包(PREROUTING)
  • 处理流入的数据包(INPUT)
  • 处理流出的数据包(OUTPUT)
  • 处理转发的数据包(FORWARD)
  • 在进行路由选择后处理数据包(POSTROUTING)
数据包处理方式
语句 说明
ACCEPT 允许流量通过
REJECT 拒绝流量通过并返回流量被丢弃的提示信息
LOG 记录日志信息
DROP 拒绝流量通过且不返回任何信息

REJECT会在拒绝流量后,告知流量发送方流量已收到,但服务器拒绝响应的信息

DROP会直接丢弃流量,使流量发送方不清楚流量是被拒绝还是主机不在线,一般能更好保护主机安全。

命令与参数

iptables [参数] [对象]

参数 作用
-L 查看当前的规则链,可以使用iptables -L –line-numbers命令显示规则链的序号
-P 设置默认策略
-F 清空规则链
-A 在规则链末尾加入新规则
-I [序号] 在指定序号规则前加入新规则,无序号默认在规则链首加入
-R 序号 替换指定规则,无序号默认替换第一条规则
-D 序号 删除指定规则
-s IP/主机名 匹配来源的IP和主机,加!号表示除该IP外,子网掩码可以使用/MASK的方式表示
-d 匹配目标地址,类似于参数-s
-J 跳转到下一个处理规则,可能的值有:ACCEPT(允许数据通过), DROP(丢弃), QUEUE(进入队列), RETURN(返回上一个跳转规则)。也可以添加规则名跳转到指定规则
-i 网卡名 匹配从该网卡流入的数据
-o 网卡名 匹配从该网卡流出的数据
-p 协议 匹配协议,如:TCP、UDP等,all代表所有协议(一般不使用)
-‌-dport 端口号 匹配目标端口号
-‌-sport 端口号 匹配来源端口号
防火墙命令均需要root权限
如:查看当前规则链 iptables -L 返回结果: Chain INPUT (policy ACCEPT) //INPUT数据包,默认策略为ACCEPT num target prot opt source destination 1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 2 ACCEPT all -- anywhere anywhere 3 INPUT_direct all -- anywhere anywhere 4 INPUT_ZONES_SOURCE all -- anywhere anywhere 5 INPUT_ZONES all -- anywhere anywhere 6 DROP all -- anywhere anywhere ctstate INVALID 7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
示例: 1. 修改INPUT规则链默认配置为拒绝,并允许允许ICMP流量进入(允许服务器被ping后返回信息) # iptables -P INPUT DROP # iptables -I INPUT -p icmp -j ACCEPT 2. 拒绝所有人访问本机10800端口 # iptables -I INPUT -p tcp --dport 10800 -j REJECT # iptables -I INPUT -p udp --dport 10800 -j REJECT 3. 拒绝192.168.10.5主机访问本机80端口 iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT 4.拒绝所有主机访问本机1000~1024端口 # iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT # iptables -A INPUT -p udp --dport 1000:1024 -j REJECT 5.只允许192.168.10.0主机访问本机的22端口,拒绝来自其他所有主机的流量。 # iptables -I INPUT -s 192.168.10.0 -p tcp --dport 22 -j ACCEPT # iptables -A INPUT -p tcp --dport 22 -j REJECT
如同第5条命令,由于防火墙策略规则是按照从上到下的顺序匹配的,因此需要把允许规则放到拒绝规则前,否则所有的流量就将被拒绝
网口转发,如将公网的数据包转发到内网,假设eth0连接内网,eth1连接公网 iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

保存规则

通过命令添加的规则链,会在系统重启后失效,因此需要写入配置文件使其永久生效,可以使用命令service iptables save保存

ipv4默认保存位置为/etc/sysconfig/iptables-config

ipv6默认保存位置为/etc/sysconfig/ip6tables-config

上一篇:Nginx笔记(上)
下一篇:Shell脚本语言
z z z z z