个人用云计算学习笔记 --15. (Linux 系统启动原理、Linux 防火墙管理)) - 实践
文章目录
- Linux 系统启动原理(10. Linux 系统启动原理)
- CentOS 7 启动过程
- 系统 target
- 系统启动级别
- 设置系统运行目标
- 设置系统当前运行 target
- 设置系统开机默认运行 target
- 在系统启动时选择其它目标
- 重置 ROOT 密码
- 方法1:rd.break
- 方法2:init=/bin/bash
- /etc/fstab 引起的系统启动问题
- 环境准备
- 故障1:挂载点不存在
- 故障2:设备名称写错或者找不到设备
- 故障3:破坏文件系统
- grub2 配置
- grub2 配置文件
- grub 菜单超时时间
- kernel 启动参数
- 查看内核启动参数
- grub 菜单加密
- 默认启动条目
- grub2 故障处理
- MBR 组成回顾
- 故障1:grub 引导程序故障
- 故障2:引导文件丢失
- 故障处理总结
- 思考
- Linux 防火墙管理(11. Linux 防火墙管理)
- 防火墙介绍
- 防火墙类型
- Netfilter 子系统
- Nftables 子系统
- 静态防火墙和动态防火墙
- 静态防火墙
- 动态防火墙
- Firewalld 防火墙
- Firewalld 介绍
- Firewalld 区域
- Firewalld 提供的区域
- 数据包与区域匹配规则
- Firewalld 规则
- Firewalld 配置
- Firewalld 配置文件
- 查看zone配置
- 查看服务配置
- firewall-cmd 命令行工具
- 两个基本概念
- zone 管理
- source 管理
- interface 管理
- service 管理
- port 管理
- masquerade 管理
- forward-port 管理
- icmp-block-inversion 管理
- icmp-blocks 管理
- protocol 管理
- source-ports 管理
- rich rule 管理
- direct rule 管理
- panic 模式
- 其他配置
- 综合案例
Linux 系统启动原理(10. Linux 系统启动原理)
CentOS 7 启动过程
现代计算机系统是硬件与软件的复杂组合。从断电状态开始,到拥有登录提示符的运行中系统,这需要大量的硬件和软件配合工作。
以下列表从较高层面概述了 CentOS7 启动过程。
计算机接通电源。系统固件(现代UEFI或更旧的BIOS)运行开机自检(POST),并开始初始化硬件。
配置: 在系统启动早期,通过按特定的组合键,例如F2,配置系统固件。
系统固件搜索启动设备,根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader,然后将系统控制权交给boot loader,boot loader是GRand Unified Bootloader version 2(GRUB2)。
配置: 使用 grub2-install 命令进行配置,它将安装 GRUB2 作为磁盘上的启动加载器。
GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单,可以从中选择要启动的系统。
配置: 使用 /etc/grub.d/ 目录、/etc/default/grub 文件和 grub2-mkconfig 命令进行配置,以生成 /boot/grub2/grub.cfg 文件。
boot loader根据选定条目的配置,从磁盘中加载kernel和initramfs,并将它们放入内存中。initramfs是一个存档,其中包含启动时所有必要硬件的内核模块、初始化脚本等等。
boot loader将控制权交给kernel,并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序,并初始化这些硬件。
配置: 使用 /etc/dracut.conf.d/ 用录、dracut 命令和 lsinitrd 命令进行配置,以检查 initramfs 文件。
initramfs 执行/sbin/init,作为PID 1。在CentOS中,/sbin/init是一个指向systemd的链接。
配置: 使用内核参数
init=command
配置系统初始化程序。随后,systemd会加载从内核命令行传递的target或者加载系统配置的default.target,该目标通常启动一个基于文本的登录或图形登录屏幕。
**配置:**使用systemctl设置默认target。
default.target依赖sysinit.target,sysinit.target用于初始化系统,例如读取/etc/fstab挂载文件系统,激活systemd-journald等。
**配置:**使用/etc/fstab配置文件系统开机自动挂载。
default.target还会激活开机启动的单元。
**配置:**使用systemctl设置开机启用服务。
default.target还会激活getty.target,该target将打开tty1终端用于用户登录。
系统 target
systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。
target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。
使用以下命令查看target之间依赖关系:
[root@centos7 ~]# systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
......
# 查看反向依赖
[root@centos7 ~]# systemctl list-dependencies sshd.service --reverse
sshd.service
● └─multi-user.target
● └─graphical.target
系统启动级别
CentOS 6 之前使用启动级别控制系统开机激活哪些服务。CentOS 7 使用target控制系统开机激活哪些服务。
runlevel | target | 作用 |
---|---|---|
0 | 关机,init 0 同 poweroff 和systemctl poweroff | |
1 | emergency.target rescue.target | 单用户模式、救援模式和紧急模式用于修复系统 |
2 | 多用户文本界面,不具备NFS功能 | |
3 | multi-user.target | 多用户文本界面 |
4 | 未使用 | |
5 | graphical.target | 多用户图形界面 |
6 | 重启,init 6 同 reboot 和systemctl reboot |
设置系统运行目标
/etc/inittab文件是CentOS 6之前版本初始化系统使用的配置文件。
# 部分内容如下 # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # # 设置运行级别为5,也就是图形化方式启动。 id:5:initdefault:
设置系统当前运行 target
# 设置系统当前运行target为multi-user.target
[root@centos7 ~]# systemctl isolate multi-user.target
# 设置系统当前运行target为graphical.target
[root@centos7 ~]# systemctl isolate graphical.target
设置系统开机默认运行 target
# 查看系统开机默认运行target
[root@centos7 ~]# systemctl get-default
graphical.target
# 设置系统开机默认运行target
[root@centos7 ~]# systemctl set-default multi-user.target
# 重启验证
在系统启动时选择其它目标
要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。
要使用这种选择其他目标的方法,请执行以下步骤:
启动或重新启动系统。
按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。
将光标移至第一个内核条目,按e编辑当前条目。
将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。
重置 ROOT 密码
以下几种方法可用于设置新的root密码。例如:
- 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:
- 删除root账户密码字段
- 使用已知密码字段替换root密码字段
- 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。
方法1:rd.break
重新启动系统。
按任意键(Enter除外)中断启动加载器倒计时。
将光标移至第一个内核条目,按e编辑当前条目。
将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。
此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。
以读/写形式重新挂载/sysroot。
switch_root:/# mount -o remount,rw /sysroot
切换root位置,把/sysroot做为文件系统树的根。
switch_root:/# chroot /sysroot
设置新root密码。
sh-4.2# echo password | passwd --stdin root
提示:password 是用户自定义密码。
如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel
执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。
sh-4.2# exit switch_root:/# exit
登录验证。
方法2:init=/bin/bash
重新启动系统。
按任意键(Enter除外)中断启动加载器倒计时。
将光标移至第一个内核条目,按e编辑当前条目。
将光标移至以 linux16 开头的行,末尾附加
init=/bin/bash
。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断,请开启一个root shell。按Ctrl+x使用这些更改进行启动。此时系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载/。
bash-4.2# mount -o remount,rw /
使用以下命令删除root密码,等进入系统后再重新设置root密码。
sh-4.2# passwd -d root
此时还可以使用vi编辑器直接编辑/etc/shadow文件,复制已知用户的密码记录替换root密码。
如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel
执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。
sh-4.2# exec /usr/lib/systemd/systemd
使用root登录,此时不需要密码。
/etc/fstab 引起的系统启动问题
环境准备
# 设置磁盘分区管理方案
[root@centos7 ~]# parted /dev/sdb mklabel msdos
# 创建分区
[root@centos7 ~]# parted /dev/sdb unit MiB mkpart primary 1 10241
# 格式化为xfs文件系统
[root@centos7 ~]# mkfs.xfs /dev/sdb1
# 创建挂载点
[root@centos7 ~]# mkdir /data01
# 设置持久化挂载
[root@centos7 ~]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab
# 挂载并验证
[root@centos7 ~]# mount -a
[root@centos7 ~]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
故障1:挂载点不存在
环境准备
[root@centos7 ~]# umount /data01
[root@centos7 ~]# rmdir /data01
重启系统验证
# 可以正常进入系统,挂载点会被自动创建
[root@centos7 ~]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
故障2:设备名称写错或者找不到设备
环境准备
[root@centos7 ~]# vim /etc/fstab
# 将原先的sdb1修改为sdb2
/dev/sdb2 /data01 xfs defaults 0 0
重启系统验证
启动过程中找不到该设备。
1分30秒超时后,进入emergency模式,进行修复。
修改为正确的值或者注释该条目,确保系统正常启动。
然后输入exit,继续启动。
故障3:破坏文件系统
环境准备
[root@centos7 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
重启系统验证
系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。
输入root 密码进入emergency 模式。
# 执行以下命令修复 [root@centos7 ~]# xfs_repair /dev/sdb1
修复完成后,输入 exit 正常启动系统。
grub2 配置
grub2 配置文件
grub2 的主要配置文件如下:
/boot/grub2,grub2的主要配置文件所在目录,例如grub.cfg、grubenv、user.cfg。
/etc/grub2.cfg
/etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。
不要直接修改/etc/grub2.cfg文件,该文件由系统自动生成。如果需要自定义这个文件,可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件,然后通过grub2-mkconfig命令生成。
使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。
/etc/grub.d/,该目录下存放多个数字开头的脚本,按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。
/etc/default/grub,定义grub启动部分变量信息,例如grub启动菜单选择条目的超时时间,内核参数等。
/boot/grub2/grubenv,设定默认启动条目。
grub 菜单超时时间
[root@centos7 ~]# vim /etc/default/grub
# 修改GRUB_TIMEOUT为10
GRUB_TIMEOUT=10
# 生效grub2.cfg配置文件
[root@centos7 ~]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
done
# 重启
[root@centos7 ~]# reboot
kernel 启动参数
[root@centos7 ~]# vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX,例如在最后添加参数console=ttyS0,导致不显示启动过程
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0"
# console=ttyS0: 启动过程信息显示到 ttyS0 终端,导致启动过程是tty1上不显示启动消息。
# rhgb:启用图形化启动界面(Red Hat Graphical Boot)。
# quiet:减少启动过程中的日志输出(只显示重要信息), debug 开启调试模式(显示详细启动日志)
# 生成grub2.cfg配置文件,重启验证
[root@centos7 ~]# grub2-mkconfig -o /etc/grub2.cfg
[root@centos7 ~]# reboot
效果如下:
查看内核启动参数
所有内核参数的详细说明可参考 Linux 内核文档,CentOS 7 中可通过安装
kernel-doc
包获取:yum install kernel-doc -y
文档路径:
/usr/share/doc/kernel-doc-<版本>/Documentation/admin-guide/kernel-parameters.txt
查看方式:less /usr/share/doc/kernel-doc-3.10.0/Documentation/admin-guide/kernel-parameters.txt
(注意替换
<版本>
为实际内核版本,可通过uname -r
查看)常用参数说明
除了rhgb
和quiet
,常见参数包括:ro
:只读挂载根文件系统(启动后由系统自动切换为读写)rw
:直接以读写方式挂载根文件系统root=
:指定根文件系统的设备(如root=/dev/sda1
)crashkernel=auto
:预留内存用于内核崩溃时的转储net.ifnames=0
:禁用网络接口的 “一致性命名规则”(如ens33
),强制使用传统命名(如eth0
),便于脚本或传统工具兼容。biosdevname=0
:配合net.ifnames=0
使用,彻底禁用基于 BIOS 的设备命名规则。
grub 菜单加密
# 查看/etc/grub.d/01_users脚本
[root@centos7 ~]# cat /etc/grub.d/01_users
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; then
source \${prefix}/user.cfg
if [ -n "\${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root \${GRUB2_PASSWORD}
fi
fi
EOF
# 生成grub2密码
[root@centos7 ~]# grub2-mkpasswd-pbkdf2
Enter password: `redhat`
Reenter password: `redhat`
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.649DDB2FE50D7D3A0DF829A21887FFD9FB7CC14F0E750B993CFB08B86D0E99AE33D7E121DEC82DD71FF69B2653D9446ED777ADAFB5DAE051685C7B85C3A3A276.8DC92452B738F2007F7254BC884AF34B3C149E62D2054BB09DA970B931AF329BE772648AA0FE15DC8196AED48545F5BF84AAF9EB989CCCD168604B8050988FF0
# 创建文件
[root@centos7 ~]# vim /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.649DDB2FE50D7D3A0DF829A21887FFD9FB7CC14F0E750B993CFB08B86D0E99AE33D7E121DEC82DD71FF69B2653D9446ED777ADAFB5DAE051685C7B85C3A3A276.8DC92452B738F2007F7254BC884AF34B3C149E62D2054BB09DA970B931AF329BE772648AA0FE15DC8196AED48545F5BF84AAF9EB989CCCD168604B8050988FF0
# 生成grub2.cfg配置文件,重启验证
[root@centos7 ~]# reboot
效果如下:
启动菜单界面,按e编辑。
输入用户名root,密码redhat。
- 弹出如下菜单,可以编辑了。
思考:如何解除 grub 菜单加密?
默认启动条目
# 查看启动条目有哪些
[root@centos7 ~]# # grep -o "^menu.*CentOS L.*Core)'" /etc/grub2.cfg
menuentry 'CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)'
menuentry 'CentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)'
# 修改默认启动条目
[root@centos7 ~]# vim /boot/grub2/grubenv
# 修改saved_entry为相应条目
saved_entry=CentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)
......
# 生成grub2.cfg配置文件,重启验证
[root@centos7 ~]# grub2-mkconfig -o /etc/grub2.cfg
[root@centos7 ~]# reboot
grub2 故障处理
MBR 组成回顾
主引导扇区由三个部分组成:
- 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
- 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
- 结束标志(占2个字节),其值为AA55(十六进制)。
故障1:grub 引导程序故障
环境准备
[root@centos7 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
**效果如下:**系统无法从硬盘启动,则会尝试使用其他设备启动。
**解决思路:**使用光盘启动,并重新安装引导程序。
解决过程:
- 开机从光盘启动,并选择
Troubleshooting
。
- 选择
Rescue a CentOS system
- 稍等片刻,进入选择界面,选择
1
。搜索到系统后,提示系统已经挂载在/mnt/sysimage,按回车继续。
切换root目录,并确保root文件系统是读写挂载。
sh-4.2# chroot /mnt/sysimage bash-4.2# mount | grep root /dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
确认系统启动分区所在磁盘。
安装引导程序。
bash-4.2# grub2-install /dev/sda Installing for i386-pc platform. Installation finished. No error reported.
输入
exit
两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。bash-4.2# exit sh-4.2# exit
故障2:引导文件丢失
环境准备
[root@centos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}
[root@centos7 ~]# reboot
**效果如下:**系统无法启动,提示/vmlinuz-4.18.0-553.el8_10.x86_64
文件找不到。
**解决思路:**使用光盘启动,并从起位置恢复相应文件。
解决过程:
参考 **<< grub 引导程序故障 >>**处理流程,获取root权限shell。
恢复文件。(从其他系统复制过来,从rpm包提取等)
输入
exit
两次继续启动系统。
故障处理总结
通过光盘启动的目的是将硬盘上的系统挂载到内存中,并进行修复。
我们也可以通过U盘启动盘启动或者将故障磁盘拔下来挂载到其他系统。
思考
如何避免别人获得磁盘后,读取磁盘中数据?
答案:对硬盘加密。
效果:
- 系统启动的时候,必须输入密码才能读取,硬盘中数据。
修复磁盘的时候,同样需要输入密码。
**提示:**该加密操作不会加密grub2系统选择菜单,也就是/boot目录中数据。
Linux 防火墙管理(11. Linux 防火墙管理)
防火墙介绍
防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。
补充:防火墙和杀毒软件的区别
防火墙是 “第一道防线”,防止外部威胁通过网络进入(拦截网络流量),
杀毒软件是 “第二道防线”,清除已进入系统的威胁并阻止内部破坏,
二者结合才能构建完整的计算机安全体系。
防火墙类型
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机。
- 网络防火墙:服务范围为防火墙一侧的局域网。
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现防火墙功能,例如华为、华三、天融信等产品。
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,例如iptables,firewalld。
按网络协议划分:
- 网络层防火墙:工作在OSI 模型下四层,又称为包过滤防火墙。
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
- 优点:对用户来说透明,处理速度快且易于维护。
- 缺点:无法检查应用层数据,如病毒等。
应用层防火墙/代理服务器:工作在OSI 模型七层或者承担proxy 代理网关。
- 异常检测协议:Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
- 增强的输入验证:可以有效防止网页篡改、信息泄露、木冯植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
- 及时补丁:修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。现在WAF(Web Application Firewall)可以为我们做这项工作了:只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,没有安装对应的补丁本身就是一 种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
- 基于规则的保护和基于异常的保护:基于规则的保护可以提供各种Web应用的安全规则,WAF(Web Application Firewall) 生产商会维护这个规则库,并时时为其更新。用户可以按照这些规测对应用进行全方面检测。
- **状态管理。**WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并組在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
- **其他防护技术。**WAF还有一安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、 响应监视和信息泄露保护。
- 优点:提供应用层保护。
- 缺点:处理速度慢等
Netfilter 子系统
Netfilter子系统是Linux内核中一个强大的网络过滤子系统,对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,通过编程方式来修改、丟弃或路由数据包。
Netfilter子系统工作在内核态,用户使用以下命令配置防火墙规则,告诉Netfilter子系统如何处理数据包:
iptables,用于过滤 IPv4 协议的数据包。
如果 Linux 系统连接到LAN或因特网, 则iptables可用于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
ip6tables,用于过滤 IPv6 协议的数据包,效果等同iptables工具。
arptables,用于过滤 arp 协议的数据包。
arptables既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击。如果善于运用的话,不失为一个优秀的arp防火墙。
ebtables,用于过滤数据链路层数据包。
ebtables 过滤数据包比 iptables 更靠前,获得的数据更“原始”,ebtables 多用于桥模式,比如控制 VLAN ID 等。
[root@centos7 ~]# ls -1 /sbin/*tables
-rwxr-xr-x 1 root root 59872 11月 6 2016 /sbin/arptables
-rwxr-xr-x. 1 root root 7016 4月 11 2018 /sbin/ebtables
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/ip6tables -> xtables-multi
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/iptables -> xtables-multi
Nftables 子系统
Nftables子系统是netfilter的增强版,其仍保留了netfilter的架构。
nftables优点:
- 更快的数据包处理
- 更快的规则集更新
- 使用单个 nft 用户空间实用程序,通过一个接口来管理所有协议,消除了以往不同前端和多个netfilter接口引起的争用问题。
静态防火墙和动态防火墙
静态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。
我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload
命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。
动态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。
我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。
Firewalld 防火墙
Firewalld 介绍
Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。
- 在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
- 在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
- 用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
- Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。
Firewalld 和 iptables 之间的关系
- firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
- firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
Firewalld 区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone)。
zone(区域) 是一个核心概念,用于对网络连接和流量进行分类管理。它本质上是一组预定义的规则集合,通过将网络接口、IP 地址或端口关联到不同区域,可以实现对不同来源的流量采取不同的安全策略。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
- external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
- home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal(内部区域):默认值时与homel区域相同。
- work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则
数据包与zone匹配规则如下:
该源地址被分配给特定区域, 则应用该区域的规则。
如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域的规则。
如果以上都未匹配,firewalld将数据包分配给默认区域。
注意事项:
- firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域。
- 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝。
Firewalld 规则
对于所有区域,区域内规则的优先级是相同的。
区域内规则匹配优先级如下:
- 首先匹配为该区域设置的任何端口转发和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。
Firewalld 配置
Firewalld 配置方法
- 直接编辑 /etc/firewalld/ 中的配置文件
- firewall-cmd 命令行工具
- firewall-config 图形工具
Firewalld 配置文件
Firewalld 配置配置文件存放在:
- /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
- /etc/firewalld/目录,目录结构与/usr/lib/firewalld/一致,管理员自定义配置保存在该位置。
**提示:**我们不建议大家通过修改/etc/firewalld/目录配置防火墙。
查看zone配置
[root@centos7 ~]# cd /usr/lib/firewalld/
[root@centos7 firewalld]# ls
helpers icmptypes ipsets services zones
# 查看zone配置
[root@centos7 firewalld]# ls zones/
block.xml drop.xml home.xml public.xml work.xml
dmz.xml external.xml internal.xml trusted.xml
[root@centos7 firewalld]# cat zones/trusted.xml
<?xml version="1.0" encoding="utf-8"?><zone target="ACCEPT"><short>Trusted</short><description>All network connections are accepted.</description></zone>[root@centos7 firewalld]# cat zones/block.xml <?xml version="1.0" encoding="utf-8"?><zone target="%%REJECT%%"><short>Block</short><description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description></zone>[root@centos7 firewalld]# cat zones/drop.xml <?xml version="1.0" encoding="utf-8"?><zone target="DROP"><short>Drop</short><description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description></zone>
查看服务配置
[root@centos7 firewalld]# ls -1 services
amanda-client.xml
......
[root@centos7 firewalld]# cat services/http.xml
<?xml version="1.0" encoding="utf-8"?><service><short>WWW (HTTP)</short><description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description><port protocol="tcp" port="80"/></service>[root@centos7 firewalld]# cat services/https.xml <?xml version="1.0" encoding="utf-8"?><service><short>Secure WWW (HTTPS)</short><description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description><port protocol="tcp" port="443"/></service>
firewall-cmd 命令行工具
两个基本概念
配置防火墙必须知道两个基本概念:
防火墙的配置有两个状态:
- runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效。
- permanent(永久),通过选项
--permanent
指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项--reload
重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项--complete-reload
重新reload永久配置,将导致当前连接状态也丢失。
建议配置防火墙一次性写两条规则:
第一条使用选项
--permanent
永久生效;第二条不使用选项
--permanent
立刻生效。配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项
--zone
明确指明区域,则使用默认区域。默认区域是public。
zone 管理
# 查看zone清单
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看激活的zone清单,也就是分配了interface和source的zone
[root@centos7 ~]# firewall-cmd --get-active-zones
public
interfaces: ens32
# 查看默认zone
[root@centos7 ~]# firewall-cmd --get-default-zone
public
# 设置默认zone,例如设置为trusted,该操作同时设置永久态默认zone
[root@centos7 ~]# firewall-cmd --set-default-zone=trusted
[root@centos7 ~]# firewall-cmd --get-default-zone
trusted
# 再次设置回来
[root@centos7 ~]# firewall-cmd --set-default-zone=public
######################## 以下关于 zone的命令-请自学 ########################
# 如果有需要还可以创建新zone,必须配合--permanent
[root@centos7 ~]# firewall-cmd --permanent --new-zone=myweb
[root@centos7 ~]# firewall-cmd --permanent --get-zones
block dmz drop external home internal myweb public trusted work
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 使用--reload选项重新加载所有防火墙规则,再次查看zone清单
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal myweb public trusted work
# 查看zone target
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target
default
# 设置zone target,可用target值为:
# default,默认值,也就是拒绝数据包进入用户空间。
# ACCEPT,允许数据包进入用户空间。
# DROP,丢弃数据包,不对客户端做出任何响应。
# REJECT,拒绝数据包进入用户空间。
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --set-target=REJECT
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target
REJECT
# zone不需要的时候,也可以删除,必须配合--permanent
[root@centos7 ~]# firewall-cmd --permanent --delete-zone=myweb
[root@centos7 ~]# firewall-cmd --permanent --get-zones
block dmz drop external home internal public trusted work
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看所有zone中的规则
[root@centos7 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
......
drop
target: DROP
......
external
target: default
......
home
target: default
......
internal
target: default
......
public (active)
target: default
......
trusted
target: ACCEPT
......
work
target: default
......
# 查看默认zone中的规则
[root@centos7 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 查看特定zone中的规则
[root@centos7 ~]# firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
source 管理
# 来源于特定source的数据包交给特定zone处理
[root@centos7 ~]# firewall-cmd --add-source=192.168.1.0/24 --zone=home
# 查看source清单
[root@centos7 ~]# firewall-cmd --list-sources --zone=home
192.168.1.0/24
# 查看source属于哪个zone
[root@centos7 ~]# firewall-cmd --get-zone-of-source=192.168.1.0/24
home
# 查看source是否添加
[root@centos7 ~]# firewall-cmd --query-source=192.168.1.0/24 --zone=home
yes
# 变更source到其他zone
[root@centos7 ~]# firewall-cmd --change-source=192.168.1.0/24 --zone=public
# 删除zone中source
[root@centos7 ~]# firewall-cmd --remove-source=192.168.1.0/24 --zone=public
interface 管理
# 查看zone中interface
[root@centos7 ~]# firewall-cmd --list-interfaces
ens32
# 查看interface属于哪个zone
[root@centos7 ~]# firewall-cmd --get-zone-of-interface=ens32
public
# 查看interface是否添加
[root@centos7 ~]# firewall-cmd --query-interface=ens32
yes
# 将interface变更到其他zone
[root@centos7 ~]# firewall-cmd --change-interface=ens32 --zone=home
# 删除zone中interface
[root@centos7 ~]# firewall-cmd --remove-interface=ens32 --zone=home
# 如果interface不属于任何zone,使用以下命令将interface绑定到特定zone
[root@centos7 ~]# firewall-cmd --add-interface=ens32 --zone=public
service 管理
准备httpd服务
yum install -y httpd systemctl start httpd
# 查看系统中预定义了哪些服务
[root@centos7 ~]# firewall-cmd --get-services
# 添加放行服务
[root@centos7 ~]# firewall-cmd --add-service=http
# 查看放行服务列表
[root@centos7 ~]# firewall-cmd --list-services
cockpit dhcpv6-client http ssh
# 查看服务是否放行
[root@centos7 ~]# firewall-cmd --query-service=http
yes
# 删除服务
[root@centos7 ~]# firewall-cmd --remove-service=http
firewall-cmd命令行还可以定义新的服务。
常用选项如下:
--permanent --new-service=service
Add a new permanent and empty service.
--permanent --delete-service=service
Delete an existing permanent service.
--permanent --service=service --set-description=description
Set new description to service
--permanent --service=service --get-description
Print description for service
--permanent --service=service --set-short=description
Set short description to service
--permanent --service=service --get-short
Print short description for service
--permanent --service=service --add-port=portid[-portid]/protocol
Add a new port to the permanent service.
--permanent --service=service --remove-port=portid[-portid]/protocol
Remove a port from the permanent service.
--permanent --service=service --get-ports
List ports added to the permanent service.
--permanent --service=service --add-protocol=protocol
Add a new protocol to the permanent service.
--permanent --service=service --remove-protocol=protocol
Remove a protocol from the permanent service.
--permanent --service=service --get-protocols
List protocols added to the permanent service.
--permanent --service=service --add-source-port=portid[-portid]/protocol
Add a new source port to the permanent service.
--permanent --service=service --remove-source-port=portid[-portid]/protocol
Remove a source port from the permanent service.
--permanent --service=service --get-source-ports
List source ports added to the permanent service.
port 管理
# 添加放行端口
[root@centos7 ~]# firewall-cmd --add-port=5900/tcp
# 查看端口放行列表
[root@centos7 ~]# firewall-cmd --list-ports
5900/tcp
# 查看端口是否放行
[root@centos7 ~]# firewall-cmd --query-port=5900/tcp
yes
# 删除端口
[root@centos7 ~]# firewall-cmd --remove-port=5900/tcp
masquerade 管理
# 查看masquerade是否启动
[root@centos7 ~]# firewall-cmd --query-masquerade
no
# 启动 masquerade
[root@centos7 ~]# firewall-cmd --add-masquerade
[root@centos7 ~]# firewall-cmd --query-masquerade
yes
# 禁用masquerade
[root@centos7 ~]# firewall-cmd --remove-masquerade
网络模型:
- client:10.1.1.11 网关 10.1.1.10
- server: 10.1.1.10、10.1.8.10(可以访问公网)
forward-port 管理
使用 port forward前,确保对应zone启用masquerade功能。
# 启动 masquerade
[root@centos7 ~]# firewall-cmd --add-masquerade
# 添加端口转发,语法:
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
# 访问本机端口8000转发到本机80
[root@centos7 ~]# firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80
# 查看是否具有特定端口转发规则
[root@centos7 ~]# firewall-cmd --query-forward-port=port=8000:proto=tcp:toport=80
yes
# 访问本机端口1022转发到10.1.1.11:22
[root@centos7 ~]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
# 查询端口转发清单
[root@centos7 ~]# firewall-cmd --list-forward-ports
port=8000:proto=tcp:toport=80:toaddr=
port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
# 删除端口转发
[root@centos7 ~]# firewall-cmd --remove-forward-port=port=8000:proto=tcp:toport=80:toaddr=
[root@centos7 ~]# firewall-cmd --remove-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.80
icmp-block-inversion 管理
icmp-block-inversion默认为no,放行所有的icmp type。此时可以通过富规则禁用特定主机ping本机。
icmp-block-inversion设置为yes,禁止所有的icmp type。此时可以通过富规则放行特定主机ping本机。
# 查看icmp-block-inversion是否启用
[root@centos7 ~]# firewall-cmd --query-icmp-block-inversion
no
# 设置icmp-block-inversion为yes
[root@centos7 ~]# firewall-cmd --add-icmp-block-inversion
[root@centos7 ~]# firewall-cmd --add-icmp-block-inversion --permanent
[root@centos7 ~]# firewall-cmd --query-icmp-block-inversion
yes
# 客户端ping测试
[c:\~]$ ping -n 1 10.1.8.88
正在 Ping 10.1.8.88 具有 32 字节的数据:
来自 10.1.8.88 的回复: 无法访问目标主机。
10.1.8.88 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
# 由于firewalld会保留之前的连接状态,如果此时仍能ping通,
# 则需要重启firewalld服务或使用选项 --complete-reload彻底重新加载防火墙规则。
[root@centos7 ~]# firewall-cmd --complete-reload
# 改回默认值
[root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion
[root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion --permanent
icmp-blocks 管理
# 查看系统中预定义了哪些icmptypes
[root@centos7 ~]# firewall-cmd --get-icmptypes
# 常用的ICMP类型有
# echo-request:icmp请求报文
# echo-reply:icmp响应回复报文
# 添加禁止通过的icmp类型,例如通过添加echo-request实现禁止ping
[root@centos7 ~]# firewall-cmd --add-icmp-block echo-request
[root@centos7 ~]# firewall-cmd --add-icmp-block echo-request --permanent
# 查看 icmp-block 禁止清单
[root@centos7 ~]# firewall-cmd --list-icmp-blocks
echo-request
# 查看echo-request是否添加
[root@centos7 ~]# firewall-cmd --query-icmp-block echo-request
yes
# 客户端ping测试
[c:\~]$ ping -n 1 10.1.8.88
正在 Ping 10.1.8.88 具有 32 字节的数据:
来自 10.1.8.88 的回复: 无法访问目标主机。
10.1.8.88 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
# 由于firewalld会保留之前的连接状态,如果此时仍能ping通,
# 则需要重启firewalld服务或使用选项 --complete-reload彻底重新加载防火墙规则。
[root@centos7 ~]# firewall-cmd --complete-reload
# 改回默认值
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request --permanent
protocol 管理
# 添加protocol
[root@centos7 ~]# firewall-cmd --add-protocol=icmp
# 查看放行protocol清单
[root@centos7 ~]# firewall-cmd --list-protocol
icmp
# 查看protocol是否放行
[root@centos7 ~]# firewall-cmd --query-protocol=icmp
yes
# 删除放行protocol
[root@centos7 ~]# firewall-cmd --remove-protocol=icmp
source-ports 管理
限制客户端 source-ports,很少用,设置方法同 source管理
部分。
rich rule 管理
富规则可灵活自定义各种规则,例如:
- 允许单个IP地址或者网段连接到某个服务
- 配置记录和审计
- 限制速率
富规则参考 firewalld.richlanguage(5)。
富规则语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
**示例1:**禁止所有主机ping本机。
# 添加富规则
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
# 明确拒绝类型
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject type=net-prohib'
# 决绝类型包括:
# icmp-host-prohibited, host-prohib, icmp-net-unreachable, net-unreach, icmp-host-unreachable, host-unreach, icmp-port-unreachable, port-unreach, icmp-proto-unreachable, proto-unreach, icmp-net-prohibited, net-prohib, tcp-reset, tcp-rst, icmp-admin-prohibited, admin-prohib
# 查看富规则清单
[root@centos7 ~]# firewall-cmd --list-rich-rules
rule protocol value="icmp" drop
# 查看富规则是否添加
[root@centos7 ~]# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
yes
# 删除富规则
[root@centos7 ~]# firewall-cmd --remove-rich-rule='rule protocol value="icmp" drop'
示例2:
- 针对IPv4
- 来源主机10.1.8.10
- 允许ping本机
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
示例3:
- 针对IPv4
- 来源10.1.8.0/24网段中主机
- 访问非172.16.0.0/24网段中主机的http服务
- 1秒中只允许访问3次
- 做好日志记录,前缀为" http-error “,日志级别为"error”,每秒记录2次
- 做好审计,每秒记录1次
[root@centos7 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.1.8.0/24" destination not address="172.16.0.0/24" service name="http" log prefix=" http-error " level="error" limit value="2/s" audit limit value="1/s" accept limit value="3/s"'
direct rule 管理
Firewalld 防火墙还支持直接规则:
- 直接规则优先级高于firewalld规则,即防火墙解析直接规则, 然后才会解析firewalld规则。还可以显式地将直接规则插入到某个区域。
- **直接规则用于补充firewalld规则。**使用firewalld规则能实现的需求,尽可能使用firewalld规则实现。
- 直接规则的语法,类似于iptable的语法,所以读者需要知道iptables概念:
- table (filter/mangle/nat/…)
- chain (INPUT/OUTPUT/FORWARD/…)
- commands (-A/-D/-I/…)
- parameters (-p/-s/-d/-j/…)
- targets (ACCEPT/DROP/REJECT/…).
常见选项:
[–permanent] --direct --get-all-chains
查看所有表中所有chain清单
[–permanent] --direct --get-chains { ipv4 | ipv6 | eb } table
查看特定表中chain清单
[–permanent] --direct --add-chain { ipv4 | ipv6 | eb } table chain
特定表中添加chain
[–permanent] --direct --remove-chain { ipv4 | ipv6 | eb } table chain
特定表中删除chain
[–permanent] --direct --get-all-rules
查看所有表中所有chain中所有规则
[–permanent] --direct --get-rules { ipv4 | ipv6 | eb } table chain
查看特定表中特定chain中规则
[–permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args
特定表中特定chain中添加规则
[–permanent] --direct --remove-rule { ipv4 | ipv6 | eb } table chain priority args
特定表中特定chain中删除规则
[–permanent] --direct --remove-rules { ipv4 | ipv6 | eb } table chain
删除特定表中特定chain中所有规则
**示例:**将192.168.0.0/24列入黑名单,单个IP每分钟最高连接并发是1,超过并发的连接都丢弃。
[root@centos7 ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted "
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --direct --get-all-rules
ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix 'blacklisted '
ipv4 raw blacklist 1 -j DROP
清理规则
[root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING
[root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw PREROUTING
[root@centos7 ~]# firewall-cmd --direct --remove-chain ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --reload
panic 模式
- 使用选项 **–panic-on,启用panic模式,所有进出流量将会被丢弃。**一般服务器被黑客攻击,使用该选项断开所有网络。
- 使用选项 --query-panic,查询panic模式。
- 使用选项 --panic-off,禁用panic模式。
其他配置
# 使用选项--runtime-to-permanent将运行时的配置写入到配置文件
root@centos7 ~]# firewall-cmd --runtime-to-permanent
# 使用选项 --timeout设置规则生效时间,单位秒,一般用于调试规则。
[root@centos7 ~]# firewall-cmd --add-service=http --timeout=10
综合案例
案例1: 禁止10.1.8.10主机ping本机。
# 确保icmp-block-inversion是默认值no
[root@centos7 ~]# firewall-cmd --list-all|grep inversion
icmp-block-inversion: no
# 如果icmp-block-inversion是yes,执行以下命令设置为no
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block-inversion
# 确保icmp-blocks不包含echo-request
[root@centos7 ~]# firewall-cmd --list-icmp-blocks
# 如果icmp-blocks包含echo-request,执行以下命令删除icmp-blocks中echo-request
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block=echo-request
# 禁止10.1.8.10主机ping本机
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.8.10" icmp-type name="echo-request" reject'
# 彻底重新加载防火墙规则
[root@centos7 ~]# firewall-cmd --complete-reload
**案例2:**只允许10.1.8.10主机ping本机。
# 1. 配置 client 网络:网卡模式为vmnet1,ip地址为10.1.1.11,网关为10.1.1.10
nmcli connection modify ens33 ipv4.addresses 10.1.1.11/24 ipv4.gateway 10.1.1.10
nmcli connection up ens33
# 2. 配置防火墙开启masquerade功能,也就是SNAT
[root@server ~ 15:54:17]# firewall-cmd --add-masquerade --zone=public
[root@server ~ 15:54:17]# firewall-cmd --add-masquerade --zone=public --permanent
此时client可以ping通1.1.1.1
# 3. 配置防火墙开启端口转发功能,也就是DNAT
# 3. 10.1.8.10:1022 端口,转发到 10.1.1.11:22
[root@server ~ 16:16:29]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
[root@server ~ 16:16:29]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11 --permanent
试规则。
[root@centos7 ~]# firewall-cmd --add-service=http --timeout=10
#### 综合案例
**案例1:** 禁止10.1.8.10主机ping本机。
```bash
# 确保icmp-block-inversion是默认值no
[root@centos7 ~]# firewall-cmd --list-all|grep inversionicmp-block-inversion: no
# 如果icmp-block-inversion是yes,执行以下命令设置为no
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block-inversion
# 确保icmp-blocks不包含echo-request
[root@centos7 ~]# firewall-cmd --list-icmp-blocks
# 如果icmp-blocks包含echo-request,执行以下命令删除icmp-blocks中echo-request
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block=echo-request
# 禁止10.1.8.10主机ping本机
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.8.10" icmp-type name="echo-request" reject'
# 彻底重新加载防火墙规则
[root@centos7 ~]# firewall-cmd --complete-reload
**案例2:**只允许10.1.8.10主机ping本机。
# 1. 配置 client 网络:网卡模式为vmnet1,ip地址为10.1.1.11,网关为10.1.1.10
nmcli connection modify ens33 ipv4.addresses 10.1.1.11/24 ipv4.gateway 10.1.1.10
nmcli connection up ens33
# 2. 配置防火墙开启masquerade功能,也就是SNAT
[root@server ~ 15:54:17]# firewall-cmd --add-masquerade --zone=public
[root@server ~ 15:54:17]# firewall-cmd --add-masquerade --zone=public --permanent
此时client可以ping通1.1.1.1
# 3. 配置防火墙开启端口转发功能,也就是DNAT
# 3. 10.1.8.10:1022 端口,转发到 10.1.1.11:22
[root@server ~ 16:16:29]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
[root@server ~ 16:16:29]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11 --permanent