使用防火墙让你的 Linux 更增强大

掌握防火墙的工做原理,以及如何设置防火墙来提升 Linux 的安全性html

全部人都据说过防火墙(哪怕仅仅是在网络犯罪片里看到过相关的情节设定),不少人也知道他们的计算机里极可能正运行着防火墙,可是不多有人明白在必要的时候如何驾驭防火墙。linux

防火墙被用来拦截那些不请自来的网络流量,然而不一样网络须要的安全级别也不尽相同。好比说,和在外面一家咖啡馆里使用公共 WiFi 相比,你在家里的时候能够更加信任网络里的其它计算机和设备。你或许但愿计算机可以区分能够信任和不可信任的网络,不过最好仍是应该学会本身去管理(或者至少是核实)你的安全设置。git

防火墙的工做原理

网络里不一样设备之间的通讯是经过一种叫作端口port的网关实现的。这里的端口指的并非像 USB 端口 或者 HDMI 端口这样的物理链接。在网络术语中,端口是一个纯粹的虚拟概念,用来表示某种类型的数据到达或离开一台计算机时候所走的路径。其实也能够换个名字来称呼,好比叫“链接”或者“门口”,不过 早在 1981 年的时候 它们就被称做端口了,这个叫法也沿用至今。其实端口这个东西没有任何特别之处,只是一种用来指代一个可能会发生数据传输的地址的方式。github

1972 年,发布了一份 端口号列表(那时候的端口被称为“套接字socket”),而且今后演化为一组众所周知的标准端口号,帮助管理特定类型的网络流量。好比说,你天天访问网站的时候都会使用 80 和 443 端口,由于互联网上的绝大多数人都赞成(或者是默认)数据从 web 服务器上传输的时候是经过这两个端口的。若是想要验证这一点,你能够在使用浏览器访问网站的时候在 URL 后面加上一个非标准的端口号码。好比说,访问 example.com:42 的请求会被拒绝,由于 example.com 在 42 端口上并不提供网站服务。web

Navigating to a nonstandard port produces an error
Navigating to a nonstandard port produces an error

若是你是经过 80 端口访问同一个网站,就能够(不出所料地)正常访问了。你能够在 URL 后面加上 :80 来指定使用 80 端口,不过因为 80 端口是 HTTP 访问的标准端口,因此你的浏览器其实已经默认在使用 80 端口了。浏览器

当一台计算机(好比说 web 服务器)准备在指定端口接收网络流量的时候,保持该端口向网络流量开放是一种能够接受的(也是必要的)行为。可是不须要接收流量的端口若是也处在开放状态就比较危险了,这就是须要用防火墙解决的问题。安全

安装 firewalld

有不少种配置防火墙的方式,这篇文章介绍 firewalld。在桌面环境下它被集成在网络管理器Network Manager里,在终端里则是集成在 firewall-cmd 里。不少 Linux 发行版都预装了这些工具。若是你的发行版里没有,你能够把这篇文章当成是管理防火墙的通用性建议,在你所使用的防火墙软件里使用相似的方法,或者你也能够选择安装 firewalldruby

好比说在 Ubuntu 上,你必须启用 universe 软件仓库,关闭默认的 ufw 防火墙,而后再安装 firewalldbash

$ sudo systemctl disable ufw
$ sudo add-apt-repository universe
$ sudo apt install firewalld
复制代码

Fedora、CentOS、RHEL、OpenSUSE,以及其它不少发行版默认就包含了 firewalld服务器

不管你使用哪一个发行版,若是但愿防火墙发挥做用,就必须保持它在开启状态,而且设置成开机自动加载。你应该尽量减小在防火墙维护工做上所花费的精力。

$ sudo systemctl enable --now firewalld
复制代码

使用网络管理器选择区域

或许你天天都会链接到不少不一样的网络。在工做的时候使用的是一个网络,在咖啡馆里是另外一个,在家里又是另外一个。你的计算机能够判断出哪个网络的使用频率比较高,可是它并不知道哪个是你信任的网络。

一个防火墙的区域zone里包含了端口开放和关闭的预设规则。你能够经过使用区域来选择一个对当前网络最适用的策略。

你能够打开网络管理器里的链接编辑器(能够在应用菜单里找到),或者是使用 nm-connection-editor & 命令以获取全部可用区域的列表。

Network Manager Connection Editor
Network Manager Connection Editor

在网络链接列表中,双击你如今所使用的网络。

在出现的网络配置窗口中,点击“通用”标签页。

在“通用”面板中,点击“防火墙区域”旁边的下拉菜单以获取全部可用区域的列表。

Firewall zones
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: 全部传入链接都会被拒绝,可是会返回一个消息说明所请求的端口被禁用了。只有你主动发起的网络链接是被容许的。这是一个友好版的 drop 区域,由于虽然仍是没有任何一个端口容许传入流量,可是说明了会拒绝接收任何不是本机主动发起的链接。
  • home: 在你信任网络里的其它计算机的状况下使用这个区域。该区域只会容许你所选择的传入链接,可是你能够根据需求添加更多的容许项目。
  • internal: 和工做区域相似,该区域适用于内部网络,你应该在基本信任网络里的计算机的状况下使用。你能够根据需求开放更多的端口和服务,同时保持和工做区域不一样的一套规则。
  • trusted: 接受全部的网络链接。适合在故障排除的状况下或者是在你绝对信任的网络上使用。

为网络指定一个区域

你能够为你的任何一个网络链接都指定一个区域,而且对于同一个网络的不一样链接方式(好比以太网、WiFi 等等)也能够指定不一样的区域。

选择你想要的区域,点击“保存”按钮提交修改。

Setting a new zone
Setting a new zone

养成为网络链接指定区域的习惯的最好办法是从你最经常使用的网络开始。为你的家庭网络指定家庭区域,为工做网络指定工做区域,为你最喜欢的图书馆或者咖啡馆的网络指定公关区域。

一旦你为全部经常使用的网络都指定了一个区域,在以后加入新的网络的时候(不管是一个新的咖啡馆仍是你朋友家的网络),试图也为它指定一个区域吧。这样能够很好地让你意识到不一样的网络的安全性是不同的,你并不会仅仅由于使用了 Linux 而比任何人更加安全。

默认区域

每次你加入一个新的网络的时候,firewalld 并不会提示你进行选择,而是会指定一个默认区域。你能够在终端里输入下面这个命令来获取你的默认区域:

$ sudo firewall-cmd --get-default
public
复制代码

在这个例子里,默认区域是 public 区域。你应该保证该区域有很是严格的限制规则,这样在将它指定到未知网络中的时候才比较安全。或者你也能够设置你本身的默认区域。

好比说,若是你是一个比较多疑的人,或者须要常常接触不可信任的网络的话,你能够设置一个很是严格的默认区域:

$ sudo firewall-cmd --set-default-zone drop
success
$ sudo firewall-cmd --get-default
drop
复制代码

这样一来,任何你新加入的网络都会被指定使用 drop 区域,除非你手动将它制定为另外一个没有这么严格的区域。

经过开放端口和服务实现自定义区域

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 服务器应该使用哪一个端口这件事情并无一个行业标准,因此你能够自行决定使用哪一个端口,而后在防火墙上“开一个洞”,让它容许该端口上的流量。

实现方式和添加服务差很少:

$ 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 工做站变得更为强大。


via: opensource.com/article/19/…

做者:Seth Kenlon 选题:lujun9972 译者:chen-ni 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索