在 CentOS 中,firewalld、iptables 和 SELinux 是三种关键的安全组件,它们提供了不同层次的访问控制和防护机制
Firewalld
firewalld 是 CentOS 7 中默认的防火墙管理工具,用于动态管理网络端口和服务的访问权限。
功能和特点
- 动态规则管理:可以在不重新加载整个防火墙的情况下,添加、修改或删除规则。
- 区域(Zone)概念:根据网络信任级别,firewalld 将网络接口分配到不同的区域,每个区域有不同的防护级别。
- 服务管理:可以根据服务名称(如http, mysql)而不是端口号来配置防火墙规则。
基本操作
启动、停止、重启 firewalld:
sudo systemctl start firewalld # 启动 firewalld
sudo systemctl stop firewalld # 停止 firewalld
sudo systemctl restart firewalld # 重启 firewalld
sudo systemctl reload firewalld # 重新加载配置
启用或禁用 firewalld 开机启动:
sudo systemctl enable firewalld # 开机时启用 firewalld
sudo systemctl disable firewalld # 开机时禁用 firewalld
查看 firewalld 状态:
sudo systemctl status firewalld # 查看 firewalld 服务状态
sudo firewall-cmd --state # 查看 firewalld 是否在运行
- 区域管理
firewalld 使用区域(Zone)来管理不同信任级别的网络接口。
查看所有区域:
sudo firewall-cmd --get-zones
查看当前活动区域:
sudo firewall-cmd --get-active-zones
查看某个区域的详细信息:
sudo firewall-cmd --zone=public --list-all
更改默认区域:
sudo firewall-cmd --set-default-zone=public
将网络接口分配到某个区域:
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reload # 重载配置使更改生效
- 端口管理
开放端口:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
移除已开放的端口:
sudo firewall-cmd --zone=public --remove-port=3306/tcp --permanent
sudo firewall-cmd --reload
查看已开放的端口:
sudo firewall-cmd --zone=public --list-ports
- 服务管理
允许某服务通过防火墙:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload
移除某服务的访问权限:
sudo firewall-cmd --zone=public --remove-service=http --permanent
sudo firewall-cmd --reload
查看某区域已允许的服务:
sudo firewall-cmd --zone=public --list-services
- Rich Rules(高级规则)
firewalld 支持使用 Rich Rules 来创建更加复杂的防火墙规则。
添加 Rich Rule:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.10" port port=22 protocol=tcp accept' --permanent
sudo firewall-cmd --reload
删除 Rich Rule:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.10" port port=22 protocol=tcp accept' --permanent
sudo firewall-cmd --reload
- 伪装、转发、源地址规则
启用 IP 伪装(NAT):
sudo firewall-cmd --zone=public --add-masquerade --permanent
sudo firewall-cmd --reload
禁用 IP 伪装:
sudo firewall-cmd --zone=public --remove-masquerade --permanent
sudo firewall-cmd --reload
启用端口转发:
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload
添加源地址:
sudo firewall-cmd --zone=public --add-source=192.168.0.0/24 --permanent
sudo firewall-cmd --reload
- 其他实用命令
查看 firewalld 版本:
sudo firewall-cmd --version
查看当前运行时配置:
sudo firewall-cmd --runtime-to-permanent
重置 firewalld 配置:
sudo firewall-cmd --complete-reload
查询指定端口是否允许:
sudo firewall-cmd --zone=public --query-port=8080/tcp
查询指定服务是否允许:
sudo firewall-cmd --zone=public --query-service=http
Iptables
iptables 是 Linux 系统中的数据包过滤工具,它是防火墙的核心部分,允许用户定义复杂的规则来控制数据包的处理方式。
功能和特点
- 手动配置:iptables 提供了对网络流量的精细控制,但配置更加手动和底层。
- 链和规则:iptables 使用链(chain)和规则(rule)来处理数据包流。
- 表(table):包含不同的表,如filter(默认表)、nat(用于网络地址转换)、mangle(用于修改数据包内容)。
- 基本操作
查看当前的规则:
sudo iptables -L # 列出所有规则
sudo iptables -L -v # 显示详细信息
sudo iptables -L -v -n # 显示详细信息,并使用数字表示IP和端口
sudo iptables -S # 以命令格式列出所有规则
清空所有规则:
sudo iptables -F # 清空所有规则
sudo iptables -X # 删除所有自定义链
sudo iptables -Z # 将所有计数器置零
保存规则(不同系统可能使用不同命令):
sudo service iptables save # 保存当前规则到配置文件
sudo iptables-save > /etc/sysconfig/iptables # 手动保存
恢复规则:
sudo service iptables restart # 重启iptables并加载保存的规则
sudo iptables-restore < /etc/sysconfig/iptables # 手动恢复
- 链与表的操作
表(Table):
- filter:默认表,用于过滤数据包。
- nat:用于网络地址转换(NAT)。
- mangle:用于修改数据包内容。
- raw:用于在连接跟踪之前处理数据包。
链(Chain):
- INPUT:处理进入系统的数据包。
- OUTPUT:处理离开系统的数据包。
- FORWARD:处理转发的数据包。
- PREROUTING:数据包到达前处理(用于 nat 表)。
- POSTROUTING:数据包离开前处理(用于 nat 表)。
创建自定义链:
sudo iptables -N custom_chain # 创建名为 custom_chain 的新链
删除自定义链:
sudo iptables -X custom_chain # 删除名为 custom_chain 的链
- 规则管理
添加规则:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH 连接
sudo iptables -A INPUT -p tcp --dport 80 -j DROP # 拒绝 HTTP 连接
插入规则:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT # 在链的顶部插入规则
删除规则:
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除匹配的规则
sudo iptables -D INPUT 1 # 删除 INPUT 链中的第一条规则
替换规则:
sudo iptables -R INPUT 1 -p tcp --dport 22 -j DROP # 替换 INPUT 链中的第一条规则
- 规则条件
协议:
-p tcp # TCP协议
-p udp # UDP协议
-p icmp # ICMP协议
端口:
--sport 22 # 源端口
--dport 80 # 目标端口
源和目标地址:
-s 192.168.1.1 # 源IP地址
-d 192.168.1.2 # 目标IP地址
接口:
-i eth0 # 输入接口
-o eth1 # 输出接口
- NAT 和端口转发
源地址伪装(SNAT):
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 1.2.3.4
目标地址转换(DNAT):
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
启用 IP 伪装(Masquerade):
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- 状态检查
查看连接跟踪:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许已建立和相关连接的数据包
限制连接速率:
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j ACCEPT # 每分钟限制为5个连接
- 记录与日志
记录数据包日志:
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
设置规则不进行连接跟踪:
sudo iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
- 其他操作
阻止 Ping:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
允许所有环回接口流量:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
允许特定网络段的访问:
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
启用/禁用 IP 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward # 启用
echo 0 > /proc/sys/net/ipv4/ip_forward # 禁用
SELinux
SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块,提供了基于强制访问控制(MAC)的安全策略。
功能和特点
强制访问控制:SELinux 强制执行策略以控制系统中各个进程和用户之间的交互,即使是 root 用户也必须遵守。
三种模式:
- Enforcing:启用并强制执行 SELinux 安全策略,阻止未授权操作。
- Permissive:启用 SELinux,但不会强制执行策略,仅记录警告。
- Disabled:禁用 SELinux。
- 上下文(Context):每个文件、进程、端口等都有一个安全上下文,用于确定访问权限。
常用命令
查看 SELinux 状态:
sestatus
临时禁用 SELinux:将 SELinux 设为 Permissive 模式
setenforce 0
永久禁用 SELinux:
vi /etc/selinux/config
修改以下内容
SELINUX=disabled
查看sellinux当前默认模式
getenforce 0
防火墙管理:一般情况下,使用 firewalld 来管理防火墙规则,因为它更加灵活和易用。如果需要更复杂和细粒度的控制,可以在 firewalld 的基础上使用 iptables。
SELinux:应根据系统安全需求决定是否启用 SELinux。如果启用,确保相应的策略和上下文已正确配置,避免阻止合法操作。