使用防火墙增强 Linux 的安全性

了解防火墙的工作原理以及如何调整设置以提高 Linux 安全性。
152 位读者喜欢这篇文章。
People working together to build

Opensource.com

每个人都听说过防火墙,即使只是在电视网络犯罪剧中作为情节设备。许多人也知道他们的计算机(可能)正在运行防火墙,但很少有人了解如何在必要时控制他们的防火墙。

防火墙阻止不需要的网络流量,但不同的网络具有不同的威胁级别。例如,如果您在家中,您可能比在当地咖啡馆使用公共 WiFi 时更信任网络上的其他计算机和设备。您可以希望您的计算机区分受信任的网络和不受信任的网络,或者您可以学习管理,或者至少验证您自己的安全设置。

防火墙如何工作

网络上设备之间的通信通过称为端口的网关进行。端口,在这种上下文中,不是指像 USB 端口或 HDMI 端口这样的物理连接。在网络术语中,端口是一个完全虚拟的概念,表示特定类型数据到达或离开计算机的路径。这个系统可以被称为任何东西,比如“连接”或“入口”,但它们被命名为端口,至少在 1981 年 就已经这样称呼了,并且这个名称一直沿用至今。重点是,任何端口都没有什么特别之处;它们只是一种指定数据传输可能发生的地址的方式。

早在 1972 年,端口号列表(当时称为“套接字”)就已发布,此后演变成一组众所周知的标准端口号,有助于管理特定类型的流量。例如,当您访问网站时,您每天都会访问端口 80 和 443,因为互联网上的大多数人,无论是隐式还是显式地,都同意数据是通过这些端口从 Web 服务器传输的。您可以通过打开 Web 浏览器并导航到 URL 中附加了非标准端口的网站来测试这个理论。例如,如果您导航到 example.com:42,您的请求将被拒绝,因为 example.com 不在端口 42 上提供网站服务。

Navigating to a nonstandard port produces an error

如果您在端口 80 重新访问同一个网站,您会得到一个网站,正如预期的那样。您可以使用 URL 末尾的 :80 指定端口 80,但由于端口 80 是 HTTP 流量的标准端口,因此您的 Web 浏览器默认会假定端口 80。

当计算机(如 Web 服务器)期望在特定端口上接收流量时,打开该端口以进行流量传输是可以接受的(也是必要的)。危险在于让您没有理由期望接收流量的端口保持打开状态,而这正是防火墙的作用。

安装 firewalld

有许多用于防火墙配置的界面。本文介绍 firewalld,它与桌面上的 Network Manager 和终端中的 firewall-cmd 集成。许多 Linux 发行版都预装了这些工具。如果您的发行版没有安装,您可以将本文视为防火墙管理的一般建议并将其应用于您使用的工具,或者您可以安装 firewalld

例如,在 Ubuntu 上,您必须启用 universe 存储库,停用默认的 ufw 防火墙,然后安装 firewalld

$ sudo systemctl disable ufw
$ sudo add-apt-repository universe
$ sudo apt install firewalld

Fedora、CentOS、RHEL、OpenSUSE 和许多其他发行版默认包含 firewalld

无论您的发行版是什么,要使防火墙有效,它都必须处于活动状态并设置为在启动时加载。您不必考虑防火墙维护的次数越少越好。

$ sudo systemctl enable --now firewalld

使用 Network Manager 选择您的区域

您可能每天连接到许多不同的网络。您在工作场所使用一个网络,在咖啡馆使用另一个网络,在家中使用另一个网络。您的计算机可以检测到您比其他网络更频繁使用的网络,但它不知道您信任哪个网络。

防火墙区域包含预设,用于决定要打开和关闭哪些端口。使用区域,您可以选择最适合您当前所在网络的策略。

要查看可用区域列表,请打开 Network Manager 连接编辑器,它位于您的“应用程序”菜单中,或使用 nm-connection-editor & 命令。

Network Manager Connection Editor

从网络连接列表中,双击您当前的网路。

在出现的网络配置窗口中,单击“常规”选项卡。

在“常规”面板中,单击“防火墙区域”旁边的下拉菜单,以查看所有可用区域的列表。

Firewall zones

您可以使用此终端命令获取相同的列表

$ sudo firewall-cmd --get-zones

区域标题表明其设计者在创建它们时的想法,但您可以使用此终端命令获取任何区域的具体信息

$ sudo firewall-cmd --zone work --list-all
work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  [...]

在本例中,work 区域配置为允许 SSH 和 DHCPv6-client 入站流量,但会丢弃用户未明确请求的任何其他入站流量。(换句话说,当您访问网站时,work 区域不会阻止 HTTP 响应流量,但它拒绝端口 80 上的 HTTP 请求。)

查看每个区域以熟悉每个区域允许的流量。最常见的有

  • Work(工作): 当您在您主要信任的网络上时使用此区域。允许 SSH、DHCPv6 和 mDNS,您可以根据需要添加更多。此区域旨在作为基于您日常办公要求的自定义工作环境的起点。
  • Public(公共): 用于您不信任的网络。此区域与工作区域相同,但据推测,您不会添加与工作区域相同的例外。
  • Drop(丢弃): 所有入站连接都被丢弃,不提供任何响应。这是您可以在不完全关闭网络的情况下尽可能接近隐身模式的方式,因为只有出站网络连接是可能的(即使是随意的端口扫描器也可以从出站流量中检测到您的计算机,所以不要将此区域误认为是隐形设备)。当使用公共 WiFi 时,这可以说是最安全的区域,当您有理由相信网络具有敌意时,这绝对是最好的选择。
  • Block(阻止): 所有入站连接都被拒绝,并显示一条消息,声明请求的端口被禁止。只有您发起的网络连接才有可能。这是“丢弃”区域的“友好”版本,因为即使没有端口为入站流量打开,端口也会详细地拒绝未初始化的连接。
  • Home(家庭): 当您信任网络上的其他计算机时使用此区域。仅接受选定的入站连接,您可以根据需要添加更多。
  • Internal(内部): 与工作区域类似,这适用于您主要信任其他计算机的内部网络。您可以根据需要打开更多端口和服务,但仍然保持与工作区域不同的规则集。
  • Trusted(信任): 接受所有网络连接。适用于故障排除或您绝对信任的网络。

将区域分配给网络

您可以将区域分配给您建立的任何网络连接。此外,您可以为连接到每个网络的每个网络接口(以太网电缆、WiFi 等)分配不同的区域。

选择您想要的区域,然后单击“保存”按钮以提交更改。

Setting a new zone

养成将区域分配给网络接口的习惯的最简单方法是关注您最常使用的网络。将“家庭”区域分配给您的家庭网络,“工作”区域分配给您的工作网络,并将“公共”网络分配给您最喜欢的图书馆或咖啡馆网络。

一旦您为所有常用网络分配了区域,请努力为加入的下一个新网络分配一个区域,无论是新的咖啡馆还是您朋友的家庭网络。分配区域是增强您自己意识的最佳方式,即网络并非都是平等的,并且仅仅因为您运行 Linux,您并不比其他任何人更安全。

默认区域

firewalld 不会在您每次加入新网络时提示您选择区域,而是为任何未知网络分配一个默认区域。打开终端并键入此命令以获取您的默认区域

$ sudo firewall-cmd --get-default
public

在本例中,“公共”区域是默认区域。预计您将保持“公共”区域高度限制,因此将其分配给未知网络是一个非常安全的区域。但是,您可以设置自己的默认值。

例如,如果您比大多数人更偏执,或者如果您知道您经常访问您有理由不信任的网络,您可以将高度限制性的区域指定为默认区域

$ sudo firewall-cmd --set-default-zone drop
success
$ sudo firewall-cmd --get-default
drop

现在,您加入的任何新网络都将受到“丢弃”区域规则的约束,除非您手动将其更改为限制性较低的区域。

通过打开端口和服务自定义区域

Firewalld 的开发人员并不打算让他们的区域定义满足所有不同网络和信任级别的需求。它们只是供您使用和自定义的起点。

您不必了解太多关于防火墙的知识,就能够根据您知道您生成的网络活动类型来打开和关闭端口。

预定义服务

向防火墙添加权限的最简单方法是添加预定义的服务。严格来说,就您的防火墙而言,没有“服务”这样的东西,因为防火墙理解端口号和协议类型。但是,firewalld 提供了基于标准和约定的端口和协议集合。

例如,如果您是 Web 开发人员,并且想在本地网络上打开您的计算机,以便您的同事可以看到您正在构建的网站,您将添加 httphttps 服务。如果您是游戏玩家,并且您正在为您的公会运行开源 murmur 语音聊天服务器,那么您将添加 murmur 服务。还有许多其他可用的服务,您可以使用此命令查看它们

$ sudo firewall-cmd --get-services
amanda-client amanda-k5-client bacula bacula-client \
bgp bitcoin bitcoin-rpc ceph cfengine condor-collector \
ctdb dhcp dhcpv6 dhcpv6-client dns elasticsearch \
freeipa-ldap freeipa-ldaps ftp [...]

如果您看到您需要的服务,请将其添加到您当前的防火墙配置中,例如

$ sudo firewall-cmd --add-service murmur

此命令打开特定服务在您的默认区域内所需的所有端口和协议,但这仅在您重新启动计算机或重新启动防火墙之前有效。要使您的更改永久生效,请使用 --permanent 标志

$ sudo firewall-cmd --add-service murmur --permanent

您还可以为默认区域以外的区域发出命令

$ sudo firewall-cmd --add-service murmur --permanent --zone home

端口

有时您想允许某些未由 firewalld 服务定义的内容的流量。也许您正在为常用服务设置非标准端口,或者您需要打开任意端口。

例如,也许您正在运行开源 虚拟桌面 软件 MapTool。由于您正在运行 MapTool 服务器,并且没有行业标准规定 MapTool 在哪个端口上运行,您可以决定它使用的端口,然后在您的防火墙中“戳一个洞”以允许该端口上的流量。

该过程与服务基本相同

$ sudo firewall-cmd --add-port 51234/tcp

此命令打开端口 51234 以接受在您的默认区域内的入站 TCP 连接,但这仅在您重新启动计算机或重新启动防火墙之前有效。要使您的更改永久生效,请使用 --permanent 标志

$ sudo firewall-cmd --add-port 51234/tcp --permanent

您还可以为默认区域以外的区域发出命令

$ sudo firewall-cmd --add-port 51234/tcp --permanent --zone home

允许流量通过您的计算机与允许流量通过您的路由器的防火墙不同。您的路由器可能为其自己的嵌入式防火墙使用不同的界面(尽管原理是相同的),但这超出了本文的范围。

删除端口和服务

如果您确定不再需要服务或端口,您可以重新启动防火墙以清除您的更改,除非您使用 --permanent 标志。

如果您使您的更改永久生效,请使用 --remove-port--remove-service 标志

$ sudo firewall-cmd --remove-port 51234/tcp --permanent

您可以通过在命令中指定区域来从默认区域以外的区域删除端口和服务

$ sudo firewall-cmd --remove-service murmur --permanent --zone home

自定义区域

您可以使用和滥用 firewalld 提供的默认区域,但您也可以自由创建自己的区域。例如,如果对您来说拥有一个专门用于游戏的区域有意义,那么您可以创建一个区域,并在游戏时切换到该区域。

要创建一个新的空区域,请创建一个名为 game 的新区域,并重新加载防火墙规则,以便您的新区域变为活动状态

$ sudo firewall-cmd --new-zone game --permanent
success
$ sudo firewall-cmd --reload

一旦创建并激活,您可以使用您需要为游戏之夜打开的所有服务和端口对其进行自定义。

尽职尽责

从今天开始考虑您的防火墙策略。慢慢开始,并建立一些对您有意义的合理的默认值。您可能需要一段时间才能养成考虑防火墙的习惯并了解您使用的网络服务,但通过一点探索,无论您的环境如何,您都可以增强您的 Linux 工作站的安全性。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时从事这两个行业。

3 条评论

“早在 1972 年,端口号列表(当时称为“套接字”)”

程序打开一个套接字,该套接字在选定的端口号上侦听连接。

在最新版本的 OpenSUSE 中,firewalld 的开箱即用配置简直是白痴:它只是不加区分地阻止流量,以至于我只能从机器本身 ssh 回到自身。它阻止来自本地网络的所有流量。如果所有流量都被阻止,为什么还要有 ssh 服务器?

目前在我的桌面上,我正在使用 gufw (gufw.org),将来当我有更多空闲时间(耐心和勇气)时,我将测试 Douane (douaneapp.com)

© . All rights reserved.