63、深入理解与配置Linux防火墙

深入理解与配置Linux防火墙

1. Linux服务访问控制与防火墙概述

在管理Linux服务器时,需要对服务器提供的服务实施访问控制,防火墙规则是实现这一目标的有效方式。早期Linux版本使用TCP Wrappers来允许或拒绝对Linux服务的访问,它通过 /etc/hosts.allow /etc/hosts.deny 文件指定特定外部系统名称和/或IP地址可访问和被阻止的服务。不过,现在TCP Wrappers已逐渐被弃用,但像vsftpd等部分功能仍会以其他方式遵循这些配置文件。

计算机防火墙类似于建筑物中的防火墙,可阻止恶意或不需要的数据进出计算机系统或网络。例如,它能阻止对Linux服务器端口的恶意扫描,还可改变网络数据包的流向并以各种方式重定向数据包。在Linux中, iptables 是内核级的防火墙功能,常用于允许或阻止外部系统访问本地系统上运行的服务。它允许用户创建规则,应用于尝试进入(INPUT)、离开(OUTPUT)或穿过系统(FORWARD)的每个数据包。 iptables 除了基本的数据包进出控制,还具备以下功能:
- 阻止系统发出的数据包,防止系统进程访问远程主机、地址范围或选定服务。
- 将数据包从系统的一个网络接口转发到另一个,使计算机充当两个网络之间的路由器。
- 将目标端口的数据包重定向到本地系统的另一个端口或远程系统,以便其他位置处理数据包请求。
- 修改数据包头部信息(称为mangling),以重定向数据包或标记其进行更多处理。
- 允许私有网络中的多台计算机(如家庭网络中的计算机、电视或其他设备)通过单个公共IP地址与互联网通信(即IP伪装)。

2. 防火墙的分类

防火墙可根据不同功能进行分类,每种类型在保护服务器和网络安全方面都有重要作用。
- 按部署位置分类
- 网络防火墙 :保护整个网络或子网,例如工作场所的网络通常由筛选路由器的防火墙保护。
- 主机防火墙 :运行在单个主机或服务器上并提供保护,如家庭PC上的防火墙。
- 按实现方式分类
- 硬件防火墙 :位于网络设备(如路由器)上,其过滤规则配置在路由器的固件中,如互联网服务提供商(ISP)提供的家用路由器中的防火墙。
- 软件防火墙 :作为计算机系统上的应用程序存在,允许设置过滤规则来过滤传入流量,也称为基于规则的防火墙。
- 按过滤层次分类
- 网络层防火墙 :也称为数据包过滤器,检查单个网络数据包,仅允许特定数据包进出系统,工作在OSI参考模型的较低层。
- 应用层防火墙 :在OSI参考模型的较高层进行过滤,仅允许特定应用程序访问系统。

最佳的防火墙设置是综合使用上述各类防火墙,就像许多安全实践一样,安全层次越多,恶意活动就越难以渗透。

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

在Linux系统中,防火墙是基于主机的、网络层的软件防火墙,由 iptables 实用程序和相关内核级组件管理。通过 iptables ,可以为通过Linux服务器的每个网络数据包创建一系列规则,精确调整规则以允许或拒绝来自不同位置的网络流量,这些规则构成了Linux服务器的网络访问控制列表。

不同的Linux发行版采用不同的方式管理防火墙规则。Fedora、RHEL及相关发行版使用 firewalld 服务,而Ubuntu使用Uncomplicated Firewall(UFW),它是 nftables 的前端。值得注意的是, iptables 管理的Linux防火墙也被称为 netfilter/iptables ,虽然 iptables 语法仍被支持,但在最新的Linux版本中, nftables 在幕后承担了大部分工作。

4. 开始使用UFW

首先检查UFW是否已安装,在终端输入以下命令:

$ systemctl status ufw

如果输出类似如下信息,则表示UFW已安装并运行:

• ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
   Active: active (exited) since Wed 2020-04-29 16:57:19 UTC; 20min ago
     Docs: man:ufw(8)
  Process: 410 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
 Main PID: 410 (code=exited, status=0/SUCCESS)

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

若未安装,可使用以下命令进行安装:

$ apt install ufw

查看UFW当前状态:

# ufw status

若状态为 inactive ,可在配置规则后再激活UFW,以避免意外中断重要访问。例如,要将计算机设置为面向所有人的Web服务器,同时仅允许本地网络中的管理员进行SSH访问,可按以下步骤操作:
1. 开放HTTP端口80:

# ufw allow 80

此命令会添加两条新规则,允许使用IPv4和IPv6网络从任何地方进行Web访问。
2. 限制SSH访问,仅允许来自私有子网(如 192.168.1.0/24 )的客户端:

# ufw allow from 192.168.1.0/24 to any port 22 proto tcp
  1. 确认配置无误后,激活UFW:
# ufw enable

激活时可能会提示该操作可能会中断现有SSH连接,确认继续即可。
4. 测试防火墙,确保能在服务器上打开新的SSH会话,若安装了Web服务器(如Apache),尝试从浏览器访问主页。也可尝试从另一台计算机的浏览器打开Cockpit管理工具(使用端口9090),正常情况下应无法访问。
5. 再次查看UFW状态:

# ufw status

输出示例如下:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.1.0/24            
80                         ALLOW       Anywhere                  
80 (v6)                    ALLOW       Anywhere (v6) 

若安装了Cockpit,可从服务菜单中管理UFW,但目前其功能主要限于启用和禁用。若不再需要防火墙,可使用以下命令禁用:

# ufw disable
5. iptables 实用程序基础

在使用 iptables 实用程序更改防火墙规则之前,需要了解 netfilter/iptables 的基础知识,包括表、链、策略和规则。
- iptables 防火墙有四个表,各有不同功能:
| 表名 | 功能 |
| ---- | ---- |
| filter | 防火墙的数据包过滤功能,用于决定数据包进出和穿过Linux系统的访问控制。 |
| nat | 用于网络地址转换(NAT),可重定向数据包的目标地址。 |
| mangle | 根据规则修改数据包,直接使用较少,通常用于改变数据包的管理方式。 |
| raw | 用于使某些网络数据包免受连接跟踪的影响,在使用网络地址转换和虚拟化时很重要。 |
- netfilter/iptables 将网络数据包分为五类链:
- INPUT:进入Linux服务器的网络数据包。
- FORWARD:进入服务器后需通过另一个网络接口路由出去的网络数据包。
- OUTPUT:从Linux服务器发出的网络数据包。
- PREROUTING:NAT用于在数据包进入服务器时修改数据包。
- POSTROUTING:NAT用于在数据包离开服务器之前修改数据包。

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

  • 规则、策略和目标 :对于每个网络数据包,可以设置规则来定义如何处理。网络数据包可以通过多种方式被识别,如源IP地址、目标IP地址、网络协议、入站端口、出站端口和网络状态等。若某个数据包没有匹配的规则,则使用整体策略。每个数据包类别或链都有默认策略,当数据包匹配特定规则或遵循默认策略后,将根据 iptables 的目标执行相应操作,常见目标如下:
    • ACCEPT:接受数据包进入服务器。
    • REJECT:丢弃数据包,不允许其进入服务器,并发送拒绝消息。
    • DROP:丢弃数据包,不允许其进入服务器,不发送拒绝消息。

对于内部员工的出站网络流量,可使用REJECT告知其被拒绝的原因;对于入站流量,建议使用DROP,使恶意人员无法察觉其流量被阻止。

6. 使用 iptables 实用程序

Linux服务器通常默认启动防火墙,但最好检查其是否真的启用。若UFW正在运行,可使用以下命令禁用:

$ sudo ufw disable

查看当前过滤(默认)表的策略和规则,在命令行输入:

# iptables -vnL

输出示例如下:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)...

在启用UFW的系统上,默认列出的 iptables 链和规则比直接使用 iptables 的系统更多,这是为了通过将规则划分为不同安全级别的区域来提供更多的防火墙构建灵活性。当前默认的INPUT、FORWARD和OUTPUT策略都设置为ACCEPT,即允许所有网络数据包进出和穿过系统,这种状态下防火墙实际上是禁用的,直到添加特定的REJECT或DROP规则。

若Linux服务器处理IPv6网络数据包,可使用 ip6tables 实用程序管理IPv6地址的防火墙,其用法与 iptables 几乎相同,可通过 man ip6tables 命令获取更多信息。

7. 修改 iptables 策略和规则

在进行 iptables 实验之前,确保能直接(非远程)访问计算机,以防意外破坏网络配置时可通过物理方式登录恢复。以下是一些修改防火墙的常用选项:
- -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
8. 示例:实现特定访问控制目标

假设有一台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进行远程登录连接。
- 设置DROP策略 :首先查看Host - A防火墙的默认策略,此时防火墙无限制,规则未设置,策略均为ACCEPT:

# iptables -vnL

将INPUT策略从ACCEPT更改为DROP:

# iptables -P INPUT DROP
# iptables -vnL

Host - B尝试ping和ssh连接Host - A,均失败:

$ ping -c 2 10.140.67.23
PING 10.140.67.23 (10.140.67.23) 56(84) bytes of data.

--- 10.140.67.23 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms
$ ssh root@10.140.67.23

ssh: connect to host 10.140.67.23 port 22: Connection timed out

Host - C尝试ping和ssh连接Host - A,同样失败。因此,将INPUT策略设置为DROP无法达到目标。需要注意的是,对于策略,不能将目标设置为REJECT,否则会收到“iptables: Bad policy name”错误消息,应使用DROP作为策略。
- 阻止源IP地址 :将Host - A的 iptables 策略从DROP更改为ALLOW,然后添加规则阻止来自Host - B IP地址的网络数据包:

# iptables -P INPUT ACCEPT
# iptables -A INPUT -s 10.140.67.22 -j DROP
# iptables -vnL

此时Host - C可以成功ping和ssh连接Host - A,但Host - B的ping和ssh连接均失败,该规则仍无法完全达到目标。
- 阻止特定协议和端口 :删除上一个示例中的规则,然后添加规则仅阻止Host - B的IP地址通过ssh端口(22)连接:

# iptables -D INPUT 1
# iptables -A INPUT -s 10.140.67.22 -p tcp --dport 22 -j DROP
# iptables -vnL

测试新规则,Host - C的ping和ssh连接不受影响,Host - B的ping正常,但ssh连接被阻止,达到了预期目标。

9. 保存和恢复 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

在将防火墙配置应用到生产Linux系统之前,务必在测试或虚拟环境中进行充分测试,以确保配置的正确性和稳定性。通过合理配置 iptables 或UFW等防火墙工具,可以有效保护Linux服务器免受各种网络威胁,实现精确的网络访问控制。

深入理解与配置Linux防火墙(续)

10. 防火墙配置的最佳实践

在配置Linux防火墙时,有一些最佳实践可以帮助我们提高系统的安全性和管理效率。
- 最小权限原则 :只开放必要的端口和服务,避免不必要的网络访问。例如,如果服务器只提供Web服务,那么只开放HTTP(80端口)和HTTPS(443端口)即可。
- 规则排序 :将最常用的规则放在前面,这样可以减少规则匹配的时间。同时,将严格的规则放在宽松的规则之前,避免宽松规则覆盖严格规则。
- 定期审查和更新 :随着业务的发展和安全需求的变化,防火墙规则也需要定期审查和更新。例如,当服务器新增服务或关闭旧服务时,及时调整防火墙规则。
- 日志记录 :开启防火墙的日志记录功能,记录所有被阻止的连接和异常活动。通过分析日志,可以及时发现潜在的安全威胁。

11. 防火墙配置的常见错误及解决方法

在配置防火墙时,可能会遇到一些常见的错误,以下是一些常见错误及解决方法:
- 规则冲突 :当多个规则相互冲突时,可能会导致防火墙无法正常工作。解决方法是仔细检查规则,确保规则之间没有冲突。可以使用 iptables -vnL 命令查看当前规则,找出冲突的规则并进行调整。
- 端口开放错误 :开放了不必要的端口或关闭了必要的端口,可能会导致服务无法正常访问。解决方法是根据实际需求,准确开放和关闭端口。例如,如果Web服务无法访问,检查是否开放了HTTP(80端口)和HTTPS(443端口)。
- 策略设置错误 :策略设置错误可能会导致所有数据包被阻止或允许,使防火墙失去作用。解决方法是仔细检查策略设置,确保策略符合安全需求。例如,将INPUT策略设置为DROP时,要确保有相应的允许规则。

12. 防火墙与其他安全措施的结合

防火墙是网络安全的重要组成部分,但仅依靠防火墙是不够的,还需要结合其他安全措施,形成多层次的安全防护体系。
- 入侵检测系统(IDS)/入侵预防系统(IPS) :IDS/IPS可以实时监测网络流量,发现并阻止潜在的入侵行为。防火墙可以与IDS/IPS集成,当IDS/IPS检测到入侵行为时,防火墙可以自动阻止相关的网络连接。
- 加密技术 :使用加密技术对网络数据进行加密,防止数据在传输过程中被窃取或篡改。例如,使用SSL/TLS协议对Web服务进行加密,保护用户的隐私和数据安全。
- 访问控制列表(ACL) :除了防火墙规则,还可以使用ACL对网络设备进行访问控制。ACL可以限制特定用户或设备对网络资源的访问,进一步增强网络安全。

13. 防火墙配置的自动化

手动配置防火墙规则可能会比较繁琐且容易出错,因此可以考虑使用自动化工具来管理防火墙配置。
- Ansible :Ansible是一个自动化配置管理工具,可以使用Ansible的模块来自动化配置 iptables 或UFW。以下是一个使用Ansible配置 iptables 的示例:

- name: Configure iptables rules
  hosts: servers
  become: true
  tasks:
    - name: Allow SSH access
      iptables:
        chain: INPUT
        protocol: tcp
        destination_port: 22
        jump: ACCEPT
    - name: Allow HTTP access
      iptables:
        chain: INPUT
        protocol: tcp
        destination_port: 80
        jump: ACCEPT
  • Puppet :Puppet是另一个自动化配置管理工具,可以使用Puppet的模块来管理防火墙配置。以下是一个使用Puppet配置 iptables 的示例:
class iptables {
  firewall { '100 allow SSH':
    proto  => 'tcp',
    dport  => '22',
    action => 'accept',
  }
  firewall { '200 allow HTTP':
    proto  => 'tcp',
    dport  => '80',
    action => 'accept',
  }
}
14. 防火墙性能优化

为了确保防火墙在高流量环境下仍能正常工作,需要对防火墙进行性能优化。
- 硬件优化 :选择性能较高的硬件设备,如多核CPU、大容量内存和高速网络接口,以提高防火墙的处理能力。
- 规则优化 :减少不必要的规则,避免规则过于复杂。可以将相似的规则合并,减少规则匹配的时间。
- 缓存机制 :使用缓存机制来存储常用的规则和连接信息,减少规则匹配的时间。例如,使用连接跟踪表来缓存已建立的连接信息。

15. 防火墙的未来发展趋势

随着网络技术的不断发展,防火墙也在不断演进,未来防火墙可能会呈现以下发展趋势:
- 智能化 :防火墙将具备更强大的智能分析能力,能够自动识别和阻止新型的网络攻击。例如,使用机器学习和人工智能技术,对网络流量进行实时分析和预测。
- 云化 :越来越多的企业将防火墙部署在云端,实现集中管理和动态调整。云防火墙可以根据企业的需求,灵活分配资源,提高安全防护能力。
- 融合化 :防火墙将与其他安全设备和服务进行深度融合,形成一体化的安全解决方案。例如,将防火墙与入侵检测系统、加密网关等集成,提供更全面的安全防护。

总结

本文详细介绍了Linux防火墙的相关知识,包括防火墙的分类、Linux系统中的防火墙实现、UFW和 iptables 的使用、防火墙配置的最佳实践、常见错误及解决方法、与其他安全措施的结合、自动化配置、性能优化以及未来发展趋势等。通过合理配置和管理防火墙,可以有效保护Linux服务器和网络的安全,为企业的业务发展提供有力的保障。在实际应用中,要根据实际需求和安全状况,选择合适的防火墙工具和配置方法,并不断学习和更新知识,以应对不断变化的网络安全挑战。

流程图:防火墙配置流程

graph TD;
    A[确定安全需求] --> B[选择防火墙工具];
    B --> C[配置防火墙规则];
    C --> D[测试防火墙配置];
    D --> E{是否通过测试};
    E -- 是 --> F[保存配置];
    E -- 否 --> C;
    F --> G[定期审查和更新];

表格:防火墙工具对比

防火墙工具 特点 适用场景
UFW 简单易用,适合初学者 个人电脑、小型服务器
iptables 功能强大,灵活性高 大型服务器、复杂网络环境
firewalld 基于区域的管理方式,易于管理 Fedora、RHEL等发行版
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值