centos7下的防火墙工具使用
在 CentOS 中,firewalld、iptables 和 SELinux 是三种关键的安全组件,它们提供了不同层次的访问控制和防护机制
Firewalld
firewalld 是 CentOS 7 中默认的防火墙管理工具,用于动态管理网络端口和服务的访问权限。
功能和特点
- 动态规则管理:可以在不重新加载整个防火墙的情况下,添加、修改或删除规则。
- 区域(Zone)概念:根据网络信任级别,firewalld 将网络接口分配到不同的区域,每个区域有不同的防护级别。
- 服务管理:可以根据服务名称(如http, mysql)而不是端口号来配置防火墙规则。
基础命令
基本操作
启动、停止、重启 firewalld:
systemctl start firewalld # 启动 firewalld
systemctl stop firewalld # 停止 firewalld
systemctl restart firewalld # 重启 firewalld
systemctl reload firewalld # 重新加载配置
启用或禁用 firewalld 开机启动:
systemctl enable firewalld # 开机时启用 firewalld
systemctl disable firewalld # 开机时禁用 firewalld
查看 firewalld 状态:
systemctl status firewalld # 查看 firewalld 服务状态
firewall-cmd --state # 查看 firewalld 是否在运行
- 区域管理
firewalld 使用区域(Zone)来管理不同信任级别的网络接口。
- 查看所有区域:
firewall-cmd --get-zones
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
- 查看当前活动区域:
firewall-cmd --get-active-zones
[root@localhost ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
- 查看某个区域的详细信息:
默认只有一个public区域,如果需要多个区域的使用只能手动去创建改区域文件,重新加载
[root@localhost ~]# ls /etc/firewalld/zones/
public.xml public.xml.old
firewall-cmd --zone=public --list-all
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active) #public:当前查看的区域名称。该区域当前处于活动状态
target: defaultdefault:#默认行为是拒绝未明确允许的流量。可以将目标设为其他值,例如:ACCEPT:允许所有流量。DROP:直接丢弃未匹配流量。REJECT:拒绝未匹配流量并通知源主机。
icmp-block-inversion: no
interfaces: ens33 #在此例中,接口 ens33 被绑定到 public 区域。所有从该接口接收的流量将按照 public 区域的规则处理。
sources: #绑定到此区域的源 IP 地址范围或网络。
services: dhcpv6-client ssh #ssh:允许通过端口 22 使用 SSH 服务。
ports: #当前没有开放的端口。
protocols: #当前没有特别允许的协议
masquerade: no #不启用 IP 地址伪装(NAT)。
forward-ports: #当前没有配置端口转发规则
source-ports: #当前没有特别允许的源端口
icmp-blocks: #当前没有禁止的 ICMP 类型。
rich rules: #富规则(rich rules)可以定义更复杂的规则,例如基于源地址、目标地址或时间限制的规则
- 更改默认区域:
firewall-cmd --set-default-zone=public
- 将网络接口分配到某个区域:
–permanent
如果不加 --permanent,规则只在当前会话中生效,防火墙重启后规则会丢失
–zone=public
指定区域,默认只有publi
firewall-cmd --zone=public --change-interface=eth0 --permanent
firewall-cmd --reload
[root@localhost ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@localhost ~]# firewall-cmd --zone=public --change-interface=ens34 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --get-active-zones
public
interfaces: ens34 ens33
[root@localhost ~]#
- 如果要将接口从区域中去除
firewall-cmd --zone=public --remove-interface=ens34
- 端口管理
开放端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
- 移除已开放的端口:
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
firewall-cmd --reload
- 查看已开放的端口:
firewall-cmd --zone=public --list-ports
- 服务管理
允许某服务通过防火墙:
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
- 移除某服务的访问权限:
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload
- 查看某区域已允许的服务:
firewall-cmd --zone=public --list-services
- Rich Rules(高级规则)
firewalld 支持使用 Rich Rules 来创建更加复杂的防火墙规则。
添加 Rich Rule:在 public 区域中,允许 来源 IP 地址 为 192.168.0.10 的主机通过 TCP 协议访问 SSH 服务(端口 22)。
此规则永久生效,防火墙重启后依然有效。
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.10" port port=22 protocol=tcp accept' --permanent
firewall-cmd --reload
- 删除 Rich Rule:
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.10" port port=22 protocol=tcp accept' --permanent
firewall-cmd --reload
- 伪装、转发、源地址规则
启用 IP 伪装(NAT):
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
禁用 IP 伪装:
firewall-cmd --zone=public --remove-masquerade --permanent
firewall-cmd --reload
启用端口转发:
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
firewall-cmd --reload
添加源地址:
firewall-cmd --zone=public --add-source=192.168.0.0/24 --permanent
firewall-cmd --reload
- 其他命令
查看 firewalld 版本:
firewall-cmd --version
查看当前运行时配置:
firewall-cmd --runtime-to-permanent
重置 firewalld 配置:
firewall-cmd --complete-reload
查询指定端口是否允许:
firewall-cmd --zone=public --query-port=8080/tcp
查询指定服务是否允许:
firewall-cmd --zone=public --query-service=http
文件修改
firewalld还可以通过修改文件来生效:一般默认为public.xml文件
vi /etc/firewalld/zones/public.xml
配置文件内容如下:
<zone>
<!-- 描述区域的用途 -->
<short>Public Zone</short>
<description>For use in untrusted public networks</description>
<!-- 定义允许的服务 -->
<service name="http"/>
<service name="ssh"/>
<!-- 定义允许的端口 -->
<port protocol="tcp" port="8080"/>
<port protocol="udp" port="12345"/>
<!-- 定义允许的来源地址 -->
<source address="192.168.1.0/24"/>
<!-- 定义自定义规则 -->
<rule family="ipv4">
<source address="10.0.0.0/8"/>
<port protocol="tcp" port="3306"/>
<accept/>
</rule>
</zone>
修改后需要生效配置
firewall-cmd --reload
firewall-cmd --list-all
元素解析
1. <short> 和 <description>
<short>:区域的简短描述,通常为区域名称。
<description>:更详细的区域描述。
2. <service>
指定允许的服务,服务名称与 /usr/lib/firewalld/services/ 中的文件名对应。
示例:
<service name="http"/>
3. <port>
定义开放的端口。
属性:
protocol:协议类型,可选 tcp 或 udp。
port:端口号。
示例:
<port protocol="tcp" port="8080"/>
4. <source>
指定允许访问的来源地址或网络。
属性:
address:CIDR 格式的 IP 地址范围。
示例:
<source address="192.168.1.0/24"/>
5. <rule>
自定义规则,用于复杂配置。
属性:
family:IP 协议族,可选 ipv4 或 ipv6。
子元素:
<source>:来源地址。
<port>:开放端口。
<accept>:接受流量。
<reject>:拒绝流量。
<drop>:丢弃流量。
示例:
<rule family="ipv4">
<source address="10.0.0.0/8"/>
<port protocol="tcp" port="3306"/>
<accept/>
</rule>
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 # 禁用
文件修改
iptables的可以通过修改配置文件进行生效
vi /etc/sysconfig/iptables
配置文件的内容通常如下:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 允许本地回环流量
-A INPUT -i lo -j ACCEPT
# 允许已建立和相关的连接
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH
-A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP 和 HTTPS
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# 拒绝所有其他流量
-A INPUT -j DROP
COMMIT
修改后生效配置
iptables-save
配置文件解析
- 表声明
配置文件开头声明表,通常为 *filter 表(默认用于管理流量过滤规则)。
常用表:
- filter:处理过滤规则。
- nat:用于网络地址转换规则。
- mangle:修改数据包标头。
- raw:配置数据包的追踪规则。
- 链声明
定义规则链的默认策略:
链:
- INPUT:流入本地机器的数据包。
- OUTPUT:从本地机器发送出去的数据包。
- FORWARD:流经本地机器的数据包。
语法:
:链名 默认策略 [包计数:字节计数]
示例:
:INPUT ACCEPT [0:0]
- 规则语法
规则以 -A 开头,表示向某个链中追加规则:
语法:
-A 链名 条件 -j 动作
示例规则:
允许本地回环:
-A INPUT -i lo -j ACCEPT
允许特定端口:
-A INPUT -p tcp --dport 22 -j ACCEPT
- 动作
常见动作:
- ACCEPT:接受数据包。
- DROP:丢弃数据包。
- REJECT:拒绝数据包并返回错误信息。
- LOG:记录日志,但不修改流量。
- 条件
常见匹配条件:
- 接口:-i(输入接口),-o(输出接口)。
- 协议:-p(如 tcp、udp)。
- 端口:–dport(目标端口),–sport(源端口)。
- 状态:-m state --state(如 ESTABLISHED、RELATED)。
- IP 地址:-s(源地址),-d(目标地址)
注意防火墙配置后也是有优先级配置的,优先级高的配置会覆盖掉优先级低的配置,通常配置文件中由上往下,优先级由高往低!!!
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。如果启用,确保相应的策略和上下文已正确配置,避免阻止合法操作。

浙公网安备 33010602011771号