Linux 系统安装、故障排除、sudo、加密、DNS 与 Web 服务整理

目录

  1. [Kickstart 与自动化安装](#Kickstart 与自动化安装)
  2. 系统故障排除
  3. [sudo 权限管理](#sudo 权限管理)
  4. 加密基础与算法
  5. [SSL/TLS 与 OpenSSL](#SSL/TLS 与 OpenSSL)
  6. [OpenSSH 与密钥认证](#OpenSSH 与密钥认证)
  7. [DNS 域名解析](#DNS 域名解析)
  8. [BIND 配置与管理](#BIND 配置与管理)
  9. [DHCP 服务](#DHCP 服务)
  10. [HTTP 协议与 Web 架构](#HTTP 协议与 Web 架构)
  11. [httpd (Apache) 安装与配置](#httpd (Apache) 安装与配置)
  12. [httpd 虚拟主机与 HTTPS](#httpd 虚拟主机与 HTTPS)

📌 核心概念一览

主题 核心概念 一句话
系统安装 Anaconda、Kickstart Anaconda 是 RHEL/Fedora 安装程序;Kickstart 用 ks 文件实现无人值守安装
故障排除 单用户模式、救援模式、MBR/grub 修复 确定特征→重现→收集信息→从简单入手、一次一种、先备份
权限管理 sudo、/etc/sudoers 让普通用户以指定身份执行命令;条目格式 who which_hosts=(runas) TAG:command
加密 对称、单向、非对称 对称快但密钥分发难;单向做摘要;非对称做身份认证与密钥交换
PKI/SSL CA、x509、OpenSSL CA 签发证书;SSL/TLS 在应用层下加密;OpenSSL 实现工具
SSH OpenSSH、密钥认证、scp/sftp 加密远程登录;密钥认证免密;scp 传文件
DNS 域名解析、递归/迭代、主/从/缓存 FQDN↔IP;stub resolver 查 /etc/hosts 再问 DNS;BIND/named 实现
资源记录 SOA、NS、A、MX、PTR、CNAME DNS 数据库条目;SOA 定义区域属性;NS 指定名称服务器;A 做正向解析
DHCP 动态主机配置、67/68 UDP DISCOVER→OFFER→REQUEST→ACK 四步获取 IP/掩码/网关/DNS
HTTP 超文本传输、请求/响应报文 GET/POST 方法;状态码 2xx 成功、3xx 重定向、4xx 客户端错、5xx 服务端错
httpd Apache、MPM、虚拟主机 prefork/worker/event 三种并发模型;基于 IP/端口/域名的虚拟主机
CGI 通用网关接口 httpd 调用外部程序生成动态内容;FastCGI 为改进版
HTTPS HTTP over SSL/TLS 443/tcp;mod_ssl;需证书与私钥

Kickstart 与自动化安装 🚀

Anaconda 简介

Anaconda 是 Red Hat Linux 和 Fedora 的安装管理程序,用 Python 与 C 编写,提供:

  • 图形界面:PyGTK
  • 文本界面:python-newt

可用于自动安装配置,最小化人工参与;支持 RHEL、Fedora 等多种系统。

名字由来:Anaconda 是一种吃蜥蜴的蟒蛇,因 Caldera 的安装程序名为 lizard(蜥蜴),故得名。

Kickstart 三部分结构

Kickstart 用于完成无人值守自动化安装 ,由一份 ks 配置文件驱动。

部分 起始标记 内容
命令段 (无特殊标记,文件开头) 必备命令(keyboard/lang/timezone/rootpw/auth/bootloader)+ 可选命令(autopart/clearpart/network/firewall 等)
软件包段 %packages 列出要安装的包或组,如 @basehttpd
脚本段 %pre%post %pre 在安装前执行(可用工具有限);%post 在安装后执行(常用于配置)

生活例子:Kickstart 像"装修清单"------命令段是"房型、墙色、地板",软件包段是"家具清单",脚本段是"装完后挂画、通电、贴对联"。

为什么需要 Kickstart?

大批量装机时,交互式安装每台都要选语言、分区、软件包,既慢又易出错。Kickstart 把所有选项写进 ks 文件,通过网络或光盘提供;安装程序按文件执行,实现无人值守,便于机房批量部署和环境一致性。

命令段:必备命令

命令 说明 示例
keyboard 键盘布局 keyboard us
lang 语言 lang en_USzh_CNlocale -a 可查所有支持语言
timezone 时区 timezone [--utc] Asia/Shanghaitimeconfig 可查时区,乱码可 export LANG=C
rootpw root 密码 rootpw --iscrypted <加密串>rootpw yourpassword
auth / authconfig 认证方式 authconfig --enableshadow --passalgo=sha512
bootloader 引导程序 bootloader --location=mbr --append="hdd=ide-scsi ide=nodma"

命令段:常用可选命令

命令 说明 示例/选项
autopart 自动分区 按默认策略分区
clearpart 清除分区 --all(全清)、--linux(仅 Linux 分区)、--none(默认,用空闲空间)、--initlabel(无分区表时初始化);慎用,指错可致命
ignoredisk 忽略/仅用某盘 ignoredisk --drives=sdb,sdc--only-use=sda
driverdisk 驱动盘位置 driverdisk --source=http://path/to/dd.imgnfs:host:/path
firewall 防火墙 firewall --enabled/--disabled--trust 可跟 --ssh--http--ftp
firstboot 首次启动向导 firstboot --disabled--enabled
halt 装完后关机 无参数即关机
graphical / text 安装界面 graphical(默认,图形)或 text(纯文本)
install / upgrade 安装或升级 installurl --url http://server/dirftp://user:pass@server/dir
interactive 交互模式 与自动化矛盾,一般不用
part 磁盘分区 定义具体分区,如 part / --fstype=ext4 --size=10240
network 网络配置 network --bootproto=dhcp--bootproto=static --ip=... --netmask=... --gateway=... --nameserver=... 可加 --device=eth0
selinux SELinux selinux --permissive--disabled
skipx 跳过 X 配置 不装图形界面时用

ks 文件放在哪、安装时如何指定

ks 文件位置 (通过 ks= 指定):

位置 示例
HTTP ks=http://server/path/ks.cfg
FTP ks=ftp://user:pass@server/path/ks.cfg
NFS ks=nfs:server:/path/ks.cfg
光盘 ks=cdrom:/ks.cfg
硬盘 ks=hd:sda1:/ks.cfg
软盘 ks=floppy:/ks.cfg
本地文件 ks=file:/path/ks.cfg

安装时 boot 提示符可用命令

命令 说明
askmethod 手动选择安装方式
dd= 指定驱动盘
ip= / netmask= / gateway= / dns= 配置网络(如 dns=8.8.8.8,8.8.4.4
ks= 指定 ks 文件位置(见上表)
ksdevice= 指定网卡(如 ksdevice=eth0
nonet 不启用网络
noprobe 不探测硬件(特殊硬件导致安装失败时可试)
rescue 进入救援模式

制作可引导 ISO(原文):

bash 复制代码
mkisofs -R -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso iso/

:原文提到用 Kickstart 自动安装 RHEL 6.5 时提示找不到 cdrom 驱动,改用 PXE 方式安装

对比:Kickstart 安装方式(ks 文件来源)

方式 适用场景 优缺点
HTTP/FTP 批量网络安装 快速、集中管理;需网络与 HTTP/FTP 服务器
NFS 内网批量安装 适合 Linux 环境;需 NFS 服务器
光盘 单机或小批量 无需网络;速度慢、不便更新
硬盘/U 盘 便携安装 灵活;需预先拷贝 ks 文件到设备
PXE 大规模网络部署 无需光盘/U 盘,全自动;需 DHCP + TFTP + PXE 服务器

对比:graphical 与 text 安装

对比项 graphical(图形) text(文本)
界面 PyGTK 图形界面 纯文本菜单
资源 占内存稍多 占用少
适用 桌面、有显示器 服务器、远程 console、低配机器

📖 名词解释

名词 解释 生活例子
Anaconda Red Hat/Fedora 的安装程序,用 Python+C 编写,提供图形和文本两种安装界面 像"装修公司的项目经理",帮你完成房子装修的全流程(选材料、铺地板、刷墙)
Kickstart 无人值守自动化安装工具,通过 ks 配置文件定义所有安装选项 像"装修清单",列好所有要求(房型、家具、颜色),装修队照单施工,不用你在场
ks 文件 Kickstart 配置文件,包含命令段、软件包段、脚本段三部分 像"装修合同",写明房型(命令段)、家具清单(软件包段)、装完后的收尾工作(脚本段)
%packages ks 文件中的软件包段标记,后面列出要安装的软件包或包组 像"家具采购清单",列出沙发、床、桌椅(@base、httpd、vim)
%pre ks 文件中的安装前脚本段,在安装开始前执行(可用工具有限) 像"装修前的准备",先量房、拆旧家具、铲墙皮
%post ks 文件中的安装后脚本段,在安装完成后执行(常用于配置) 像"装修后的收尾",挂画、通电、贴对联、打扫卫生
PXE 网络启动协议,通过网络从服务器加载操作系统,无需光盘/U盘 像"云端装修",不用带材料到现场,所有材料从中心仓库(服务器)直接送到工地(客户端)
mkisofs 制作 ISO 镜像文件的命令,可将目录打包成可引导的光盘镜像 像"把装修清单和材料样品打包成一个工具箱",方便携带和分发
ksvalidator 检查 ks 文件语法是否正确的工具 像"装修合同审核员",检查合同条款是否有错误或遗漏
system-config-kickstart 图形化创建 ks 文件的工具 像"装修设计软件",通过点击和选择来生成装修方案,不用手写

系统故障排除 🔧

故障排除思路(五步法)

  1. 确定故障特征:现象、报错、发生时机。
  2. 重现故障:在可复现条件下操作。
  3. 用工具收集信息 :日志(/var/log/messagesdmesg)、命令(lsmodlspci 等)。
  4. 排除不可能原因,从简单入手。
  5. 定位故障一次只尝试一种方式

原则

  • 先备份原文件 (如 /etc/fstab.bakdd if=/dev/sda of=/root/mbr.back
  • 尽量借助工具(单用户、救援模式、grub 命令行)

为什么故障排除强调"先备份、一次一种"?

改配置或重装组件有风险,若一次改多处,出问题后难以判断是哪一个改动导致的;先备份能在改坏时快速还原。一次只尝试一种修复方式,便于确定"是这一步解决了问题",方便总结和文档化。

常见故障类型

故障类型 典型现象
管理员密码忘记 无法登录
系统无法正常启动 MBR/grub 损坏、grub 配置文件丢失、stage2 等文件丢失
系统初始化故障 某文件系统无法挂载、驱动不兼容、kernel panic
服务故障 某服务启动失败导致整个系统卡住(如 sendmail 时间戳检查失败)
图形界面故障 X 无法启动
用户无法登录 bash 程序损坏
命令无法运行 PATH 被改错、库文件缺失
编译无法继续 开发环境缺基本组件
默认级别误设为 0 或 6 启动即关机或重启
rc.local 脚本错误 启动时卡住或报错

启动流程(排障顺序)

POST
BIOS

启动设备顺序
MBR

bootloader
Kernel

initrd
ROOTFS
/sbin/init
/etc/inittab

排障时按此顺序从前往后排查。

生活例子:故障排除像"看病"------先问症状(确定特征)、能不能复现(重现)、验血验尿(收集信息)、排除感冒(排除简单原因)、一次只试一种药(一次一种方式),且就诊前先拍片备份(先备份原文件)。

对比:常见故障排除方式

故障类型 首选方式 备选方式 工具
密码忘记 单用户模式 - grub 编辑 + passwd
MBR/grub 损坏 救援模式 另一台机器挂盘修 grub 命令行、dd
grub.conf 丢失 grub> 手动引导 救援模式重建 grub 命令、vi
bash 等关键文件损坏 救援模式 - rpm --replacepkgs
PATH 改错 新终端登录 单用户模式 export PATH
服务启动卡住 单用户关服务 交互模式(按 I) chkconfig、service
内核 panic 检查 grub root= / initrd 换内核 grub 编辑、dmesg

故障一:管理员密码忘记

解决 :进入单用户模式修改密码。

  1. 开机时按 e 进入 grub 编辑。
  2. 选中 kernel 行,按 e ,在行尾加 single (或 1sS)。
  3. b 启动。
  4. 进入单用户后:passwd root 重置密码。
  5. init 6 重启。

故障二:MBR 损坏

备份与模拟破坏

bash 复制代码
# 备份 MBR(前 512 字节)
dd if=/dev/sda of=/root/mbr.backup count=1 bs=512

# 模拟破坏 MBR(前 200 字节)
dd if=/dev/zero of=/dev/sda count=1 bs=200
sync
shutdown -r now

修复方法:使用救援模式(步骤详细)

  1. 挂载完整的系统安装光盘。
  2. 重启,在 boot> 提示符输入 linux rescue
  3. 选择 English 、键盘 us
  4. 选择 Yes 启动网络接口(若需从网络取包)。
  5. 选择 Yes 配置 eth0 网卡。
  6. 选择 Manual address(静态地址),空格选中。
  7. 设置 IP、掩码、网关、DNS。
  8. 选择 Continue,启动救援小系统。
  9. 在 shell 中输入 grub 进入 grub 命令行。
  10. find (hd0,0)(或按 TAB 列设备)查找内核在哪个磁盘/分区。
  11. root (hd0,0)(与 find 结果一致)。
  12. setup (hd0) 把 stage1 写入 MBR。
  13. quit 退出 grub。
  14. sync 同步磁盘。
  15. reboot 重启,成功。

故障三:grub 配置文件丢失

现象 :启动后显示 grub> 提示符。

手动引导步骤

  1. find (hd0,0)(或 TAB 列设备)。
  2. root (hd0,0)(假设 /boot 在 hd0,0)。
  3. kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00(TAB 补全)。
  4. initrd /initrd-2.6.18-308.el5.img(TAB 补全)。
  5. boot 启动。
  6. 进系统后,若 grub.conf 能找到就放回原位;若找不到,手动创建 /boot/grub/grub.conf
bash 复制代码
default=0
timeout=5
title WangSong Team
    root (hd0,0)
    kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00 quiet
    initrd /initrd-2.6.18-308.el5.img

故障四:grub 目录下其他文件丢失(如 stage2)

解决 :从同版本或 /usr/share/grub/i386-pc/(32 位)或对应 64 位目录拷贝回 /boot/grub/

故障五:系统初始化故障

  • 文件系统无法挂载 :检查 /etc/fstab、设备是否存在、文件系统类型。
  • 驱动不兼容 :可能导致 kernel panic(内核恐慌)。

故障六:默认级别误设为 0 或 6

现象:启动即关机或重启。

解决 :进入单用户模式 (方法同故障一),编辑 /etc/inittab,将 id:0:initdefault:id:6:initdefault: 改为 id:3:initdefault:id:5:initdefault:

故障七:用户无法登录(bash 被删)

现象:关机都关不掉,无法进入单用户(因 shell 是 bash)。

解决 :进入救援模式,重装 bash。

  1. 光盘启动,boot> linux rescue(步骤同故障二)。

  2. 进入救援系统后,挂载光盘:

    bash 复制代码
    mkdir /media
    mount /dev/hdc /media   # cdrom 指向 /dev/hdc
    cd /media/Server
    ls | grep bash
  3. 重装 bash(根已挂在 /mnt/sysimage):

    bash 复制代码
    rpm -ivh --replacepkgs --root /mnt/sysimage bash-3.2-xxx.rpm
  4. syncreboot

故障八:PATH 改错导致命令找不到

现象 :执行 export PATH=/data/bin 后,ls 等命令不可用。

解决

  • 新开终端重新登录(若只是当前 shell 改了)。
  • 若改了配置文件,手动指定:export PATH=/bin:/sbin:/usr/bin:/usr/sbinecho $PATH 可查看。
  • 或进入单用户模式修复配置文件。

故障九:/etc/rc.d/ 下某文件被删

解决:进入单用户模式,从备份或同版本系统拷回。

故障十:sendmail 时间戳检查失败

现象:启动时卡在 sendmail 服务。

解决

  • 方法一 :单用户模式关闭 sendmail(chkconfig sendmail off)。
  • 方法二 :启动时按 I 进入交互模式,逐条询问是否启动该服务,跳过 sendmail。

故障十一:编译无法继续

原因:开发环境缺基本组件(如 gcc、make、头文件)。

解决yum groupinstall "Development Tools" "Development Libraries" -y

配置备份建议

作为管理员应阶段性备份 /etc 下配置 ,并用版本控制工具(svngit)管理,可将配置恢复到过去某一时刻。

对比:单用户模式与救援模式

对比项 单用户模式(single) 救援模式(linux rescue)
进入方式 grub kernel 行尾加 single 光盘启动,boot 输入 linux rescue
使用的系统 本机根文件系统(只读后 remount 可写) 光盘上的小 Linux,本机根需手动挂到 /mnt/sysimage
典型用途 改 root 密码、改 inittab、关问题服务 MBR 重写、grub 重装、bash 等关键文件损坏
网络 可选配置 可选配置,常用于从网络拉包
能否用本机命令 是(本机 /bin、/sbin) 否(用光盘的,需 chroot 到 /mnt/sysimage 才能用本机命令)


不能
显示 grub>
完全不显示
🚨 故障发生
能进系统?
单用户模式

改密码/配置
grub 能显示?
grub 命令行

手动引导
救援模式

MBR/grub 重装
✅ 修复

📖 名词解释

名词 解释 生活例子
单用户模式 Linux 启动到 runlevel 1,只有 root 用户,不启动网络和多数服务,用于维护 像"维修模式",商场闭店后只有维修工进去修东西,顾客和店员都不在
救援模式 从光盘启动的小型 Linux 系统,用于修复无法启动的系统 像"急救车",你的车坏了开不动,急救车(光盘)来把你拖走修理
MBR Master Boot Record,主引导记录,硬盘第一个扇区的前 512 字节,包含引导程序和分区表 像"大楼的总开关和楼层指示牌",坏了整栋楼都进不去
GRUB Grand Unified Bootloader,Linux 的引导加载程序,负责加载内核 像"电梯操作员",你告诉他去几楼(选内核),他把你送到那一层(加载内核)
grub.conf GRUB 的配置文件,定义启动菜单和内核参数 像"电梯楼层按钮配置表",写明哪个按钮对应哪一层
kernel panic 内核恐慌,Linux 内核遇到无法恢复的错误而停止运行 像"司机突然晕倒",车(系统)立即停下来无法继续行驶
initrd/initramfs 初始化内存盘,包含启动时必需的驱动和工具,在内核加载后、根文件系统挂载前使用 像"急救包",车启动前先准备好急救包(驱动),万一路上出问题能应急
dd disk dump,磁盘复制命令,可按字节复制数据,常用于备份和恢复 像"复印机",可以一模一样地复制文件,包括格式和位置
sync 同步命令,将内存中的数据强制写入磁盘 像"保存按钮",把内存里的修改真正写到硬盘上,防止断电丢失
chroot change root,改变根目录,让进程以指定目录为根 像"虚拟现实眼镜",戴上后你看到的世界(根目录)变了,但实际还在原地
rpm --replacepkgs RPM 包管理器的"替换安装"选项,即使已安装也重新安装,用于修复损坏的文件 像"重装软件",软件坏了就重装一遍,覆盖掉坏的文件
PATH 环境变量,定义系统查找命令的目录列表 像"快捷方式列表",你说"打开记事本",系统按列表顺序找到记事本程序
dmesg 显示内核环形缓冲区的消息,包含硬件检测和驱动加载信息 像"汽车仪表盘的故障记录",记录启动时发生的所有事件
lsmod 列出当前加载的内核模块 像"查看已安装的插件列表",看看系统装了哪些驱动模块
lspci 列出所有 PCI 设备 像"查看电脑配置单",显示显卡、网卡、声卡等硬件

sudo 权限管理 👤

sudo 作用与配置文件

sudo :让某用户以另一用户身份(通常 root)执行指定命令。

  • 配置文件:/etc/sudoers ,建议用 visudo 编辑(会做语法检查)。

一条 sudo 条目格式

text 复制代码
who  which_hosts=(runas)  TAG: command
字段 含义 可写成
who 用户 用户名、%组名、User_Alias
which_hosts 主机 主机名、IP、网段、Host_Alias
runas 以谁身份 用户名、%组名、Runas_Alias
TAG 标签 NOPASSWD (此后命令免密)、PASSWD(需密码)
command 命令 绝对路径、Cmnd_Alias

示例

text 复制代码
hadoop ALL=(root) NOPASSWD:/usr/sbin/useradd, PASSWD:/usr/sbin/usermod

表示用户 hadoop 在任何主机上可以无密码以 root 执行 useradd,但执行 usermod 需输密码。

四类别名

别名规则必须全大写,且只能由大写字母组成。

别名类型 可包含
User_Alias 用户名、%组名、其他用户别名
Host_Alias 主机名、IP、网段、其他主机别名
Runas_Alias 用户名、%组名、其他 Runas 别名
Cmnd_Alias 命令绝对路径、目录(即该目录下所有命令)、其他命令别名

示例

text 复制代码
User_Alias USERADMIN = hadoop, %hadoop, %useradmin
Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, !/usr/bin/passwd root, /usr/bin/passwd [A-Za-z]*
USERADMIN ALL=(root) NOPASSWD: USERADMINCMND

注意

  • 命令尽量用绝对路径
  • ! 表示"不允许",如 !/usr/bin/passwd root 表示不能 passwd root取反优先级最高
  • [A-Za-z]* 表示命令后必须跟字母参数(如 passwd tom 可以,passwd 单独不行)。

sudo 常用命令

命令 作用
sudo COMMAND 以授权身份执行命令
sudo -l 列出当前用户可执行的 sudo 命令
sudo -k 清除缓存的认证信息(下次 sudo 需输密码)
  • sudo 默认有效期约 5 分钟,超时后需重新输入密码。
  • 日志tail /var/log/secure 可查看 sudo 使用记录;tail /var/log/messages 也有相关记录。

为什么用 sudo 而不是直接给 root 密码?

root 密码给多人共用时,谁做了什么无法区分,且密码易泄露。sudo 可以按用户、按主机、按命令精细授权,且所有执行记录在日志里,便于审计;需要时收回某人的 sudo 权限即可,不用改 root 密码。

为什么别名必须全大写?

sudoers 语法规定:为与真实用户名、主机名区分,别名被规定为必须全大写,这样解析时不会与普通用户名混淆。

生活例子:sudo 像"公司门禁权限"------不是每人一把总经理钥匙(root),而是给每个人开不同门的权限(useradd、某脚本),且进门记录可查。

对比:直接给 root 密码 vs sudo

对比项 直接给 root 密码 sudo
权限粒度 全部 root 权限 按命令、按主机精细控制
审计 无法区分谁做的 日志记录每条 sudo 操作
安全 密码泄露影响大 收回某人权限即可,不用改密码
学习曲线 简单 需学 sudoers 语法

👤 普通用户
🔑 sudo 授权
✅ 允许的命令

如 useradd
❌ 禁止的命令

如 passwd root
📋 日志记录

/var/log/secure

📖 名词解释

名词 解释 生活例子
sudo Substitute User DO,让普通用户以其他用户(通常是 root)身份执行命令 像"临时授权卡",保安(sudo)给你一张卡,让你进入特定房间(执行特定命令),但不给你总钥匙(root 密码)
/etc/sudoers sudo 的配置文件,定义哪些用户可以执行哪些命令 像"权限清单",写明张三可以开会议室门,李四可以开仓库门
visudo 编辑 /etc/sudoers 的专用命令,会检查语法错误 像"专业编辑器",写错了会提醒你,防止把权限配置文件改坏
NOPASSWD sudo 配置标签,表示执行命令时不需要输入密码 像"免密门禁",刷卡就能进,不用输密码
User_Alias sudo 配置中的用户别名,将多个用户归为一组 像"部门名称",不用一个个列员工名字,直接说"技术部"
Cmnd_Alias sudo 配置中的命令别名,将多个命令归为一组 像"权限包",不用一个个列命令,直接说"用户管理权限包"
sudo -l 列出当前用户可以执行的 sudo 命令 像"查看我的门禁卡能开哪些门"
sudo -k 清除 sudo 的认证缓存,下次使用需重新输密码 像"退出登录",清除记住的密码,下次要重新输
/var/log/secure 安全日志文件,记录 sudo、ssh 等安全相关操作 像"门禁记录",记录谁在什么时间进了哪个门

加密基础与算法 🔐

数据安全三要素

要素 含义 实现方式
机密性 数据内容不被窃取 对称加密、非对称加密
完整性 数据内容不被篡改 单向加密(摘要)+ 签名
身份验证 确定通信双方身份 非对称加密(数字签名)、CA 证书

加密类型对比

类型 密钥 速度 典型算法 主要用途
对称加密 加解密同一密钥 DES(56bit)、3DES、AES(128/192/256/512)、Blowfish 大量数据加密
单向加密 无密钥(摘要) MD4、MD5、SHA1、SHA256/384/512、CRC-32 完整性校验、密码存储
非对称加密 公钥/私钥对 RSA(加密+签名)、DSA(签名)、ElGamal 身份认证、密钥交换、签名

对称加密

  • 加解密用同一密钥,速度快,适合大量数据。
  • 问题:密钥如何安全传输?

单向加密

  • 提取数据特征码(摘要/fingerprint),定长输出,不可逆。
  • 特点 :输入相同→输出必然相同;雪崩效应(输入微小改变→输出巨大差异)。
  • 用途:数据完整性校验(发送方附上摘要,接收方重新计算比对);密码存储(存 hash 而非明文)。

非对称加密

  • 密钥对:公钥(P)、私钥(S)。
  • 特点:公钥加密→私钥解密;私钥加密→公钥解密。
  • 用途
    • 发送方用自己私钥加密 (签名)→接收方用公钥解密→身份认证
    • 发送方用对方公钥加密 →对方用私钥解密→数据机密性
  • 问题:速度慢,一般不直接加密大量数据。

为什么非对称加密一般不直接加密整份数据?

非对称加密运算慢、对数据长度有限制。实际做法多是:用非对称加密做身份认证密钥交换 (例如用对方公钥加密一个随机数,对方用私钥解密得到后作为对称密钥),大量数据则用对称加密,兼顾安全与性能。HTTPS、SSH 都采用这种组合。
生活例子:加密组合像"快递"------对称加密是"装箱打包"(快),非对称加密是"验身份证+交钥匙"(慢但安全);你不会用身份证验证来打包每件货(太慢),而是先验身份、交一把锁的钥匙(密钥交换),再用那把锁快速封箱(对称加密)。

小/签名
🔐 加密需求
数据量大?
对称加密

DES/AES


非对称加密

RSA/DSA

慢但安全
❓ 密钥怎么传?
非对称加密

交换对称密钥
✅ 组合使用

HTTPS/SSH

密钥交换:Diffie-Hellman 协议

IKE(Internet Key Exchange):用 Diffie-Hellman 协议在不安全信道协商共享密钥。

原理简述(原文):

  • A 和 B 各自选一个秘密数 x、y。
  • 公开参数:大素数 P、生成数 g。
  • B 发给 A:g^y % p;A 收到后计算 (g^y % p)^x = g^(xy) % p
  • A 发给 B:g^x % p;B 收到后计算 (g^x % p)^y = g^(xy) % p
  • 双方得到相同的 g^(xy) % p 作为共享密钥。

问题 :解决了密钥交换,但身份认证问题仍存在(中间人攻击)。

PKI 与 CA

PKI(Public Key Infrastructure,公钥基础设施) :以 CA(Certificate Authority,证书颁发机构) 为核心,管理密钥与证书。

CA 原理

  1. 服务器将公钥发给 CA。
  2. CA 用自己的私钥给服务器公钥签名,加上数字签名等信息,生成证书
  3. 服务器与客户端通信时,将证书发给客户端。
  4. 客户端用 CA 公钥解密证书→验证合法性→获得服务器公钥。
  5. 如何信任 CA 公钥:最安全的办法是到 CA 机构拷贝其公钥(或预装在系统/浏览器里)。

x509 证书(PKI 标准)包含:

  • 公钥及有效期
  • 证书合法拥有者
  • 证书用途
  • CA 信息
  • CA 签名校验码

PKI 实现

  • TLS/SSL:x509 证书
  • OpenGPG:另一套 PKI 体系

完整安全通信流程(HTTPS 为例)

  1. 客户端用 CA 公钥验证服务器证书→获得服务器公钥。
  2. 客户端生成随机数,用服务器公钥加密后发给服务器。
  3. 服务器用私钥解密得到随机数。
  4. 双方用该随机数作为对称密钥加密数据(可定期更换)。
  5. 服务器用私钥加密数据摘要(签名)→客户端用公钥验证→完整性 + 身份认证

至此:机密性(对称加密)、完整性(摘要+签名)、身份验证(证书+CA)三者均得到保证。
🖥️ 服务器
🏛️ CA
📜 签发证书
💻 客户端
✅ 验证证书

用 CA 公钥
🔑 获得服务器公钥
🎲 生成随机数

用公钥加密
🔓 私钥解密

得到随机数
🔐 用随机数

做对称密钥

生活例子:PKI/CA 像"办护照"------你把身份信息(公钥)交给公安局(CA),公安局核实后盖章(签名)发护照(证书);你出国时海关(客户端)看到公安局的章就信你,且从护照上拿到你的照片(公钥)确认是你本人。

📖 名词解释

名词 解释 生活例子
对称加密 加密和解密使用同一个密钥的加密方式,速度快但密钥分发困难 像"保险箱钥匙",开锁和锁门用同一把钥匙,问题是怎么把钥匙安全地给对方
非对称加密 使用公钥和私钥两个密钥,公钥加密私钥解密,或私钥加密公钥解密 像"挂锁",你把开着的锁(公钥)给别人,他锁上后只有你的钥匙(私钥)能打开
单向加密 只能加密不能解密,生成固定长度的摘要,用于验证数据完整性 像"指纹",从人能提取指纹,但从指纹无法还原出人
DES Data Encryption Standard,数据加密标准,56 位密钥,已不安全 像"老式密码锁",只有 3 位数字,容易被破解
AES Advanced Encryption Standard,高级加密标准,支持 128/192/256 位密钥 像"现代密码锁",有 10 位数字,非常安全
MD5 Message Digest 5,消息摘要算法第 5 版,生成 128 位摘要,已不安全 像"旧版防伪码",容易被伪造
SHA Secure Hash Algorithm,安全散列算法,有 SHA1/SHA256/SHA512 等版本 像"新版防伪码",更难伪造
RSA 非对称加密算法,以三位发明者名字命名,可用于加密和签名 像"银行保险箱",有两把钥匙,一把公开一把私有
DSA Digital Signature Algorithm,数字签名算法,只能用于签名不能加密 像"签名笔",只能签名证明是你,不能用来加密内容
摘要/fingerprint 单向加密生成的固定长度特征码,用于验证数据是否被篡改 像"文件的指纹",文件改一个字,指纹就完全不同
雪崩效应 输入微小改变导致输出巨大差异的特性,是好的加密算法的标志 像"蝴蝶效应",改一个字母,整个摘要完全变样
密钥交换 在不安全信道上协商出共享密钥的过程 像"暗号对接",两个特工在电话里说暗号,旁人听不懂,但他们能确定共同的秘密
Diffie-Hellman 密钥交换协议,允许双方在不安全信道上协商共享密钥 像"调色游戏",你有红色我有蓝色,我们各自混入对方的颜色,最后得到相同的紫色
PKI Public Key Infrastructure,公钥基础设施,管理密钥和证书的体系 像"身份证系统",有发证机关(CA)、身份证(证书)、验证流程
CA Certificate Authority,证书颁发机构,负责签发和管理数字证书 像"公安局户籍科",负责发身份证并盖章证明
x509 数字证书的标准格式,定义证书应包含的信息 像"身份证格式标准",规定必须有姓名、照片、有效期等
数字签名 用私钥对数据摘要加密,证明数据来自特定发送者且未被篡改 像"手写签名+指纹",证明文件是你签的且没被改过

SSL/TLS 与 OpenSSL 🔒

SSL/TLS 简介

  • SSL(Secure Socket Layer):安全套接字层。
  • TLS(Transport Layer Security):传输层安全,SSL 的后续版本。

位置 :在 TCP/IP 模型的应用层与传输层之间附加一层,为 HTTP、FTP、SMTP 等明文协议提供加密。

应用:HTTPS(HTTP over SSL/TLS)、FTPS、SMTPS 等。

SSL 分层

作用
SSL 记录协议 建立在可靠传输协议(TCP)上,为高层提供数据封装、压缩、加密
SSL 握手协议 建立在 SSL 记录协议之上,用于传输前身份验证、协商加密算法、交换加密密钥

HTTPS 握手流程(SSL 会话建立)

服务器 客户端 服务器 客户端 1. TCP 三次握手 2. SSL 会话请求 3. 协商 SSL 版本、算法 4. 发送服务器证书 5. 验证证书合法性 6. 用证书公钥加密随机数 7. HTTPS 请求(URL) 8. 用随机数加密数据+私钥签名

注意 (原文):SSL 会话是基于 IP 地址建立的,一个 IP 上只能有一个 SSL 会话,即一个 IP 只能有一个 HTTPS 服务器(可以是主机或虚拟主机之一)。

OpenSSL

OpenSSL:Linux 上实现 SSL 协议的开源工具。

三部分

组件 说明
libcrypto 加密库
libssl TLS/SSL 实现库(基于会话,实现身份认证、数据机密性、会话完整性)
openssl 多用途命令行工具(加密/解密、摘要、生成密钥、创建私有 CA)

OpenSSL 常用命令

用途 命令示例
测试加密性能 openssl speed
加密文件 openssl enc -des3 -salt -a -in ping.sh -out ping.enc
解密文件 openssl enc -des3 -d -salt -a -in ping.enc -out ping.sh
MD5 摘要 openssl dgst -md5 file 或系统 md5sum file
SHA1 摘要 sha1sum file
生成密码哈希 openssl passwd -1openssl passwd -1 -salt .uJLV8x0(盐加密)
获取随机数 openssl rand -base64 100
生成私钥 (umask 077; openssl genrsa -out server.key 2048)openssl genrsa 2048 > service.key
从私钥提取公钥 openssl rsa -in server.key -pubout
自签名证书 openssl req -new -x509 -key server.key -out server.crt -days 365
查看证书 openssl x509 -text -in server.crt

证书配置目录 (原文):/etc/pki/tls/openssl.cnf

对比:SSL/TLS 与 SSH

对比项 SSL/TLS SSH
主要用途 为应用层协议(HTTP/FTP/SMTP)加密 加密远程登录与文件传输
典型应用 HTTPS、FTPS ssh、scp、sftp
证书 需 CA 签发的 x509 证书 主机密钥(自签名),可选用户密钥
端口 443(HTTPS)、990(FTPS) 22

生活例子:SSL/TLS 像"给邮局加装保险箱"------原本明信片(HTTP)谁都能看,加了保险箱(SSL)后变挂号信(HTTPS),只有收件人能打开。

📖 名词解释

名词 解释 生活例子
SSL Secure Socket Layer,安全套接字层,为网络通信提供加密 像"信封",把明信片(明文)装进信封(加密)再寄出
TLS Transport Layer Security,传输层安全,SSL 的后续版本,更安全 像"升级版信封",更厚更结实,更难被拆开
HTTPS HTTP over SSL/TLS,在 HTTP 基础上加 SSL/TLS 加密 像"挂号信",比普通信(HTTP)更安全,有加密和签收
OpenSSL 开源的 SSL/TLS 实现,提供加密库和命令行工具 像"加密工具箱",里面有各种加密工具和算法
libcrypto OpenSSL 的加密库,提供各种加密算法实现 像"密码学教科书",包含所有加密算法的实现
libssl OpenSSL 的 SSL/TLS 库,实现 SSL/TLS 协议 像"安全通信手册",教你怎么建立安全连接
openssl 命令 OpenSSL 提供的命令行工具,用于加密、生成密钥、创建证书等 像"瑞士军刀",一个工具包含多种功能
自签名证书 自己给自己签发的证书,不经过 CA,浏览器会警告不信任 像"自己写的证明信",没有权威机构盖章,别人不一定信

OpenSSH 与密钥认证 🔑

OpenSSH 简介

OpenSSH :SSH(Secure SHell)协议的免费开源实现,用于加密远程控制与文件传输,取代 telnet、rcp、ftp、rlogin、rsh 等不安全的明文传输工具。

  • 服务端:sshd(Linux)
  • 客户端:ssh(Linux)、PuTTY、SecureCRT、Xmanager(Windows)

版本

  • V1:基本不使用(不安全)。
  • V2:主流,使用 RSA/DSA 密钥。

认证方式

  1. 基于口令认证
  2. 基于密钥认证(推荐)

相关文件与目录

安装包rpm -qa | grep ssh
查看版本ssh -V

配置文件

文件 说明
/etc/ssh/ssh_config 客户端配置
/etc/ssh/sshd_config 服务端配置

主机密钥 (在 /etc/ssh/):

密钥文件 说明
ssh_host_rsa_key / .pub RSA 密钥(V2)
ssh_host_dsa_key / .pub DSA 密钥(V2)
ssh_host_key / .pub V1 密钥(不推荐)
moduli 密钥交换和认证相关信息

客户端保存的主机指纹~/.ssh/known_hosts(权限 644)

sshd_config 常用配置

配置项 默认值 说明
Port 22 监听端口(建议改非默认)
AddressFamily any 地址族:any、inet(IPv4)、inet6
Protocol 2 协议版本(不要用 1)
KeyRegenerationInterval 1h 密钥更换周期
ServerKeyBits 1024 密钥长度
LoginGraceTime 2m 登录超时
PermitRootLogin yes 是否允许 root 直接登录(建议关闭
MaxAuthTries 6 试错次数
PrintLastLog yes 打印上次登录信息(建议不暴露)
Subsystem sftp /usr/libexec/openssh/sftp-server sftp 子系统(sftp 基于 ssh;ftps 基于 ssl)

基于密钥的认证(三步)

1. 生成密钥对(客户端)

bash 复制代码
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N 'password'

选项:

  • -t {rsa|dsa}:指定算法
  • -f /path/to/keyfile:保存位置(默认 ~/.ssh/id_rsa
  • -N 'password':指定密码(可为空)

2. 将公钥传到服务器

方法一 :用 ssh-copy-id(推荐)

bash 复制代码
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

方法二:手动 scp 后追加

bash 复制代码
scp ~/.ssh/id_rsa.pub user@host:/tmp/
ssh user@host
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

3. 测试登录

bash 复制代码
ssh user@host

若出现 "Agent admitted failure to sign using the key",执行 ssh-add

ssh 使用技巧

用法 说明
ssh user@host 登录远程主机
ssh -l user host 同上
ssh user@host 'command' 不登录,只执行命令并返回结果
ssh -X user@host 启用 X11 转发(可运行远程图形程序)
ssh -2 -p port user@host 指定端口

scp 与 sftp

scp:基于 SSH 的远程复制命令。

bash 复制代码
scp [options] SRC DEST
选项 说明
-r 递归复制目录
-p 保持源文件元数据(mode、timestamp)
-q 静默模式
-P PORT 指定远程端口

示例

bash 复制代码
# 从远程拷到本地
scp root@172.16.100.2:/etc/fstab ./

# 从本地拷到远程
scp fstab root@172.16.100.2:/root/

# 指定端口
scp -P 2222 file user@host:/path/

sftp:交互式文件传输。

bash 复制代码
sftp [user@]host

对比:sftp 与 ftps

对比项 sftp ftps
基于 SSH(22/tcp) SSL/TLS(21/tcp + 数据端口)
加密 SSH 加密 SSL/TLS 加密
认证 SSH 认证(密钥或密码) FTP 认证 + SSL 证书

对比:telnet/rsh 与 SSH

对比项 telnet/rcp/rlogin/rsh SSH(OpenSSH)
传输 明文 加密
密码 明文传输 加密传输
主机认证 有(主机密钥)
现状 已淘汰 主流

💻 客户端
🔑 生成密钥对

ssh-keygen
📤 公钥传到服务器

ssh-copy-id
🖥️ 服务器

~/.ssh/authorized_keys
🔓 免密登录

ssh user@host

生活例子:SSH 密钥认证像"小区门禁卡"------你把卡(公钥)给物业(服务器)录入,以后刷卡(私钥)就能进,不用每次报身份证号(密码);且卡丢了只需让物业删你那张,不用改整个小区的密码。

📖 名词解释

名词 解释 生活例子
SSH Secure SHell,安全外壳协议,用于加密远程登录和命令执行 像"加密对讲机",你和服务器说话时别人听不懂
OpenSSH SSH 协议的开源实现,最常用的 SSH 软件 像"免费的加密对讲机软件"
sshd SSH 服务端守护进程,运行在服务器上监听 SSH 连接 像"门卫",守在门口等人来登录
ssh-keygen 生成 SSH 密钥对(公钥和私钥)的命令 像"配钥匙机器",给你配一对钥匙(公钥和私钥)
ssh-copy-id 将公钥复制到远程服务器的命令,简化密钥认证配置 像"把门禁卡交给物业录入系统"
authorized_keys 存储允许登录的公钥列表的文件,位于 ~/.ssh/ 目录 像"门禁卡数据库",记录哪些卡可以开门
known_hosts 存储已知主机指纹的文件,用于验证服务器身份 像"可信服务器通讯录",记录你连过的服务器的"指纹"
scp Secure Copy,基于 SSH 的安全文件复制命令 像"加密快递",文件在传输过程中被加密保护
sftp SSH File Transfer Protocol,基于 SSH 的安全文件传输协议 像"加密 FTP",交互式传文件,但是加密的
主机密钥 SSH 服务器的身份标识,用于证明服务器身份 像"服务器的身份证",证明你连的是真服务器不是假冒的
密钥认证 使用公钥/私钥对进行身份验证,比密码更安全 像"指纹识别",比输密码更安全更方便
telnet 明文远程登录协议,不加密,已被 SSH 取代 像"明信片",内容谁都能看,不安全
PuTTY Windows 上常用的 SSH 客户端软件 像"Windows 版对讲机"

SSH 安全建议(总结)

  1. 密码要经常换且足够复杂。
  2. 使用非默认端口(改 Port)。
  3. 限制登录客户地址(AllowUsers、Match Address)。
  4. 禁止 root 直接登录PermitRootLogin no)。
  5. 仅开放有限用户。
  6. 使用基于密钥的认证
  7. 不要使用 V1 版本Protocol 2)。

DNS 域名解析 🌐

DNS 基本概念

DNS(Domain Name Service) :域名解析服务,实现 FQDN↔IP 双向转换。

  • FQDN :Full Qualified Domain Name,完全限定域名,如 www.magedu.com.(末尾有点)。
  • 域名magedu.com 是域;www.magedu.com 是主机名(FQDN)。

名称解析框架nsswitch

  • 配置文件:/etc/nsswitch.conf
  • 示例行:hosts: files dns
    • files :先查 /etc/hosts
    • dns:再问 DNS 服务器

stub resolver(名称解析器):本地程序,按 nsswitch 配置查询。

域名管理机构

机构 职责
IANA 互联网域名与 IP 分配机构
ICANN 民间域名分配机构,管理顶级域(TLD)

TLD(顶级域)

类型 示例
组织域 .com、.org、.net、.cc
国家域 .cn、.tw、.hk、.jp、.ir、.iq
反向域 IP→FQDN(in-addr.arpa)

解析与查询

解析类型

类型 方向
正向解析 FQDN → IP
反向解析 IP → FQDN(不是同一数据库)

查询类型

类型 说明
递归 客户端只发一次请求,由 DNS 服务器一路查到底并返回结果
迭代 DNS 服务器只返回"下一跳"(参考答案),由请求方多次请求

实际互联网 :本地 DNS 对客户端提供递归 ,对外部 DNS 用迭代

DNS 服务器类型

类型 说明
主 DNS 服务器 数据可修改,权威答案
辅助(从)DNS 服务器 从主服务器同步数据(按 serial number、refresh、retry、expire、TTL)
缓存 DNS 服务器 不负责区域,只缓存查询结果(非权威答案)
转发器 将查询转发给其他 DNS

权威答案 vs 非权威答案

类型 说明 TTL
权威答案 来自该区域的主/从服务器 肯定答案、否定答案均有 TTL
非权威答案 来自缓存 会过期,超时后重新查询

DNS 分布式数据库

  • 上级仅知道其直接下级(如 .com 知道 magedu.com 的 NS)。
  • 下级只知道根的位置(根提示文件 named.ca)。

负载均衡:一个域名可对应多个 IP,DNS 可轮询返回不同 IP。




💻 PC

ping www.magedu.com
/etc/nsswitch.conf

hosts: files dns
📄 /etc/hosts

有?
✅ 返回 IP
🌐 stub resolver

问 DNS 服务器
递归?
🔄 DNS 递归查询

一路查到底
🔁 迭代查询

返回参考答案
✅ 返回 IP + TTL

生活例子:DNS 像"114 查号台"------你问"某某公司电话",查号台先翻本地电话本(/etc/hosts),没有就打给总台(根 DNS),总台说"问 .com 台",.com 台说"问 magedu.com 台",最后 magedu.com 台告诉你"www 是 192.168.0.1"。

对比:递归与迭代查询

对比项 递归查询 迭代查询
请求次数 客户端只发一次 客户端发多次
谁负责查 DNS 服务器一路查到底 客户端(或 DNS)逐级问
返回结果 最终答案 参考答案(下一跳)
谁用 PC 对本地 DNS 本地 DNS 对外部 DNS

对比:正向解析与反向解析

对比项 正向解析 反向解析
方向 FQDN → IP IP → FQDN
数据库 正向区域文件(如 magedu.com.zone) 反向区域文件(如 0.168.192.in-addr.arpa.zone)
典型 RR A、AAAA、CNAME PTR
用途 访问网站、发邮件 日志、反垃圾邮件、安全验证

BIND 配置与管理 📋

BIND 简介

BIND(Berkeley Internet Name Domain):DNS 的常见实现,由 ISC 维护。

bind97 包(RHEL 5/6):

文件/目录 说明
/etc/named.conf 主配置文件(BIND 进程属性 + 区域定义)
/etc/rndc.key rndc(Remote Name Domain Controller)密钥文件
/etc/rndc.conf rndc 配置
/var/named/ 区域数据文件目录
/etc/rc.d/init.d/named 服务脚本(start/stop/restart/status/reload)
/usr/sbin/named 二进制程序

bind-chroot (可选):将 named 运行在 chroot 环境(/var/named/chroot/),增强安全。

默认用户/组:named / named

DNS 监听端口

端口 协议 用途
53/udp UDP 查询
53/tcp TCP 区域传送(axfr/ixfr)
953/tcp TCP rndc 控制

资源记录(RR)格式

text 复制代码
NAME  [TTL]  IN  RR_TYPE  VALUE

常见 RR 类型

类型 含义 格式 示例
SOA 起始授权记录 ZONE_NAME IN SOA MASTER_NS ADMIN_MAILBOX (serial refresh retry expire na_ttl) magedu.com. IN SOA ns1.magedu.com. admin.magedu.com. (2013040101 1H 5M 1W 1D)
NS 名称服务器 ZONE_NAME IN NS NS_FQDN magedu.com. IN NS ns1.magedu.com.
A IPv4 地址 FQDN IN A IPv4 www.magedu.com. IN A 192.168.0.1
AAAA IPv6 地址 FQDN IN AAAA IPv6 www.magedu.com. IN AAAA 2001:db8::1
PTR 反向解析 IP.in-addr.arpa IN PTR FQDN 1.0.168.192.in-addr.arpa. IN PTR www.magedu.com.
MX 邮件交换器 ZONE_NAME IN MX pri MX_FQDN magedu.com. IN MX 10 mail.magedu.com.
CNAME 别名 ALIAS IN CNAME FQDN www2.magedu.com. IN CNAME www.magedu.com.
TXT 文本记录 NAME IN TXT "text" SPF、验证等

时间单位 :M(分钟)、H(小时)、D(天)、W(周),默认秒。
邮箱格式admin@magedu.com 写为 admin.magedu.com.

对比:常见 DNS 资源记录

RR 类型 作用 左侧(NAME) 右侧(VALUE) 典型场景
SOA 定义区域属性 区域名 主 NS、管理员邮箱、序列号等 每个区域必有一条
NS 指定名称服务器 区域名 NS 服务器 FQDN 指明谁负责该区域
A IPv4 地址 主机名 IPv4 最常用,正向解析
AAAA IPv6 地址 主机名 IPv6 IPv6 环境
PTR 反向解析 IP(倒序) FQDN 日志、安全
MX 邮件服务器 区域名 邮件服务器 FQDN + 优先级 发邮件时查询
CNAME 别名 别名 真实 FQDN 多个名字指向同一主机

📦 区域 magedu.com
📋 SOA

定义区域属性
🖥️ NS

ns1/ns2
🌐 A 记录

www→IP
🌐 A 记录

mail→IP
📧 MX 记录

邮件服务器
🔗 CNAME

ftp→www

区域类型与配置

zone 定义格式 (在 /etc/named.conf):

text 复制代码
zone "ZONE_NAME" IN {
    type {master|slave|hint|forward};
    file "区域数据文件";
    masters { master_ip; };  // 仅从区域需要
    allow-transfer { ip; };  // 允许哪些 IP 做区域传送
};

主区域示例

text 复制代码
zone "magedu.com" IN {
    type master;
    file "magedu.com.zone";
    allow-transfer { 172.16.100.2; };
};

从区域示例

text 复制代码
zone "magedu.com" IN {
    type slave;
    file "slaves/magedu.com.zone";
    masters { 172.16.100.1; };
};

提示区域(根):

text 复制代码
zone "." IN {
    type hint;
    file "named.ca";
};

转发区域

text 复制代码
zone "example.com" IN {
    type forward;
    forward only;  // 或 first
    forwarders { 8.8.8.8; };
};

区域传送

类型 说明
axfr 完全区域传送(传整个区域)
ixfr 增量区域传送(仅传变化部分)

对比:DNS 区域类型

区域类型 数据来源 可否修改 典型配置
master(主) 本地区域文件 可修改 type master; file "zone.file";
slave(从) 从主服务器同步 不可修改(只读) type slave; masters { ip; };
hint(提示) 根提示文件 不修改 type hint; file "named.ca";(根区域)
forward(转发) 转发给其他 DNS 不存数据 type forward; forwarders { ip; };

区域传送

axfr/ixfr
区域传送
🖥️ 主 DNS

可修改数据
📋 从 DNS 1

只读同步
📋 从 DNS 2

只读同步
💾 缓存 DNS

不负责区域

只缓存查询
↗️ 转发 DNS

转发给上游

区域数据文件示例

正向区域文件magedu.com.zone):

text 复制代码
$TTL 600
@       IN  SOA     ns1.magedu.com. admin.magedu.com. (
                    2013040101  ; serial
                    1H          ; refresh
                    5M          ; retry
                    1W          ; expire
                    1D )        ; negative TTL
        IN  NS      ns1.magedu.com.
        IN  NS      ns2.magedu.com.
        IN  MX  10  mail.magedu.com.
ns1     IN  A       192.168.0.10
ns2     IN  A       192.168.0.11
www     IN  A       192.168.0.1
mail    IN  A       192.168.0.2
ftp     IN  CNAME   www

反向区域文件0.168.192.in-addr.arpa.zone):

text 复制代码
$TTL 600
@       IN  SOA     ns1.magedu.com. admin.magedu.com. (
                    2013040101 1H 5M 1W 1D )
        IN  NS      ns1.magedu.com.
1       IN  PTR     www.magedu.com.
2       IN  PTR     mail.magedu.com.
10      IN  PTR     ns1.magedu.com.

简写规则

  • @ :代表当前区域名($ORIGIN)。
  • 省略 FQDN 末尾的点时,会自动补上 $ORIGIN

泛域解析

text 复制代码
*.magedu.com.  IN  A  192.168.0.100

子域授权

在父域区域文件中:

text 复制代码
SUB_ZONE_NAME       IN  NS  NSSERVER_SUB_ZONE_NAME
NSSERVER_SUB_ZONE_NAME  IN  A   IP

示例 (在 magedu.com.zone 中):

text 复制代码
fin.magedu.com.         IN  NS  ns1.fin.magedu.com.
fin.magedu.com.         IN  NS  ns2.fin.magedu.com.
ns1.fin.magedu.com.     IN  A   172.16.100.8
ns2.fin.magedu.com.     IN  A   172.16.100.9

named.conf 常用选项

options 段

text 复制代码
options {
    directory "/var/named";
    allow-recursion { 172.16.0.0/16; };  // 允许哪些 IP 递归查询
    allow-query { any; };                // 允许哪些 IP 查询
    allow-transfer { none; };            // 允许哪些 IP 做区域传送
    forwarders { 8.8.8.8; };             // 转发器
    forward first;                       // 或 only
};

ACL(访问控制列表)

text 复制代码
acl innet {
    172.16.0.0/16;
    127.0.0.0/8;
};
allow-query { innet; };

内置 ACLanynonelocalhostlocalnets

view(视图):根据客户端来源返回不同结果(智能 DNS、CDN)。

text 复制代码
view "internal" {
    match-clients { 192.168.0.0/24; };
    zone "magedu.com" IN { ... };
};
view "external" {
    match-clients { any; };
    zone "magedu.com" IN { ... };
};

注意:所有区域都必须定义在视图中(若用 view)。

日志配置

logging 段

text 复制代码
logging {
    category queries { query_log; };
    channel query_log {
        file "/var/log/named/queries.log" versions 3 size 10m;
        severity info;
    };
};
  • category:日志源(如 queries、xfer-in、xfer-out)。
  • channel:日志保存位置(syslog 或自定义文件)。

DNS 查询工具

dig(Domain Information Groper):

用法 说明
dig -t A www.baidu.com 查 A 记录
dig -t NS magedu.com 查 NS 记录
dig -t SOA magedu.com 查 SOA 记录
dig -t MX magedu.com 查 MX 记录
dig -x 172.16.100.1 反向查询(IP→FQDN)
dig @8.8.8.8 www.baidu.com 指定 DNS 服务器
dig +recurse ... 递归查询
dig +norecurse ... 不递归(返回参考答案)
dig +trace ... 查看递归过程

host

bash 复制代码
host -t A www.baidu.com
host -t NS magedu.com
host -t SOA magedu.com

nslookup(交互式):

text 复制代码
nslookup
> server 8.8.8.8
> set q=A
> www.baidu.com

配置检查与管理

命令 说明
named-checkconf 检查 named.conf 语法
named-checkzone ZONE FILE 检查区域文件语法
rndc reload 重新加载配置
rndc reload ZONE 重新加载某区域
rndc status 查看 named 状态
rndc flush 清空缓存

SELinux 与 DNS

临时关闭

bash 复制代码
getenforce          # 查看状态
setenforce 0        # 设为 Permissive

永久关闭

bash 复制代码
vim /etc/selinux/config
# 改为 SELINUX=permissive 或 disabled

压力测试

queryperf:DNS 查询压力测试工具(原文提及)。

对比:dig、host、nslookup

工具 特点 典型用法
dig 功能最全,输出详细 dig -t A name @serverdig +tracedig -x IP
host 简洁,输出少 host -t A namehost IP
nslookup 交互式,老工具 nslookupserver IPset q=Aname

生活例子:DNS 主从像"连锁店"------总店(主 DNS)有完整菜单(区域数据),分店(从 DNS)定期从总店拷菜单(区域传送),顾客(客户端)问任何一家都能点到菜(查到 IP);总店改菜单后通知分店更新(serial number + refresh)。

📖 名词解释

名词 解释 生活例子
DNS Domain Name System,域名系统,将域名转换为 IP 地址 像"电话簿",你说"找张三",它告诉你张三的电话号码
FQDN Fully Qualified Domain Name,完全限定域名,如 www.example.com. 像"完整地址",包含门牌号、街道、城市、国家
域名 互联网上的名称标识,如 example.com 像"公司名称",比 IP 地址(电话号码)更好记
stub resolver 客户端的 DNS 解析器,负责发起 DNS 查询 像"你的秘书",你说要找谁,秘书帮你查电话簿
nsswitch Name Service Switch,名称服务切换,定义查询顺序 像"查找策略",先查本地通讯录,再打 114 查号台
/etc/hosts 本地主机名解析文件,优先于 DNS 查询 像"手机通讯录",先查通讯录,没有再打 114
递归查询 客户端只发一次请求,DNS 服务器负责查到底并返回结果 像"全包服务",你问秘书要电话,秘书帮你查到底再告诉你
迭代查询 DNS 服务器只返回下一跳地址,客户端需多次查询 像"指路",你问路人,路人说"往前走问下一个人"
正向解析 域名 → IP 地址 像"查电话号码",你说姓名查到电话
反向解析 IP 地址 → 域名 像"查来电显示",看到号码查是谁打来的
BIND Berkeley Internet Name Domain,最常用的 DNS 服务器软件 像"114 查号台系统"
named BIND 的守护进程,实际运行的 DNS 服务 像"查号台接线员"
区域(zone) DNS 管理的一个域名空间,如 example.com 像"一个公司的员工名册"
主 DNS 拥有区域数据的权威服务器,可修改数据 像"总公司人事部",掌握员工名册原件
从 DNS 从主 DNS 同步数据的服务器,只读 像"分公司人事部",定期从总部拷贝员工名册
缓存 DNS 只缓存查询结果,不负责任何区域 像"你的通话记录",记住最近打过的号码
转发器 将 DNS 查询转发给其他 DNS 服务器 像"转接员",你问他,他转给专业人员
SOA Start of Authority,起始授权记录,定义区域属性 像"员工名册封面",写明版本号、负责人、更新时间
NS Name Server,名称服务器记录,指定负责该区域的 DNS 服务器 像"人事部电话",告诉你谁负责这个名册
A 记录 Address,IPv4 地址记录,域名到 IP 的映射 像"姓名→电话"的对应关系
AAAA 记录 IPv6 地址记录 像"姓名→新版电话号码(更长)"
PTR Pointer,指针记录,用于反向解析 像"电话→姓名"的反向对应
MX Mail eXchange,邮件交换记录,指定邮件服务器 像"收信地址",告诉邮递员把信送到哪
CNAME Canonical Name,别名记录,一个域名指向另一个域名 像"小名→大名",张三的小名叫小张
TTL Time To Live,生存时间,DNS 记录的缓存时间 像"保质期",过期后要重新查询
serial number 区域文件的序列号,用于判断数据是否更新 像"版本号",版本号变了说明名册更新了
区域传送 主 DNS 将区域数据复制给从 DNS 像"总部发名册给分部"
axfr 完全区域传送,传输整个区域数据 像"复印整本名册"
ixfr 增量区域传送,只传输变化的部分 像"只发更新的那几页"
dig DNS 查询工具,功能强大,输出详细 像"专业查号工具",显示详细查询过程
nslookup 交互式 DNS 查询工具 像"简易查号工具"
rndc Remote Name Domain Controller,远程控制 named 的工具 像"查号台管理后台"

DHCP 服务 📡

DHCP 简介

DHCP(Dynamic Host Configuration Protocol) :动态主机配置协议,基于 bootp 发展而来。

作用:自动为客户端分配:

  • IP 地址
  • 子网掩码
  • 网关
  • DNS 服务器

端口

  • 67/udp:服务端
  • 68/udp:客户端

DHCP 工作流程(四步)

DHCP 服务器 客户端 DHCP 服务器 客户端 1. DHCPDISCOVER(广播) 2. DHCPOFFER(提供 IP) 3. DHCPREQUEST(请求该 IP) 4. DHCPACK(确认分配)

续租:租期快到时,客户端再发 DHCPREQUEST → 服务器回 DHCPACK。

生活例子:DHCP 像"酒店前台分房卡"------你到前台(DISCOVER 广播"有空房吗"),前台查空房后给你 302 房卡(OFFER),你说"要这间"(REQUEST),前台登记后确认(ACK);住几天后(租期)要续住,再去前台续(续租)。

对比:DHCP 与静态 IP

对比项 DHCP(动态) 静态 IP
配置 自动获取 手动配置
适用 客户端、临时设备、大量主机 服务器、网络设备
IP 冲突 DHCP 避免冲突 手动配易冲突
管理 集中管理(DHCP 服务器) 分散配置

📖 名词解释

名词 解释 生活例子
DHCP Dynamic Host Configuration Protocol,动态主机配置协议,自动分配 IP 地址 像"酒店前台",客人来了自动分配房间号,不用客人自己选
DHCPDISCOVER DHCP 发现消息,客户端广播寻找 DHCP 服务器 像"有空房吗"的广播喊话
DHCPOFFER DHCP 提供消息,服务器回应可用的 IP 地址 像前台回应"302 房间可以"
DHCPREQUEST DHCP 请求消息,客户端请求使用某个 IP 像"我要 302 房间"
DHCPACK DHCP 确认消息,服务器确认分配 像"好的,给你房卡"
租期(lease) DHCP 分配的 IP 地址的有效期 像"住 3 天",到期要续租或退房
续租 租期快到时,客户端请求延长使用时间 像"我要续住 3 天"
67/udp DHCP 服务器监听端口 像"前台电话号码"
68/udp DHCP 客户端使用端口 像"客人的电话号码"
IP 地址池 DHCP 服务器可分配的 IP 地址范围 像"可用房间列表",从 201 到 299
保留地址 为特定 MAC 地址预留的固定 IP 像"VIP 专属房间",张三来永远住 888
bootp Bootstrap Protocol,DHCP 的前身,功能较简单 像"老式前台系统"

安装与查看

bash 复制代码
yum list all | grep dhcp   # 查看 dhcp 包
yum -y install dhcp        # 安装
rpm -ql dhcp               # 查看安装文件
netstat -unlp              # 查看端口(67/udp)

HTTP 协议与 Web 架构 🌐

HTTP 简介

HTTP(HyperText Transfer Protocol):超文本传输协议。

版本演进

版本 特点
HTTP/0.9 仅纯文本(超链接)、ASCII
HTTP/1.0 增加方法(PUT、POST、DELETE、HEAD)、MIME、短连接
HTTP/1.1 增强缓存、长连接(Keep-Alive)、Host 头(虚拟主机)

HTML(HyperText Mark Language) :超文本标记语言,如 <h2>Title</h2>

URI 与 URL

  • URI(Uniform Resource Identifier):统一资源标识符,全局范围内路径格式统一。
  • URL(Uniform Resource Locator):统一资源定位符。

格式

text 复制代码
protocol://HOST:port/path/to/file

示例http://www.magedu.com/download/linux.tar.gz

对比:URI 与 URL

对比项 URI URL
含义 统一资源标识符(Identifier) 统一资源定位符(Locator)
范围 更广,包括 URL URL 是 URI 的子集
示例 urn:isbn:0-486-27557-4(书号) http://example.com/file

HTTP 方法

方法 说明
GET 获取资源
POST 提交数据
PUT 上传资源
DELETE 删除资源
HEAD 仅获取头部

MIME

MIME(Multipurpose Internet Mail Extension):多用途互联网邮件扩展。

  • SMTP 是纯文本协议;MIME 将非文本数据(如图片)编码为文本(如 Base64),接收方再还原并调用程序打开。
  • 协议首部Content-Type: image/jpegtext/html 等。

动态网页

静态内容.html.css.jpeg.png.gif 等,直接返回文件。

动态内容 :服务器端存储的是脚本 (如 .php.jsp),接受参数后运行一次,生成 HTML 后返回。

流程

text 复制代码
Client --> httpd (index.php) --> PHP 解释器运行 --> 生成 HTML --> httpd --> Client

动态网页 = 静态内容 + 动态内容(只有动态部分需运行)。

对比:静态网页与动态网页

对比项 静态网页 动态网页
文件类型 .html、.css、.jpeg、.png .php、.jsp、.py、.cgi
服务器处理 直接返回文件 运行脚本生成 HTML 后返回
内容 固定,所有人看到一样 可根据参数、用户、时间变化
性能 慢(需运行)
缓存 易缓存 部分可缓存



💻 客户端
📤 HTTP 请求

GET /index.php?id=1
🖥️ httpd
静态?
📄 读文件

index.html
🔧 调用 PHP

运行 index.php
📝 生成 HTML
📥 HTTP 响应

生活例子:静态网页像"印刷品"------报纸印好了就不变,谁看都一样;动态网页像"点菜"------你点什么厨房(服务器)现做什么,每个人的菜(页面)可能不一样。

📖 名词解释

名词 解释 生活例子
HTTP HyperText Transfer Protocol,超文本传输协议,Web 的基础协议 像"餐厅点菜流程",你说要什么,服务员端上来
超文本 包含链接的文本,可以跳转到其他文档 像"百科全书的参见条目",点一下跳到另一页
URL Uniform Resource Locator,统一资源定位符,网址 像"完整地址",包含街道、门牌号、房间号
URI Uniform Resource Identifier,统一资源标识符,比 URL 更广泛 像"身份证号",唯一标识一个资源
GET HTTP 请求方法,获取资源 像"我要看菜单"
POST HTTP 请求方法,提交数据 像"我要点这些菜"
PUT HTTP 请求方法,上传资源 像"我要上传一个文件"
DELETE HTTP 请求方法,删除资源 像"删除我的订单"
HEAD HTTP 请求方法,只获取头部信息 像"问一下有没有这道菜,不用真的上菜"
MIME Multipurpose Internet Mail Extension,多用途互联网邮件扩展 像"文件类型标签",告诉浏览器这是图片还是文本
静态内容 服务器直接返回的文件,如 HTML、图片 像"印好的菜单",拿来就看
动态内容 服务器运行脚本生成的内容,如 PHP、JSP 像"现做的菜",根据你的要求现场制作
状态码 HTTP 响应的数字代码,表示请求结果 像"服务员的回应",200 是"好的",404 是"没这道菜"
200 OK 请求成功 像"菜上齐了"
301 永久重定向,资源已永久移动 像"这家店搬到新地址了"
302 临时重定向,资源临时在其他位置 像"今天在临时摊位营业"
304 未修改,可以使用缓存 像"菜单没变,用上次的"
404 未找到,资源不存在 像"没这道菜"
403 禁止访问,没有权限 像"这道菜不对外卖"
500 服务器内部错误 像"厨房出问题了"
503 服务不可用,服务器过载 像"客人太多,暂停接单"
Keep-Alive HTTP 长连接,一个连接可发送多个请求 像"包桌",不用每点一道菜就重新排队
请求报文 客户端发给服务器的消息,包含方法、URL、头部、正文 像"点菜单",写明要什么菜、几份、什么口味
响应报文 服务器返回给客户端的消息,包含状态码、头部、正文 像"上菜",告诉你菜来了,是什么菜

HTTP 报文

请求报文格式

text 复制代码
<method> <request-URL> <version>
<headers>

<entity-body>

示例

text 复制代码
GET / HTTP/1.1
Host: www.magedu.com
Connection: keep-alive

响应报文格式

text 复制代码
<version> <status> <reason-phrase>
<headers>

<entity-body>

示例

text 复制代码
HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.17
Content-Encoding: gzip
Content-Length: 6931

<html>...</html>

报文组成

  • 起始行(start line):第一行
  • 首部域(Header field):name: value 格式
  • 实体主体(Body):响应内容

HTTP 状态码

类别 含义 示例
1xx 纯信息 100 Continue
2xx 成功 200 OK、201 Created、202 Accepted
3xx 重定向 301 Moved Permanently、302 Found、304 Not Modified
4xx 客户端错误 404 Not Found、403 Forbidden
5xx 服务器错误 500 Internal Server Error、503 Service Unavailable

2xx
3xx
4xx
5xx
📨 HTTP 请求
状态?
✅ 成功

200 OK
↗️ 重定向

301/302
❌ 客户端错

404/403
💥 服务器错

500/503

对比:常见状态码

状态码 含义 何时出现 客户端该做什么
200 OK 请求成功 正常处理响应
301 永久重定向 资源永久移到新 URL 更新书签,以后用新 URL
302 临时重定向 资源临时在新 URL 本次用新 URL,下次仍用旧 URL
304 未修改 缓存仍有效 用本地缓存
404 未找到 文件不存在、URL 错 检查 URL
403 禁止访问 权限不足 检查权限或登录
500 服务器内部错 脚本错误、配置错 联系管理员
503 服务不可用 服务器过载或维护 稍后重试

Web 服务器主要操作(七步)

  1. 建立连接:接受或拒绝客户端连接。
  2. 接收请求:通过网络读取 HTTP 请求报文。
  3. 处理请求:解析报文并决定动作。
  4. 访问资源:读取请求的文件或调用脚本。
  5. 构建响应:生成 HTTP 响应报文。
  6. 发送响应:向客户端发送。
  7. 记录日志:写入访问日志。

Web 服务器并发架构

架构 说明 优缺点
单线程 一次处理一个请求 简单,但并发差
多进程/多线程 为每个请求生成进程或线程 并发好,但大量进程/线程消耗资源
I/O 多路复用 同步监控所有连接,状态改变时处理 高效,不被空闲连接占用
多路复用 + 多线程 结合多进程与多路复用 充分利用多 CPU,避免单进程服务过多请求

Web 代理

代理服务器:工作于客户端与服务器之间,接收客户端请求并转发,再将响应回送客户端。

用途:缓存、访问控制、负载均衡。

对比:Web 服务器并发架构

架构 并发方式 优点 缺点 典型代表
单线程 一次一个 简单 并发差 早期简单服务器
多进程/多线程 一请求一进程/线程 并发好 大量进程/线程消耗资源 Apache prefork
I/O 多路复用 事件驱动,一进程多连接 高效,不被空闲连接占用 编程复杂 Nginx、Apache event
多路复用+多线程 多进程+每进程多路复用 充分利用多 CPU 更复杂 Apache worker

生活例子:Web 并发架构像"餐厅服务"------单线程是"一个服务员,一次只服务一桌";多进程是"来一桌客人就叫一个服务员";I/O 多路复用是"一个服务员盯着所有桌,哪桌需要就去哪桌";多路复用+多线程是"几个服务员,每人盯几桌"。


httpd (Apache) 安装与配置 🖥️

Apache 简介

Apache :开源 Web 服务器,由 ASF(Apache Software Foundation) 维护。

特点

  • 事先创建进程,按需维持适当数量。
  • 模块化设计:核心小,功能通过模块添加(如 mod_ssl、mod_php)。
  • 支持运行时配置,支持单独编译模块。
  • 支持多种虚拟主机(基于 IP、端口、域名)。
  • 支持 HTTPS(mod_ssl)、用户认证、基于 IP/主机名的 ACL、每目录访问控制、URL 重写。

MPM(多道处理模块)对比

MPM 并发模型 优缺点 适用
prefork 一请求一进程 稳定性好,但大并发下消耗资源多(进程切换) 老系统、需稳定
worker 一请求一线程(启动多进程,每进程多线程) 资源占用少,并发好 现代系统
event 基于事件驱动,一进程处理多请求 高效,适合大量 Keep-Alive 连接 Apache 2.4+
mpm_winnt Windows 线程模型 仅 Windows Windows

prefork
worker
event
📨 多个并发请求
MPM 模式?
🔄 每请求

fork 一个进程
🧵 每请求

一个线程
⚡ 事件驱动

一进程多请求
📊 稳定但资源多
📊 资源少并发好
📊 最高效

生活例子:MPM 像"银行窗口"------prefork 是"来一个客户开一个窗口"(稳但占地方),worker 是"几个窗口,每个窗口同时办多笔业务"(省空间),event 是"一个大厅经理盯着所有客户,谁需要就去服务谁"(最高效)。

选择 MPM(RHEL):

  • 默认:/usr/sbin/httpd(prefork)
  • worker:/usr/sbin/httpd.worker
  • event:/usr/sbin/httpd.event

/etc/sysconfig/httpd 中设置:

bash 复制代码
HTTPD=/usr/sbin/httpd.worker

安装与文件结构

安装

bash 复制代码
yum -y install httpd
rpm -ql httpd | less   # 查看安装文件

主要文件/目录

路径 说明
/usr/sbin/httpd 二进制程序(prefork)
/etc/rc.d/init.d/httpd 服务脚本
/etc/httpd/ 工作根目录
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 配置片段(会被 Include)
/etc/httpd/modules/ 模块目录(链接到 /usr/lib64/httpd/modules/
/etc/httpd/logs/ 日志目录(链接到 /var/log/httpd/
/var/www/html/ 默认 DocumentRoot(静态页面)
/var/www/cgi-bin/ CGI 脚本目录

日志

  • access_log:访问日志
  • error_log:错误日志

启动与查看

bash 复制代码
service httpd start
netstat -tnlp | grep :80   # 查看端口
ps aux | grep httpd        # 查看进程

进程

  • httpd: root, root(master process):管理进程。
  • httpd: apache, apache(worker process):工作进程。

端口

  • 80/tcp:HTTP
  • 443/tcp:HTTPS(mod_ssl)

防火墙配置

临时关闭

bash 复制代码
service iptables stop

开放端口 (编辑 /etc/sysconfig/iptables):

text 复制代码
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
bash 复制代码
service iptables restart

chkconfig 管理

bash 复制代码
chkconfig iptables on   # 开机启动
chkconfig iptables off  # 开机不启动

SELinux 配置

查看getenforce

临时关闭

bash 复制代码
setenforce 0   # Permissive
setenforce 1   # Enforcing

永久关闭

bash 复制代码
vim /etc/sysconfig/selinux
# 改为 SELINUX=permissive 或 disabled

/etc/selinux/config/etc/sysconfig/selinux 的链接。

httpd.conf 三段结构

查看

bash 复制代码
cd /etc/httpd/conf
grep "Section" httpd.conf
说明
Section 1: Global Environment 全局环境(ServerRoot、Timeout、KeepAlive、MPM 等)
Section 2: 'Main' server configuration 主服务器配置(Listen、DocumentRoot、Directory、日志等)
Section 3: Virtual Hosts 虚拟主机(与主服务器不能同时生效)

配置格式directive value(指令 + 值)

  • 指令不区分大小写。
  • value 根据需要可能区分大小写。

主要配置指令

指令 说明 示例
ServerRoot 服务器根目录 ServerRoot "/etc/httpd"
PidFile PID 文件 PidFile run/httpd.pid
Timeout TCP 连接超时 Timeout 60
KeepAlive 是否长连接 KeepAlive OnOff
MaxKeepAliveRequests 长连接最大请求数 MaxKeepAliveRequests 100
KeepAliveTimeout 长连接超时 KeepAliveTimeout 15
Listen 监听端口 Listen 80Listen 192.168.0.1:80
LoadModule 加载模块 LoadModule foo_module modules/mod_foo.so
User 工作进程用户 User apache
Group 工作进程组 Group apache
ServerAdmin 管理员邮箱 ServerAdmin root@localhost
DocumentRoot 文档根目录 DocumentRoot "/var/www/html"

MPM 配置(prefork 示例)

apache 复制代码
<IfModule prefork.c>
    StartServers       8      # 启动时创建 8 个空闲进程
    MinSpareServers    5      # 最少空闲进程
    MaxSpareServers   20      # 最大空闲进程
    ServerLimit      256      # 最多允许多少进程
    MaxClients       256      # 最大并发连接数
    MaxRequestsPerChild 4000  # 每个子进程最多响应多少请求后重启
</IfModule>

注意 :若要调大 MaxClients,必须先调大 ServerLimit,并完全重启(杀死所有进程)。

worker 示例

apache 复制代码
<IfModule worker.c>
    StartServers         4
    MaxClients         300
    MinSpareThreads     25
    MaxSpareThreads     75
    ThreadsPerChild     25
    MaxRequestsPerChild  0
</IfModule>

目录访问控制

Options(目录选项):

选项 说明
None 不支持任何选项
Indexes 允许索引目录(列文件列表);去掉则不允许
FollowSymLinks 允许访问符号链接指向的原文件(一般不允许,降低性能)
Includes 允许执行 SSI(服务端包含)
ExecCGI 允许运行 CGI 脚本
All 支持所有选项

示例

apache 复制代码
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
</Directory>

基于主机的访问控制

Order 指令

apache 复制代码
Order allow,deny
Allow from 192.168.0.0/24
Deny from 192.168.0.100

Order 逻辑

  • Order allow,deny:先匹配 Allow,再匹配 Deny;默认拒绝。
  • Order deny,allow:先匹配 Deny,再匹配 Allow;默认允许。

对比:Order allow,deny 与 Order deny,allow

Order 匹配顺序 默认策略 典型场景
allow,deny 先 Allow 再 Deny 默认拒绝 白名单:只允许特定 IP,其余拒绝
deny,allow 先 Deny 再 Allow 默认允许 黑名单:只拒绝特定 IP,其余允许

示例

apache 复制代码
# 白名单:仅允许 192.168.0.0/24
Order allow,deny
Allow from 192.168.0.0/24

# 黑名单:拒绝 192.168.0.100,其余允许
Order deny,allow
Deny from 192.168.0.100

地址表示方式

  • IP:192.168.0.1
  • 网段:192.168.0.0/24
  • 部分 IP:192.168(匹配 192.168.x.x)
  • 主机名:www.a.com
  • 域名:magedu.com(匹配该域下所有主机)

示例

apache 复制代码
<Directory "/var/www/html">
    Order deny,allow
    Deny from 172.16.100.177 192.168.0.1
</Directory>

基于用户的访问控制

AllowOverride :是否允许 .htaccess 覆盖配置。

apache 复制代码
<Directory "/var/www/html/private">
    AllowOverride AuthConfig
    AuthType Basic
    AuthName "Restricted Site..."
    AuthUserFile "/etc/httpd/conf/htpasswd"
    Require valid-user
</Directory>

htpasswd:创建密码文件。

bash 复制代码
# 第一次创建(-c)
htpasswd -c -m /etc/httpd/conf/htpasswd hadoop

# 添加用户(不用 -c,否则覆盖)
htpasswd -m /etc/httpd/conf/htpasswd tom

Require 指令

  • Require user hadoop tom:仅允许 hadoop、tom
  • Require valid-user:允许文件中所有用户

基于组的认证

apache 复制代码
AuthType Basic
AuthName "By Invitation Only"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName

组文件格式

text 复制代码
GroupName: rbowen dpitts sungo rshersey

基于 DBM 的认证

apache 复制代码
<Directory /www/docs/private>
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider dbm
    AuthDBMUserFile /www/passwords/passwd.dbm
    Require valid-user
</Directory>

用户个人站点

配置

apache 复制代码
UserDir public_html

访问http://server/~username/

示例 :用户 tom 的 ~/public_html/index.html 可通过 http://172.16.100.1/~tom/ 访问。

路径别名

Alias:将 URL 路径映射到本地文件系统路径。

apache 复制代码
Alias /bbs "/www/forum"

访问http://172.16.100.1/bbs/images/logo.jpeg/www/forum/images/logo.jpeg

注意:URL 路径与本地文件系统路径不是一码事;URL 是相对于 DocumentRoot 或 Alias 的。

日志配置

ErrorLog:错误日志。

apache 复制代码
ErrorLog logs/error_log

LogLevel:日志级别(debug、info、notice、warn、error、crit、alert、emerg)。

LogFormat:定义日志格式。

apache 复制代码
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog:访问日志。

apache 复制代码
CustomLog logs/access_log combined

PV / UV

  • PV(Page View):每天的页面访问量。
  • UV(User View):每天的独立 IP 访问量。

CGI

CGI(Common Gateway Interface):通用网关接口,让 Web 服务器与应用程序通信的协议/机制。

流程

text 复制代码
Client --> httpd (index.cgi) --> Spawn Process (运行 index.cgi) --> httpd --> Client

支持语言:Perl、Python、Java(Servlet、JSP)、PHP 等。

FastCGI:CGI 的改进版,进程常驻,不必每次 spawn。

对比:CGI 与 FastCGI

对比项 CGI FastCGI
进程 每次请求 spawn 新进程 进程常驻,重复使用
性能 慢(fork 开销大)
资源 高并发时消耗大 资源占用少
适用 低频脚本 高频动态内容(如 PHP-FPM)

传统 CGI
FastCGI
💻 客户端
🖥️ httpd
CGI?
🆕 Spawn 进程

运行脚本
🔄 常驻进程池

分配任务
📥 返回结果

配置

apache 复制代码
<Directory "/var/www/cgi-bin">
    Options ExecCGI
    AddHandler cgi-script .cgi .pl
</Directory>

去除欢迎页面

bash 复制代码
cd /etc/httpd/conf.d
mv welcome.conf welcome.conf.bak
service httpd restart

安装文档与工具

bash 复制代码
yum -y install httpd-manual   # 安装手册
yum -y install tree            # 安装 tree

手册配置/etc/httpd/conf.d/manual.conf

测试与调试

测试配置

bash 复制代码
httpd -t   # 测试 httpd.conf 语法

查看模块

bash 复制代码
httpd -l   # 查看编译进内核的模块

elinks(文本浏览器):

bash 复制代码
elinks http://172.16.100.1
elinks -dump http://192.168.5.135/a.html    # 显示内容后退出
elinks -source http://192.168.5.135/a.html  # 显示源码

httpd 虚拟主机与 HTTPS 🌐

虚拟主机

虚拟主机:一台物理服务器运行多个网站。

类型

类型 区分方式 示例
基于 IP 不同 IP <VirtualHost 192.168.0.1:80>
基于端口 不同端口 <VirtualHost *:8080>
基于域名 不同 Host 头 <VirtualHost *:80> + ServerName www.a.com

配置示例(基于域名):

apache 复制代码
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.a.com
    DocumentRoot /var/www/a
</VirtualHost>

<VirtualHost *:80>
    ServerName www.b.com
    DocumentRoot /var/www/b
</VirtualHost>

注意 :虚拟主机与主服务器(Section 2)不能同时生效;定义虚拟主机后,主服务器的 DocumentRoot 失效。

对比:三种虚拟主机

类型 区分依据 配置要点 优缺点
基于 IP 不同 IP <VirtualHost 192.168.0.1:80> 需多个 IP;配置简单
基于端口 不同端口 <VirtualHost *:8080> 一个 IP 即可;用户需记端口
基于域名 Host 头 <VirtualHost *:80> + ServerName www.a.com 最常用;需 DNS 解析;HTTP/1.1 支持

基于 IP
基于端口
基于域名
📨 HTTP 请求
虚拟主机类型?
🌐 匹配 IP

192.168.0.1→站点A

192.168.0.2→站点B
🔌 匹配端口

:80→站点A

:8080→站点B
📛 匹配 Host 头

www.a.com→站点A

www.b.com→站点B
📂 对应 DocumentRoot

生活例子:虚拟主机像"一栋楼多家公司"------基于 IP 是"每家有独立门牌号",基于端口是"同一门牌,按楼层(端口)找",基于域名是"同一门牌同一楼层,按公司名牌(Host 头)找"。

📖 名词解释

名词 解释 生活例子
httpd HTTP Daemon,Apache HTTP 服务器的守护进程 像"餐厅服务员",负责接待客人(处理请求)
Apache 最流行的开源 Web 服务器软件 像"连锁餐厅品牌"
MPM Multi-Processing Module,多道处理模块,定义并发处理方式 像"餐厅的服务模式",一桌一服务员还是一人服务多桌
prefork MPM 模式之一,一个请求一个进程 像"一桌一服务员",稳定但人多时消耗大
worker MPM 模式之一,一个请求一个线程 像"服务员可同时照顾几桌",效率高
event MPM 模式之一,事件驱动,一个进程处理多个请求 像"大堂经理",哪桌需要就去哪桌,最高效
DocumentRoot Web 根目录,存放网站文件的目录 像"菜品仓库",所有菜都在这里
虚拟主机 一台服务器上运行多个网站 像"一栋楼多家公司",共用一个地址
基于 IP 通过不同 IP 区分虚拟主机 像"每家公司有独立门牌号"
基于端口 通过不同端口区分虚拟主机 像"同一门牌,按楼层找"
基于域名 通过 Host 头区分虚拟主机,最常用 像"同一门牌同楼层,看公司名牌"
CGI Common Gateway Interface,通用网关接口,调用外部程序生成动态内容 像"叫外卖",餐厅(httpd)叫外面的厨师(CGI 程序)做菜
FastCGI CGI 的改进版,进程常驻,不用每次启动 像"专职厨师",一直在厨房待命,不用每次叫
.htaccess 目录级配置文件,可覆盖主配置 像"部门规章",可以在总公司规定基础上加部门规定
access_log 访问日志,记录所有 HTTP 请求 像"客人登记簿",记录谁来过、点了什么
error_log 错误日志,记录服务器错误 像"事故记录本",记录出了什么问题
Alias 路径别名,将 URL 映射到文件系统的其他位置 像"快捷方式",访问 /images 实际去 /data/pics
DirectoryIndex 目录默认首页文件名 像"默认菜单",进餐厅不说要什么就给你看这个
Options 目录选项,如是否允许列目录、执行 CGI 像"部门权限",这个部门能做什么不能做什么
Order allow,deny 访问控制顺序,先允许再拒绝,默认拒绝 像"白名单",只允许名单上的人进
Order deny,allow 访问控制顺序,先拒绝再允许,默认允许 像"黑名单",只拒绝名单上的人,其他都能进
AuthType 认证类型,如 Basic(基本认证) 像"门禁类型",刷卡还是输密码
htpasswd 创建和管理 HTTP 基本认证密码文件的工具 像"门禁卡管理系统"
mod_ssl Apache 的 SSL/TLS 模块,提供 HTTPS 支持 像"保险箱模块",给餐厅加装保险箱
ServerName 服务器域名,虚拟主机的标识 像"公司名称"
Listen 监听的 IP 和端口 像"营业地址和电话"

HTTPS 配置

HTTPS :HTTP over SSL/TLS,监听 443/tcp

安装 mod_ssl

bash 复制代码
yum -y install mod_ssl

生成私钥与证书(自签名示例):

bash 复制代码
# 生成私钥(权限 600)
(umask 077; openssl genrsa -out /etc/pki/tls/private/server.key 2048)

# 生成自签名证书
openssl req -new -x509 -key /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt -days 365

配置/etc/httpd/conf.d/ssl.conf):

apache 复制代码
<VirtualHost _default_:443>
    DocumentRoot "/var/www/html"
    ServerName www.example.com:443
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/private/server.key
</VirtualHost>

重启

bash 复制代码
service httpd restart

访问https://server_ip/

对比:HTTP 与 HTTPS

对比项 HTTP HTTPS(HTTP over SSL/TLS)
传输 明文 加密
默认端口 80/tcp 443/tcp
身份 无服务器证书校验 证书验证服务器身份,防中间人
性能 稍慢(加解密开销)
典型场景 内网、测试 生产、登录、支付

静态与动态内容

静态内容

  • .html.css.jpeg.png.gif
  • 直接返回文件,无需运行

动态内容

  • 编程语言写的脚本(.php.jsp.py 等)
  • 接受参数→运行一次→生成 HTML→返回

示例(PHP):

php 复制代码
<?php
echo "<h1>Hello world</h1>";
?>

小结

系统安装与维护

  • Kickstart :命令段(keyboard/lang/rootpw/network/part)+ 软件包段(%packages)+ 脚本段(%pre/%post);通过 ks= 指定 ks 文件位置。
  • 故障排除:五步法(确定特征→重现→收集信息→从简单入手→一次一种);单用户模式(改密码、改配置)、救援模式(MBR/grub/bash 修复);定期备份 /etc,用 svn/git 管理。
  • sudo :条目格式 who which_hosts=(runas) TAG:command;四类别名(User/Host/Runas/Cmnd)必须全大写;sudo -l 列出权限,sudo -k 清除缓存;日志在 /var/log/secure。

加密与安全

  • 加密类型:对称(快,密钥分发难)、单向(摘要,完整性)、非对称(慢,身份认证与密钥交换)。
  • PKI/CA:x509 证书;CA 用私钥签名服务器公钥;客户端用 CA 公钥验证证书。
  • SSL/TLS:应用层与传输层间加密层;握手协商算法→交换密钥→加密传输。
  • OpenSSL :libcrypto + libssl + openssl 命令;openssl enc 加解密、openssl dgst 摘要、openssl genrsa 生成私钥、openssl req -x509 自签名。
  • OpenSSH:sshd/ssh;密钥认证三步(ssh-keygen → ssh-copy-id → ssh);scp 传文件、sftp 交互式;安全建议(改端口、禁 root、密钥认证、不用 V1)。

DNS 与 BIND

  • DNS:FQDN↔IP;nsswitch(files→dns);递归(客户端一次请求)、迭代(服务器多次查询);正向/反向解析。
  • DNS 服务器类型:主(master)、从(slave,按 serial/refresh/retry/expire 同步)、缓存、转发。
  • BIND:named.conf(options + zone 定义);区域文件(SOA、NS、A、MX、PTR、CNAME);端口 53/udp、53/tcp、953/tcp(rndc)。
  • 工具 :dig(-t-x+trace)、host、nslookup;named-checkconf、named-checkzone、rndc。
  • 子域授权 :父域区域文件中写 SUB_ZONE IN NS ns.sub.zone + ns.sub.zone IN A ip
  • ACL 与 view:allow-query、allow-recursion、allow-transfer;view 按客户端来源返回不同结果。

DHCP

  • DHCP:动态分配 IP/掩码/网关/DNS;67/udp(服务端)、68/udp(客户端)。
  • 流程:DISCOVER→OFFER→REQUEST→ACK。

HTTP 与 httpd

  • HTTP:请求报文(method URL version + headers + body)、响应报文(version status reason + headers + body);状态码 1xx~5xx。
  • httpd(Apache):MPM(prefork/worker/event);主配置 httpd.conf 三段(Global、Main、VirtualHost);DocumentRoot、Listen、User/Group。
  • 目录控制:Options(Indexes/FollowSymLinks/ExecCGI)、Order allow,deny、基于用户认证(AuthType Basic + htpasswd)。
  • CGI:httpd 调用外部程序生成动态内容;FastCGI 为改进版。
  • 虚拟主机:基于 IP/端口/域名;与主服务器不能同时生效。
  • HTTPS :443/tcp;mod_ssl;需证书与私钥;SSLEngine on + SSLCertificateFile + SSLCertificateKeyFile
  • 日志:access_log(访问)、error_log(错误);LogFormat 定义格式(common/combined);PV/UV 统计。
  • 路径别名 :Alias /url "/local/path"

相关推荐
未来之窗软件服务1 小时前
服务器运维(三十五)数字证书TLS 版本设备对照表—东方仙盟
运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
之歆1 小时前
RAID 磁盘阵列与 LVM 逻辑卷管理
运维·5g
OpenTiny社区1 小时前
TinyEngine 2.10 版本发布:零代码 CRUD、云端协作,开发效率再升级!
前端·vue.js·低代码
lqj_本人1 小时前
Flutter三方库适配OpenHarmony【apple_product_name】设备型号标识符转换原理
运维·服务器·flutter
哟哟-1 小时前
Nginx配置:静态文件访问时动态添加时间戳
运维·前端·javascript·nginx
未来之窗软件服务2 小时前
服务器运维(三十七)日志分析redis日志工具—东方仙盟
运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
Mr.小海2 小时前
Docker 数据卷挂载:从基础到生产的完整落地指南(含避坑实战)
运维·docker·容器
码云数智-园园2 小时前
自助建站哪个好?三款主流自助建站对比评测
前端
肆忆_2 小时前
C++ 汇编层面与语法语义层面总结:this指针 模板 块级作用域 引用
前端