76、Linux防火墙配置与管理全解析

Linux防火墙配置与管理全解析

1. 防火墙基础概念

防火墙是保障网络安全的重要工具,主要分为基于主机的防火墙、硬件防火墙和软件防火墙,同时还可从网络层和应用层进行分类。
- 基于主机的防火墙 :运行在单个主机或服务器上,保护该主机的安全。例如家庭PC上安装的防火墙就属于此类。
- 硬件防火墙与软件防火墙
- 硬件防火墙 :通常位于网络设备(如路由器)上,其过滤规则配置在设备的固件中。比如家庭中互联网服务提供商(ISP)提供的路由器,就包含防火墙固件,属于硬件防火墙。
- 软件防火墙 :以应用程序的形式安装在计算机系统中,可设置过滤规则来过滤传入流量,也被称为基于规则的防火墙。
- 网络层与应用层防火墙
- 网络层防火墙 :也叫数据包过滤器,检查单个网络数据包,只允许特定数据包进出系统,工作在OSI参考模型的较低层。
- 应用层防火墙 :在OSI参考模型的较高层进行过滤,只允许特定应用程序访问系统。

最佳的防火墙设置是综合运用各种类型的防火墙,就像搭建多层防护墙,能有效抵御恶意活动的入侵。

2. Linux系统中的防火墙实现

在Linux系统中,防火墙是基于主机的、网络层的软件防火墙,由 iptables 工具和相关内核级组件管理。通过 iptables ,可以为通过Linux服务器的每个网络数据包创建一系列规则,实现对网络流量的精细控制。

近年来,Fedora、RHEL等Linux发行版引入了 firewalld 服务,它提供了比以往更动态的防火墙规则管理方式。在最新的RHEL和Fedora版本中, iptables 防火墙的后端已被 nftables 取代。 Firewall Configuration 窗口(使用 firewall-config 命令打开)可以方便地打开防火墙端口、进行地址伪装(将私有地址路由到公共网络)或端口转发。 firewalld 服务能够根据条件变化做出反应,而静态的 iptables 服务在这方面相对较弱。此外,通过启用对某个服务的访问, firewalld 还可以加载允许访问该服务所需的模块。

需要注意的是, iptables 工具管理的Linux防火墙也被称为 netfilter ,因此常看到Linux防火墙被称为 netfilter/iptables 。虽然 iptables 语法仍然被支持,但在最新的RHEL和Fedora版本中,实际上是 nftables iptables 提供后端支持。

3. 开始使用firewalld服务

在Linux系统中, firewalld 服务可能已经安装。可以通过以下命令检查其状态:

# systemctl status firewalld

如果未安装,可以使用以下命令进行安装并启动服务:

# yum install firewalld firewall-config
# systemctl start firewalld.service
# systemctl enable firewalld.service

要管理 firewalld 服务,可以通过以下命令打开 Firewall Configuration 窗口:

# firewall-config &

使用 firewalld 时,可以根据需要共享的服务和希望为系统提供的保护级别,从一组防火墙区域中进行选择。例如,Fedora Workstation的默认规则集适用于家庭网络中的Linux工作站,允许以下服务:
- DHCPv6 Client :在IPv6网络上实现地址的自动分配。
- Multicast DNS (mDNS) :在小型网络接口上实现域名系统接口,无需常规DNS服务器。
- Network printing client and server (IPP) :在本地系统和网络上实现打印机共享。
- Samba client :与Windows系统和本地网络中的其他系统进行文件共享。
- SSH :允许他人从网络登录到系统。
- Cockpit :允许从网络访问基于Web的Cockpit管理界面。不过,在Fedora 30 Workstation中,Cockpit默认未安装,需要安装 cockpit 包后才会在 Firewall Configuration 窗口中显示。

如果将计算机连接到不同信任级别的网络(如机场的无线网络),可以通过以下步骤调整防火墙规则:
1. 在 Active Bindings 列下,选择当前活动的连接(例如 Wired connection 1 )。
2. 选择新的区域(例如 public )。
3. 点击 Change Zone

public 区域虽然仍然允许IPv6连接、远程登录(SSH)和mDNS服务,但不允许访问更易受攻击的打印、Windows文件共享(Samba)和Cockpit服务。

除了更改区域,另一个常见的操作是打开防火墙端口以允许访问选定的服务。在 Firewall Configuration 窗口中,将 Fedora Workstation 区域设置为当前区域,点击想要打开的每个服务。选择 Runtime configuration 时,允许访问该服务的端口将立即打开;选择 Permanent configuration 时,端口将永久打开。

Firewall Configuration 窗口还有一个不错的特性,当选择允许访问某个服务时,可能不仅仅是打开端口。例如,启用FTP服务还会加载连接跟踪模块,以便在需要时通过防火墙访问非标准端口。

4. 使用Cockpit更改防火墙规则

Cockpit提供了另一种直观的方式来管理系统的防火墙。通过以下步骤可以查看和修改防火墙规则:
1. 打开Web浏览器,访问Cockpit界面( https://yourhost:9090 ),使用root权限登录。
2. 选择 Networking ➪ Firewall ,进入防火墙设置界面。
3. 点击 Add Services ,弹出 Add Service 对话框。
4. 勾选想要在当前区域启用的服务,然后点击 Add Services

这样就启用了对所选端口的访问。如果该端口上运行着相应的服务,请求该服务的用户(如访问端口80和443上的Web服务器)将被允许访问。

5. 理解iptables工具

在直接使用 iptables 工具更改防火墙规则之前,需要了解 netfilter/iptables 的基础知识,包括表、链、策略和规则。
- netfilter/iptables表 iptables 防火墙不仅能进行低级的数据包过滤,还定义了防火墙的功能类型。 iptables 工具有四个表,SELinux还会添加一个额外的表,各表功能如下:
| 表名 | 功能 |
| ---- | ---- |
| filter | 防火墙的数据包过滤功能,用于对进出和通过Linux系统的数据包做出访问控制决策。 |
| nat | 用于网络地址转换(NAT),可重定向数据包的去向。 |
| mangle | 根据规则修改数据包,直接使用该表的情况较少,通常用于更改数据包的管理方式。 |
| raw | 用于使某些网络数据包免受“连接跟踪”的影响,在使用网络地址转换和虚拟化时非常重要。 |
| security | 仅在支持SELinux的Linux发行版中可用,允许SELinux根据策略允许或阻止数据包,为标准数据包过滤规则增加了一层额外的过滤。 |

其中, filter 表是进行基本防火墙数据包过滤的主要表。

  • netfilter/iptables链 netfilter/iptables 防火墙将网络数据包分为不同的类别,即链。网络数据包可以被指定到以下五个链中:
    • INPUT :进入Linux服务器的网络数据包。
    • FORWARD :进入Linux服务器但要通过另一个网络接口路由出去的网络数据包。
    • OUTPUT :从Linux服务器发出的网络数据包。
    • PREROUTING :在数据包进入Linux服务器时,由NAT用于修改数据包。
    • POSTROUTING :在数据包离开Linux服务器之前,由NAT用于修改数据包。

不同的表对应不同的可用链,具体如下表所示:
| 表名 | 可用链 |
| ---- | ---- |
| filter | INPUT, FORWARD, OUTPUT |
| nat | PREROUTING, OUTPUT, POSTROUTING |
| mangle | INPUT, FORWARD, PREROUTING, OUTPUT, POSTROUTING |
| raw | PREROUTING, OUTPUT |
| security | INPUT, FORWARD, OUTPUT |

当网络数据包被分类到特定链后, iptables 可以确定适用于该数据包的策略或规则。

  • netfilter/iptables规则、策略和目标 :对于每个网络数据包,可以设置规则来定义如何处理它。 netfilter/iptables 防火墙可以通过多种方式识别网络数据包,例如源IP地址、目的IP地址、网络协议、入站端口、出站端口和网络状态等。

如果某个数据包没有匹配的规则,则使用该链的整体策略。每个数据包类别或链都有默认策略。当网络数据包匹配特定规则或遵循默认策略时,将根据 iptables 设置的目标采取相应的操作,常见的目标有:
- ACCEPT :接受网络数据包进入服务器。
- REJECT :丢弃网络数据包,不允许其进入服务器,并发送拒绝消息。
- DROP :丢弃网络数据包,不允许其进入服务器,不发送拒绝消息。

一般来说,对于内部员工,可以使用 REJECT ,让他们知道网络流量被拒绝的原因;对于入站流量,建议使用 DROP ,使恶意人员无法察觉其流量被阻止。此外, iptables 还有一些更复杂的目标,如 QUEUE ,可以通过 iptables 的手册页了解更多信息。

iptables 工具通过策略和规则使用 filter 表实现软件防火墙。了解这些基础知识后,就可以深入学习使用 iptables 工具实现防火墙的具体命令了。

6. 使用iptables工具

在使用 iptables 工具之前,需要检查Linux服务器上的防火墙是否已启用。不同的Linux发行版有不同的检查和操作方法:
- RHEL 7、RHEL 8和近期的Fedora系统 :这些系统上运行的防火墙接口服务是 firewalld ,默认情况下不直接运行 iptables 服务。可以使用以下命令检查 firewalld 服务的运行状态:

systemctl status firewalld.service
- 启用防火墙:
systemctl start firewalld.service
systemctl enable firewalld.service
- 禁用防火墙:
systemctl stop firewalld.service
  • Ubuntu系统 :Ubuntu系统上运行的防火墙接口服务是 ufw 。可以使用以下命令检查 ufw 服务的运行状态:
sudo ufw status
- 启用防火墙:
sudo ufw enable
- 禁用防火墙:
sudo ufw disable

检查并启用或禁用防火墙后,不同发行版的操作基本相同。可以使用以下命令查看当前 filter (默认)表的策略和规则:

iptables -vnL

在启用 firewalld 的系统中,默认列出的 iptables 链和规则比直接使用 iptables 的系统要多,这样可以通过将规则划分为不同的区域,为构建防火墙提供更多的灵活性。

目前,默认的 INPUT FORWARD OUTPUT 策略都设置为 ACCEPT ,意味着所有网络数据包都可以自由进出系统,防火墙实际上处于禁用状态,直到添加了特定的 REJECT DROP 规则。

如果Linux服务器处理的是IPv6网络数据包,可以使用 ip6tables 工具来管理IPv6地址的防火墙,它与 iptables 工具几乎相同,更多信息可以通过 man ip6tables 命令查看。

7. 修改iptables策略和规则

在直接使用 iptables 命令修改 netfilter/iptables 防火墙之前,建议在测试系统上关闭 firewalld 服务。以下是一些修改防火墙的常用命令选项:
- -t table :指定 iptables 命令应用的表,默认使用 filter 表。例如:

iptables -t filter -P OUTPUT DROP
  • -P chain target :设置特定链的整体策略,如果数据包没有匹配的规则,则使用该链列出的目标。例如:
iptables -P INPUT ACCEPT
  • -A chain :设置一个“追加规则”,作为指定链整体策略的例外。例如:
iptables -A OUTPUT -d 10.140.67.25 -j REJECT
  • -I rule# chain :将追加规则插入到指定链的追加规则列表中的特定位置。例如:
iptables -I 5 INPUT -s 10.140.67.23 -j DROP
  • -D chain rule# :从指定链中删除指定编号的规则。例如:
iptables -D INPUT 5
  • -j target :如果规则中的条件满足,防火墙将跳转到指定的目标进行处理。例如:
iptables -A INPUT -s 10.140.67.25 -j DROP
  • -d IP address :指定规则应用的目标IP地址。例如:
iptables -A OUTPUT -d 10.140.67.25 -j REJECT
  • -s IP address :指定规则应用的源IP地址。例如:
iptables -A INPUT -s 10.140.67.24 -j ACCEPT
  • -p protocol :指定规则应用的协议。例如,丢弃传入的ping(icmp)请求:
iptables -A INPUT -p icmp -j DROP
  • –dport port# :指定规则应用的传入协议数据包的目标端口。例如:
iptables -A INPUT -p tcp --dport 22 -j DROP
  • –sport port# :指定规则应用的传出协议数据包的源端口。例如:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
  • -m state –state network_state :指定规则应用的网络状态。例如:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

下面通过一个具体的例子来说明这些选项的使用。假设有一个IP地址为 10.140.67.23 的Linux服务器(Host - A),网络中还有另外两个Linux服务器,Host - B的IP地址为 10.140.67.22 ,Host - C的IP地址为 10.140.67.25 。目标是允许Host - C完全访问Host - A,同时阻止Host - B通过ssh进行远程登录连接。

7.1 设置DROP策略

首先查看Host - A防火墙的默认策略,此时防火墙没有任何限制,规则为空,策略都设置为 ACCEPT

iptables -vnL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

尝试将 INPUT 策略从 ACCEPT 更改为 DROP

iptables -P INPUT DROP
iptables -vnL
Chain INPUT (policy DROP)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

需要注意的是,对于策略,不能将目标设置为 REJECT ,否则会收到“iptables: Bad policy name”的错误消息,应使用 DROP 作为策略。

然后,Host - B尝试ping和ssh连接Host - A,结果都失败了。同样,Host - C的ping和ssh连接也失败了。这表明将 INPUT 策略设置为 DROP 不能达到预期目标。

7.2 阻止源IP地址

接下来,将 INPUT 策略改回 ACCEPT ,并添加一个规则来阻止Host - B的IP地址:

iptables -P INPUT ACCEPT
iptables -A INPUT -s 10.140.67.22 -j DROP
iptables -vnL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  10.140.67.22             anywhere
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

此时,Host - C可以成功ping和ssh连接到Host - A,但Host - B的ping和ssh连接都失败了。这说明单纯阻止Host - B的IP地址也不能完全达到目标。

7.3 阻止特定协议和端口

最后,尝试只阻止Host - B的IP地址访问ssh端口(22)。在添加新规则之前,需要使用 -D 选项删除之前的规则,避免冲突:

iptables -D INPUT 1
iptables -A INPUT -s 10.140.67.22 -p tcp --dport 22 -j DROP
iptables -vnL
Chain INPUT (policy ACCEPT)
target     prot opt source      destination
DROP       tcp  --  10.140.67.22    anywhere     tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target     prot opt source      destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source      destination

测试发现,Host - C的ping和ssh连接不受影响,而Host - B的ping可以正常进行,但ssh连接被阻止,达到了预期目标。

在创建 netfilter/iptables 防火墙的规则时,组织的访问控制矩阵可以提供帮助。并且,在将每个修改应用到生产环境的Linux系统防火墙之前,应先在测试或虚拟环境中进行测试。

8. 保存iptables配置

虽然 firewalld 是RHEL、Fedora等Linux系统推荐的防火墙创建服务,但仍然可以手动保存和恢复使用 iptables 直接创建的防火墙规则。

假设之前的修改仍然保留在防火墙中,可以使用 iptables -save 命令保存当前的防火墙过滤规则:

iptables -vnL
Chain INPUT (policy ACCEPT 8 packets, 560 bytes)
 pkts bytes target prot opt in  out source        destination
    0     0 DROP   tcp  --  *   *   10.140.67.22  0.0.0.0/0   tcp dpt:22
    0     0 DROP   tcp  --  *   *   0.0.0.0/0     0.0.0.0/0   tcp dpt:33
    0     0 DROP   icmp --  *   *   0.0.0.0/0     0.0.0.0/0
...
iptables-save > /tmp/myiptables

如果需要恢复这些规则,可以先使用 iptables -F 命令刷新当前规则,然后使用 iptables -restore 命令恢复规则:

iptables -F
iptables -vnL
Chain INPUT (policy ACCEPT 8 packets, 560 bytes)
 pkts bytes target prot opt in out source       destination
    0     0 DROP   tcp  --  *  *   0.0.0.0/0    0.0.0.0/0  tcp dpt:33
    0     0 DROP   icmp --  *  *   0.0.0.0/0    0.0.0.0/0
...
iptables-restore < /tmp/myiptables
iptables -vnL
Chain INPUT (policy ACCEPT 16 packets, 1120 bytes)
 pkts bytes target prot opt in out source       destination
    0     0 DROP   tcp  --  *  *   10.140.67.22 0.0.0.0/0      tcp dpt:22
    0     0 DROP   tcp  --  *  *   0.0.0.0/0    0.0.0.0/0      tcp dpt:33
    0     0 DROP   icmp --  *  *   0.0.0.0/0    0.0.0.0/0

刷新规则不会影响 iptables 配置文件,使用 iptables -restore 命令可以将防火墙恢复到之前保存的状态。

通过以上步骤,我们详细介绍了Linux系统中防火墙的配置和管理方法,包括 firewalld 服务和 iptables 工具的使用。合理配置防火墙可以有效保护Linux服务器的安全,希望这些内容对大家有所帮助。

Linux防火墙配置与管理全解析

9. 防火墙配置的注意事项

在进行Linux防火墙配置时,有一些重要的注意事项需要牢记:
- 策略选择 :策略目标不能设置为 REJECT ,会报错“iptables: Bad policy name”,应使用 DROP 作为策略。
- 测试环境 :对防火墙规则进行任何修改前,务必在测试或虚拟环境中进行充分测试,避免在生产环境中出现意外问题。
- 规则顺序 iptables 规则是按顺序匹配的,前面的规则会优先处理数据包。因此,要合理安排规则的顺序,确保重要规则先被匹配。
- 备份规则 :定期备份防火墙规则,以防配置丢失或出现错误。可以使用 iptables -save 命令进行备份。

10. 防火墙配置的流程图

下面是一个简单的mermaid流程图,展示了配置Linux防火墙的基本流程:

graph LR
    A[开始] --> B[检查防火墙状态]
    B --> C{是否启用?}
    C -- 是 --> D[查看当前规则]
    C -- 否 --> E[启用防火墙]
    E --> D
    D --> F[根据需求修改规则]
    F --> G[测试规则]
    G --> H{测试是否通过?}
    H -- 是 --> I[保存规则]
    H -- 否 --> F
    I --> J[结束]
11. 常见问题及解决方案

在配置和使用Linux防火墙的过程中,可能会遇到一些常见问题,以下是一些解决方案:
- 规则不生效
- 检查规则语法是否正确,是否有拼写错误或参数使用不当。
- 确认规则是否被正确加载到防火墙中,可以使用 iptables -vnL 命令查看。
- 检查是否有其他规则或策略覆盖了当前规则。
- 无法访问特定服务
- 检查防火墙是否开放了相应的端口,可以使用 firewall - config iptables 命令进行检查和修改。
- 确认服务是否正常运行,是否监听在正确的端口上。
- 检查网络连接是否正常,是否存在网络故障。
- 防火墙服务无法启动
- 检查服务配置文件是否正确,是否有语法错误或参数设置不当。
- 确认是否有其他服务占用了防火墙服务所需的资源,如端口或文件。
- 查看系统日志,查找服务启动失败的具体原因。

12. 总结

Linux防火墙是保障服务器安全的重要工具,通过合理配置 firewalld 服务和 iptables 工具,可以有效控制网络流量,防止恶意攻击。在配置防火墙时,需要了解防火墙的基础概念,掌握 iptables 的基本操作,包括表、链、规则和策略的使用。同时,要注意策略选择、规则顺序和测试环境的使用,定期备份防火墙规则,及时解决遇到的问题。

以下是一个总结表格,回顾本文介绍的主要内容:
| 主题 | 要点 |
| ---- | ---- |
| 防火墙基础概念 | 包括基于主机、硬件、软件、网络层和应用层的分类,最佳配置是综合使用各类防火墙 |
| firewalld 服务 | 提供动态防火墙规则管理,可通过 firewall - config 窗口配置,支持多区域选择 |
| Cockpit 管理 | 提供直观的防火墙管理界面,可通过Web浏览器访问 |
| iptables 工具 | 通过表、链、规则和策略实现软件防火墙,可精细控制网络流量 |
| 规则修改与测试 | 介绍了修改规则的命令选项,通过实例展示如何达到特定访问控制目标,强调测试的重要性 |
| 规则保存与恢复 | 可使用 iptables - save iptables - restore 命令保存和恢复规则 |
| 注意事项与常见问题 | 包括策略选择、测试环境、规则顺序等注意事项,以及规则不生效、服务无法访问等常见问题的解决方案 |

通过掌握这些知识和技能,你可以更好地保护Linux服务器的安全,为网络环境提供可靠的防护。希望本文对你在Linux防火墙配置和管理方面有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值