软件包
简介
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等编译器。源码包的安装一般要经过以下步骤:
- 通过tar命令解压
- 进入解压缩的目录下
- 阅读INSTALL文件,INSTALL一般为安装说明
- 执行 ./configure设置安装在默认路径下,也可以使用 ./configure –prefix=/usr/local/路径自定义安装路径,执行完会根据配置项生成 Makefile 文件
- 执行make 命令进行编译。如果报错,除错后执行make clean删除编译产生的临时文件即可。
- 执行make install 命令进行安装
- 源码包的卸载只需删除安装目录即可,不会遗留任何垃圾文件。
apt包管理器
简介
apt(Advanced Package Tool)是基于dpkg的包管理工具,也是Debian 及其衍生系统(如 Ubuntu)的默认包管理工具,用于软件的安装、升级、卸载和管理。它简化了依赖关系处理,能够自动从配置的软件源下载软件包。
apt是新一代的包管理工具(自Debian 8和Ubuntu 16.04起引入),整合了apt-get和apt-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文件内容类似于:
1.首先备份文件
2.修改URL,以阿里云镜像为例,Ubuntu 22.04 Jammy
3.更新软件源缓存即可
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 包名更新指定的包
可以编辑/etc/yum.conf文件,添加以下配置来永久避免Linux内核的升级
查询
- 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 容器说明,自由写
- mirrorlist 镜像站点
- baseurl yum源服务器地址,默认为CentOS官方地址,国内可使用阿里云镜像地址
- enabled 该容器是否失效,enable=0为不生效,enable=1为生效但会略写。
- gpgcheck 为1则RPM的数字证书失效,0为不生效
- gpgkey 数字证书公钥文件保存位置
可以将上述配置项中的baseurl修改为国内的源(上述配置已经改为了阿里云的源),来获得更快的下载速度
yum安装软件
yum命令中的包名不需要包的全名
查询包
yum list 列出所有可用的软件包
yum search 关键字 搜索服务器上所有和关键字相关的包
安装与升级
yum -y install 包名
- -y 对询问自动回答yes
升级、卸载
- yum -y update 包名
- yum -y remove 包名
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 ,其命名规则为
- 包名
- 版本号,格式通常为“主版本号.次版本号.修正号”
- 发布次数,表示RPM包是第几次编译后发布的
- 适合的Liunx平台,如el5表示支持RHEL 5.x/CentOS 5.x下安装
- 适合的硬件平台,目前RPM支持的平台有:i386、i586、i686、sparc和alpha,noarch为支持所有硬件平台。
- 后缀名,.rpm是编译好的二进制包,可用rpm命令直接安装;.src.rpm表示是源码包,需要编译以后才能安装
rpm模块依赖查询网站: www.rpmfind.net
安装升级与卸载
- rpm -[i或U]vh 包全名 安装或升级软件
- -i 安装(install)
- -U 升级(upgrade)
- -v 显示详细信息(verbose)
- -h 显示进度(hash)
- - -nodeps 不检测依赖性(通常仅用于实验测试)
- 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格式
防火墙
UFW
UFW(Uncomplicated Firewall)是Ubuntu和其他Debian系列操作系统默认的防火墙管理工具,是基于iptables或nftables的封装,它的目标是简化防火墙配置过程,让用户无需深入了解复杂的 iptables 语法,也能快速设置基本的网络访问控制策略。
UFW的执行策略
默认情况下,UFW的默认执行策略会拒绝所有入站流量(但默认允许ICMP(Ping)入站),允许所有出站流量。
对于用户添加的规则,UFW使用
ufw命令
启用/关闭UFW
- ufw enable 启用UFW
- ufw disable关闭UFW
- ufw status verbose查看UFW 的状态
查看状态
- ufw status查看UFW的状态(基本信息),显示防火墙状态和正在生效的规则
- ufw status verbose查看UFW 的状态(详细信息),包括防火墙状态、日志状态、防火墙的默认策略、正在生效的用户规则
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 端口号[/协议]关闭指定端口和协议
通过服务管理规则
UFW允许通过服务直接添加规则,UFW会从/etc/services读取服务列表,用户可以直接指定拒绝/允许某个服务的流量
- ufw allow 服务名
- ufw deny 服务名
通过IP管理规则
- ufw allow from IP地址允许某个IP访问所有端口
- ufw deny from IP地址拒绝某个IP访问任何端口
通过编号管理规则
ufw会根据规则的添加顺序为规则编号,可以通过编号删除规则,也可以插入新规则在指定编号位置,删除或插入规则,后续的规则会自行排列,用户无法手动调整编号顺序。
- ufw status numbered列出编号
- ufw delete 编号删除指定编号
- ufw insert 编号 规则在指定编号位置插入规则,编号需要小于当前规则的数量
移除现有规则
ufw delete 已添加的规则
组合语法
同时指定IP、端口号、协议等
ufw allow/deny [from 源] [to 目标] [port 端口] [proto 协议] [app 应用名]
- 上述参数可以选择其中的几项
- 源(from)和目标(to)参数可以是IP地址、IP段、域名,也可以是一个特殊参数any表示所有地址
禁用PING
默认情况下,UFW 允许ping(icmp)请求,要想禁用ping请求,需要编辑/etc/ufw/before.rules注释以下行,或者将其中的”ACCEPT”改为”DROP”(该部分属于IPTables的用法)
日志管理
- ufw logging on启用日志
- ufw logging off禁用日志
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. 查看区域信息
2. 放行端口
3. 为网卡绑定区域
一般情况下,一台主机会有多个网卡,比如一块对公网,一块对内网,因此网卡使用的防火墙策略也不一样,可以单独为某个网卡绑定某个区域。通过firewall-cmd –set-default-zone命令设置的区域会对所有网卡生效,但如果该网卡绑定了单独的区域,则单独绑定区域的优先级更高。
4. 查询服务是否放行
如:查询SSH和HTTPS协议的流量是否允许放行
5. 放行协议流量
把HTTPS协议的流量设置为永久允许放行
端口转发
端口转发命令格式如下,目标IP地址为所要访问服务器的IP地址:
firewall-cmd –permanent –zone=区域 –add-forward-port=port=源端口号:proto=协议:toport=目标端口号:toaddr=目标IP地址
富规则
富规则也叫复规则,表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置,它的优先级在所有的防火墙策略中也是最高的。
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 端口号 | 匹配来源端口号 |
保存规则
通过命令添加的规则链,会在系统重启后失效,因此需要写入配置文件使其永久生效,可以使用命令service iptables save保存
ipv4默认保存位置为/etc/sysconfig/iptables-config
ipv6默认保存位置为/etc/sysconfig/ip6tables-config