大家都听说过防火墙(哪怕只看过网络犯罪电影里的相关剧情设定)。很多人也知道自己的电脑很可能在运行防火墙,但是很少有人知道在必要的时候如何控制它们。防火墙用于拦截未经
大家都听说过防火墙(哪怕只看过网络犯罪电影里的相关剧情设定)。很多人也知道自己的电脑很可能在运行防火墙,但是很少有人知道在必要的时候如何控制它们。
防火墙用于拦截未经请求的网络流量,但不同的网络需要不同的安全级别。例如,当你在家里时,你可以比在外面的咖啡馆使用公共WiFi时更信任网络中的其他计算机和设备。您可能希望您的计算机区分可信网络和不可信网络,但是最好学会自己管理(或至少验证)您的安全设置。
防火墙的工作原理网络中不同设备之间的通信是通过一个叫做端口的网关来实现的。这里的端口不是指像USB端口或HDMI端口这样的物理连接。在网络术语中,端口是一个纯粹的虚拟概念,用来表示某类数据到达或离开计算机时所采取的路径。实际上,它们可以被称为其他名称,如“连接”或“门口”,但它们早在1981年就被称为端口,这个名称一直沿用到今天。实际上,端口并没有什么特别的,它只是一种表示可能发生数据传输的地址的方式。
1972 年,发布了一份 端口号列表 (那时候的端口被称为“ 套接字(socket)”),并且从此演化为一组众所周知的标准端口号,帮助管理特定类型的网络流量。比如说,你每天访问网站的时候都会使用 80 和 443 端口,因为互联网上的绝大多数人都同意(或者是默认)数据从 web 服务器上传输的时候是通过这两个端口的。如果想要验证这一点,你可以在使用浏览器访问网站的时候在 URL 后面加上一个非标准的端口号码。比如说,访问 example.com:42 的请求会被拒绝,因为 example.com 在 42 端口上并不提供网站服务。
1972年,公布了端口号列表(当时端口被称为“套接字”),从那时起,它演变成一组众所周知的标准端口号,以帮助管理特定类型的网络流量。比如你每天访问网站都会用到80端口和443端口,因为互联网上大多数人都认同(或者默认)数据是从web服务器通过这两个端口传输的。如果您想验证这一点,可以在使用浏览器访问网站时,在URL后面添加一个非标准端口号。例如,访问example.com:42的请求将被拒绝,因为example.com不在端口42上提供网站服务。
导航到非标准端口会产生错误
如果通过80端口访问同一个网站,可以(不出意外)正常访问。您可以在URL中添加:80来指定使用端口80,但是由于端口80是HTTP访问的标准端口,您的浏览器已经默认使用端口80。
当计算机(如web服务器)准备在指定端口接收网络流量时,保持该端口对网络流量开放是一种可接受的(也是必要的)行为。但如果不需要接收流量的端口也打开了,那就危险了,这就是防火墙需要解决的问题。
安装防火墙d有许多方法可以配置防火墙。本文介绍了防火墙d,在桌面环境下,它集成在网络管理器中,在终端,它集成在防火墙-cmd中。许多Linux发行版都预装了这些工具。如果您的发行版中没有它,您可以将本文作为管理防火墙的一般建议,并在您使用的防火墙软件中使用类似的方法,或者您可以选择安装Firewall D。
例如,在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
使用网络管理器选择一个区域。也许你每天都会连接到许多不同的网络。我在工作中使用一个网络,在咖啡馆使用另一个,在家里使用另一个。你的电脑可以知道哪个网络使用频率高,但不知道你信任哪个网络。
防火墙的区域包含打开和关闭端口的预设规则。您可以通过使用区域来选择最适合当前网络的策略。
你可以打开网络管理器里的连接编辑器(可以在应用菜单里找到),或者是使用 nm-connection-editor & 命令以获取所有可用区域的列表。
您可以在网络管理器中打开连接编辑器(可以在应用程序菜单中找到),或者使用nm-connection-editor &命令获得所有可用区域的列表。
网络管理器连接编辑器
在网络连接列表中,双击您现在使用的网络。
在出现的“网络配置”窗口中,单击“常规”选项卡。
在“通用”面板中,点击“防火墙区域”旁边的下拉菜单以获取所有可用区域的列表。
在常规面板中,单击防火墙区域旁边的下拉菜单以获取所有可用区域的列表。
防火墙区域
您也可以使用以下终端命令来获得相同的列表:
$ sudo firewall-cmd --get-zones
每个区域的名称已经可以揭示设计者创建这个区域的意图,但是你也可以使用下面的终端命令来获得任何区域的详细信息:
$ sudo firewall-cmd --zone work --list-allwork target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client ports: protocols: [...]
在本例中,工作区的配置是允许SSH和DHCPv6客户端流量,但拒绝接收其他用户未明确请求的任何流量。(换句话说,工作区不会在你浏览网站时拦截HTTP响应流量,但会拦截你电脑上一个端口80的HTTP请求。)
你可以依次检查每个区域,看看它们允许什么样的交通。比较常见的有:
work:这个区域应该在你非常信任的网络上使用。它允许 SSH、DHCPv6 和 mDNS,并且还可以添加更多允许的项目。该区域非常适合作为一个基础配置,然后在此之上根据日常办公的需求自定义一个工作环境。public: 用在你不信任的网络上。这个区域的配置和工作区域是一样的,但是你不应该再继续添加其它任何允许项目。drop: 所有传入连接都会被丢弃,并且不会有任何响应。在不彻底关闭网络的条件下,这已经是最接近隐形模式的配置了,因为只允许传出网络连接(不过随便一个端口扫描器就可以通过传出流量检测到你的计算机,所以这个区域并不是一个隐形装置)。如果你在使用公共 WiFi,这个区域可以说是最安全的选择;如果你觉得当前的网络比较危险,这个区域也一定是最好的选择。block: 所有传入连接都会被拒绝,但是会返回一个消息说明所请求的端口被禁用了。只有你主动发起的网络连接是被允许的。这是一个友好版的 drop 区域,因为虽然还是没有任何一个端口允许传入流量,但是说明了会拒绝接收任何不是本机主动发起的连接。home: 在你信任网络里的其它计算机的情况下使用这个区域。该区域只会允许你所选择的传入连接,但是你可以根据需求添加更多的允许项目。internal: 和工作区域类似,该区域适用于内部网络,你应该在基本信任网络里的计算机的情况下使用。你可以根据需求开放更多的端口和服务,同时保持和工作区域不同的一套规则。trusted: 接受所有的网络连接。适合在故障排除的情况下或者是在你绝对信任的网络上使用。
为网络指定一个区域。您可以为您的任何网络连接指定一个区域,也可以为同一网络的不同连接模式(如以太网、WiFi等)指定不同的区域。).
选择你想要的区域,点击“保存”按钮提交修改。
选择所需区域,然后单击“保存”按钮提交修改。
设置新区域
养成指定网络连接区域的习惯的最好方法是从您最常用的网络开始。为您的家庭网络指定一个家庭区域,为您的工作网络指定一个工作区域,为您最喜欢的图书馆或咖啡馆网络指定一个公共关系区域。
一旦你为所有常用的网络指定了一个区域,当你加入一个新的网络(无论是一个新的咖啡馆还是你朋友的网络)时,试着也为它指定一个区域。这可以让你意识到,不同网络的安全性是不一样的,你不会因为用了Linux就比谁更安全。
默认区域每次加入新网络,firewalld都不会提示你选择,而是指定一个默认区域。您可以在终端中输入以下命令来获得您的默认区域:
$ sudo firewall-cmd --get-defaultpublic
在本例中,默认区域是公共区域。您应该确保在这方面有非常严格的限制,以便更安全地将其分配给未知网络。或者您可以设置自己的默认区域。
例如,如果你是一个可疑的人,或者你需要经常联系一个不可信的网络,你可以设置一个非常严格的默认区域:
$ sudo firewall-cmd --set-default-zone dropsuccess$ sudo firewall-cmd --get-defaultdrop
这样,您加入的任何新网络都将被指定使用拖放区,除非您手动将其设为另一个不太严格的区域。
通过开放端口和服务实现自定义区域。Firewalld的开发者不希望他们设置的区域适应世界上所有不同的网络和信任级别。您可以直接使用这些区域,也可以基于它们进行个性化设置。
可以根据自己需要的网络活动来决定打开或关闭哪些端口,不需要对防火墙有很深的理解。
预设服务向防火墙添加许可证的最简单方法是添加预设服务。严格地说,你的防火墙不知道什么是“服务”,因为它只知道端口号和使用的协议类型。但是,在标准和传统的基础上,防火墙可以为您提供端口和协议的组合。
例如,如果您是web开发人员,并且希望您的计算机对本地网络开放(以便您的同事可以看到您正在构建的网站),您可以添加http和https服务。如果你是一个游戏玩家,并且正在为你的游戏公会运行一个开源的杂音语音聊天服务器,那么你可以添加杂音服务。还有许多其他的服务。您可以使用以下命令来查看它们:
$ 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
此命令会在您的默认区域中添加指定服务所需的所有端口和协议,但在重新启动计算机或防火墙后,此命令将无效。如果您想使您的更改永久生效,您可以使用–永久标志:
$ sudo firewall-cmd --add-service murmur --permanent
您也可以对非默认区域使用此命令:
$ sudo firewall-cmd --add-service murmur --permanent --zone home
港口有时候你想允许的流量并不在firewalld D定义的服务中,也许你想在一个非标准端口上运行一个常规服务,或者只是想随意打开一个端口。
举个例子,也许你正在运行MapTool,一个开源的虚拟棋盘游戏软件。由于没有关于MapTool服务器应该使用哪个端口的行业标准,您可以自己决定使用哪个端口,然后在防火墙上“开一个洞”,允许该端口上的流量。
实现类似于添加服务:
$ sudo firewall-cmd --add-port 51234/tcp
此命令打开默认区域中TCP传入连接的端口51234,但在重新启动计算机或防火墙后将无效。如果您想使您的更改永久生效,您可以使用–永久标志:
$ sudo firewall-cmd --add-port 51234/tcp --permanent
您也可以对非默认区域使用此命令:
$ sudo firewall-cmd --add-port 51234/tcp --permanent --zone home
在路由器的防火墙上设置允许的流量不同于在本地计算机上设置。您的路由器可能会为其嵌入式防火墙提供不同的配置接口(原理是相同的),但这超出了本文的范围。
删除端口和服务如果您不再需要某个服务或端口,并且在设置时没有使用它–永久标志,然后您可以通过重新启动防火墙来清除修改。
如果您已经将修改设置为永久生效,您可以使用–移除端口或–要清除的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 --permanentsuccess$ sudo firewall-cmd --reload
创建并启用后,您可以通过添加玩游戏所需的服务和端口对其进行个性化设置。
用功的今天就开始考虑你的防火墙策略吧。不要着急,可以慢慢尝试建立一些合理的默认规则。你可能需要一段时间来习惯思考防火墙的配置,弄清楚你使用的是哪些网络服务,但是不管你处于什么样的环境,只要稍微探索一下,就可以让你的Linux工作站变得更加强大。