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 是否在运行
  1. 区域管理
    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
  1. 端口管理
    开放端口:
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
  1. 服务管理
    允许某服务通过防火墙:
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
  1. 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
  1. 伪装、转发、源地址规则
    启用 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
  1. 其他命令
    查看 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(用于修改数据包内容)。

基础命令

  1. 基本操作
    查看当前的规则:
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  # 手动恢复
  1. 链与表的操作
    表(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 的链
  1. 规则管理
    添加规则:
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 链中的第一条规则
  1. 规则条件
    协议:
-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  # 输出接口
  1. 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
  1. 状态检查
    查看连接跟踪:
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个连接
  1. 记录与日志
    记录数据包日志:
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
  1. 其他操作
    阻止 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

配置文件解析

  1. 表声明
    配置文件开头声明表,通常为 *filter 表(默认用于管理流量过滤规则)。

常用表:

  • filter:处理过滤规则。
  • nat:用于网络地址转换规则。
  • mangle:修改数据包标头。
  • raw:配置数据包的追踪规则。
  1. 链声明
    定义规则链的默认策略:

链:

  • INPUT:流入本地机器的数据包。
  • OUTPUT:从本地机器发送出去的数据包。
  • FORWARD:流经本地机器的数据包。

语法:

:链名 默认策略 [包计数:字节计数]

示例:

:INPUT ACCEPT [0:0]
  1. 规则语法
    规则以 -A 开头,表示向某个链中追加规则:

语法:

-A 链名 条件 -j 动作

示例规则:
允许本地回环:

-A INPUT -i lo -j ACCEPT

允许特定端口:

-A INPUT -p tcp --dport 22 -j ACCEPT
  1. 动作
    常见动作:
  • ACCEPT:接受数据包。
  • DROP:丢弃数据包。
  • REJECT:拒绝数据包并返回错误信息。
  • LOG:记录日志,但不修改流量。
  1. 条件
    常见匹配条件:
  • 接口:-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。如果启用,确保相应的策略和上下文已正确配置,避免阻止合法操作。

posted @ 2024-09-03 12:35  huhy  阅读(87)  评论(0)    收藏  举报  来源
--> --> /*文章评论*/