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. 理解防火墙

很多人可能会认为防火墙是一个完整的屏障,但实际上Linux防火墙只是一个过滤器,用于检查进出计算机系统或网络的每个网络数据包或应用程序请求。网络数据包是被分割成可传输块的数据,在通过OSI模型时会添加额外的数据,以确保数据包安全完整地到达目的地,到达目的地后这些额外数据会被剥离。

防火墙可以根据其功能分为不同的类别:
- 网络或主机基础
- 网络基础防火墙用于保护整个网络或子网,例如工作场所的网络可通过筛选路由器的防火墙进行保护。
- 主机基础防火墙运行在单个主机或服务器上并对其进行保护,如家庭PC上的防火墙。
- 硬件或软件基础
- 硬件防火墙位于网络设备(如路由器)上,其过滤器配置在路由器的固件中,如互联网服务提供商提供的路由器中的防火墙。
- 软件防火墙作为应用程序运行在计算机系统上,通过设置过滤规则来过滤传入的流量,也称为基于规则的防火墙。
- 网络层或应用层过滤
- 网络层防火墙检查单个网络数据包,也称为数据包过滤器,它在OSI参考模型的较低层运行,只允许特定的数据包进出系统。
- 应用层防火墙在OSI参考模型的较高层进行过滤,只允许特定的应用程序访问系统。

最佳的防火墙设置是综合所有这些类别的组合,就像许多安全实践一样,层次越多,恶意活动就越难渗透。

3. 实施防火墙

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

不同的Linux发行版采用不同的方式管理防火墙规则。例如,Fedora、RHEL及相关发行版使用 firewalld 服务,提供更用户友好的管理方式;而Ubuntu则使用Uncomplicated Firewall(UFW),它作为 nftables 的前端。

需要注意的是, iptables 实用程序管理的Linux防火墙也被称为 netfilter/iptables ,虽然 iptables 的语法仍然受支持,但在最近的Linux版本中, nftables 实际上在幕后承担了大部分工作。

4. 开始使用UFW

首先,检查UFW是否已经安装在Linux系统上,可以使用以下命令:

$ 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未激活。在激活UFW之前,可以先进行配置,以避免意外中断重要的访问(如SSH会话)。

假设要将计算机设置为面向所有人的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连接,确认继续即可。

激活后,可以测试防火墙。确保能够在服务器上打开新的SSH会话,若安装了Web服务器(如Apache),尝试从浏览器访问主页。也可以尝试从另一台计算机的浏览器打开Cockpit管理工具(使用端口9090),正常情况下应该无法访问。

再次检查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,但目前基于Cockpit的任务主要限于启用和禁用。若不再需要防火墙,可以使用以下命令禁用:

# ufw disable
5. 理解iptables实用程序

在通过 iptables 实用程序更改防火墙规则之前,需要了解 netfilter/iptables 的基础知识,包括表、链、策略和规则。

5.1 netfilter/iptables表

iptables 防火墙的功能不止于低级的数据包过滤,它通过四个表来定义不同的防火墙功能:
| 表名 | 功能 |
| ---- | ---- |
| filter | 防火墙的数据包过滤功能,用于对进出和穿过Linux系统的数据包进行访问控制决策。 |
| nat | 用于网络地址转换(NAT),可以重定向数据包的目标地址。 |
| mangle | 根据规则修改数据包,直接使用该表的情况较少,通常用于更改数据包的管理方式。 |
| raw | 用于使某些网络数据包免予连接跟踪,在使用网络地址转换和虚拟化时很重要。 |

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

5.2 netfilter/iptables链

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

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

5.3 netfilter/iptables规则、策略和目标

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

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

对于内部员工的出站网络流量,可以考虑使用 REJECT ,以便告知他们流量被拒绝的原因;对于入站流量,使用 DROP 可以让恶意人员不知道其流量被阻止。

6. 使用iptables实用程序

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

sudo ufw disable

要查看当前 filter (默认)表的策略和规则,可以在命令行输入:

# iptables -vnL

输出的第一行可能显示 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) ,这表明 INPUT 链的默认策略适用于所有未匹配其他规则的网络数据包。目前,默认的 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

为了更好地理解这些选项的工作原理,以下是一个示例。假设有一台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

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

# iptables -P INPUT DROP
# iptables -vnL

然后从Host - B尝试ping和SSH连接到Host - A:

$ ping -c 2 10.140.67.23
$ ssh root@10.140.67.23

结果显示ping和SSH连接都失败,这表明将 INPUT 策略设置为 DROP 会阻止所有入站流量,不符合只阻止SSH连接的目标。同样,Host - C的ping和SSH连接也会失败。需要注意的是,对于策略,不能将目标设置为 REJECT ,否则会收到 iptables: Bad policy name 错误消息,应使用 DROP 作为策略。

7.2 阻止源IP地址

将Host - A的 INPUT 策略改回 ACCEPT ,并添加规则阻止来自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 - C的访问,但也完全阻止了Host - B的所有流量,不符合目标。

7.3 阻止协议和端口

删除之前添加的规则,然后修改 iptables 规则,只阻止Host - B的IP地址对端口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通Host - A,但无法进行SSH连接,达到了预期目标。

8. 保存iptables配置

在进行了一系列修改后,可以使用 iptables -save 命令保存当前的防火墙过滤规则:

# iptables -vnL
# iptables-save > /tmp/myiptables

要恢复这些规则,可以先清空当前规则( iptables -F ),然后使用 iptables-restore 命令恢复:

# iptables -F
# iptables -vnL
# iptables-restore < /tmp/myiptables
# iptables -vnL

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

在将防火墙配置应用到生产Linux系统之前,务必在测试或虚拟环境中进行充分测试,以确保其安全性和稳定性。通过合理配置和管理防火墙,可以有效保护Linux服务器免受各种网络威胁。

深入解析Linux网络安全:防火墙配置与管理

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

在配置Linux防火墙时,遵循一些最佳实践可以提高系统的安全性和可靠性。

9.1 最小权限原则

只允许必要的网络流量通过防火墙。例如,如果服务器仅作为Web服务器使用,那么只开放HTTP(端口80)和HTTPS(端口443)端口,关闭其他不必要的端口。这样可以减少潜在的攻击面。

# 只允许HTTP和HTTPS流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
9.2 定期审查规则

随着系统的运行和业务需求的变化,防火墙规则可能会变得复杂和冗余。定期审查规则,删除不再需要的规则,确保规则的简洁性和有效性。

# 查看当前规则
iptables -vnL
9.3 备份配置

定期备份防火墙配置,以防配置丢失或损坏。可以使用 iptables-save 命令将配置保存到文件中。

# 备份配置
iptables-save > /etc/iptables/rules.v4
9.4 监控和日志记录

配置防火墙记录日志,以便及时发现异常的网络活动。可以使用 LOG 目标将匹配的数据包记录到系统日志中。

# 记录所有被拒绝的数据包
iptables -A INPUT -j LOG --log-prefix "IPT_REJECT: "
10. 防火墙配置的常见问题及解决方法

在配置和使用防火墙时,可能会遇到一些常见的问题,以下是一些解决方法。

10.1 SSH连接被阻止

如果在配置防火墙后无法通过SSH连接到服务器,可能是因为防火墙规则阻止了SSH流量。确保允许SSH端口(通常是22)的入站流量。

# 允许SSH流量
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
10.2 网络访问异常

如果某些网络服务无法正常访问,检查防火墙规则是否阻止了相关的端口和协议。可以使用 ping traceroute 等工具进行网络诊断。

# 检查网络连通性
ping 8.8.8.8
traceroute 8.8.8.8
10.3 规则冲突

当添加多个规则时,可能会出现规则冲突的情况。确保规则的顺序和逻辑正确,避免冲突。

# 确保规则顺序正确
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
11. 防火墙配置的流程图
graph TD;
    A[开始] --> B[检查UFW状态];
    B -->|已安装| C[禁用UFW];
    B -->|未安装| D[安装UFW];
    C --> E[查看当前iptables规则];
    D --> E;
    E --> F[根据需求修改规则];
    F --> G[测试防火墙配置];
    G -->|通过| H[保存配置];
    G -->|未通过| F;
    H --> I[结束];
12. 总结

通过本文的介绍,我们了解了Linux防火墙的基本概念、分类和配置方法。 iptables UFW 是Linux系统中常用的防火墙工具,它们可以帮助我们保护服务器免受各种网络威胁。在配置防火墙时,需要根据实际需求合理设置规则,遵循最佳实践,定期审查和备份配置,以确保系统的安全性和可靠性。同时,要注意解决常见的配置问题,避免影响网络服务的正常运行。希望本文对您在Linux网络安全方面的学习和实践有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值