暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux防火墙: 关于 iptables 和 firewalld, 你需要知道什么

TIAP 2021-06-24
366

本文介绍如何使用 iptables 和 firewalld 工具来管理Linux防火墙连接规则。


防火墙


防火墙是一套规则。当数据包传入或输出受保护的网络空间时,其内容(特别是有关其来源、目标和计划使用的协议的信息)将根据防火墙规则进行测试,以确定是否允许其通过。下图是一个简单的例子:


一方面,iptables 是在 Linux 机器上管理防火墙规则的工具。

另一方面,firewalld 也是在 Linux 机器上管理防火墙规则的工具。

此外,还有另一个管理工具叫 nftables


好吧,我承认这件事有点滑稽,所以让我来解释一下。所有的这些都是起源于 Netfilter,它控制 Linux 内核模块级对网络堆栈的访问。几十年来,用于管理 Netfilter 钩子的主要命令行工具是 iptables 规则集。

因为使用这些规则的语法有些晦涩难懂,所以各种面向用户友好的实现方式(比如 ufw firewalld)被引入更高版本的 Netfilter 解释器。然而,Ufw 和 firewalld 主要是为解决独立计算机所面临的各种问题而设计的。构建完整的网络解决方案通常需要额外的 iptables,从2014年起,出现了它的替代品 nftables(通过 nft 命令行工具)。

iptables还没有发展到任何地方,仍然被广泛使用。事实上,在未来许多年里,作为管理员,你应该更希望使用iptables来保护网络。但是 nftables 已经添加到经典的 Netfilter 工具集中,而且带来一些很重要的新功能。

本文,我将通过示例展示 firewalld 和 iptables 如何解决简单的连接问题。


使用 firewalld 配置 HTTP 访问


你可能通过名字能猜到,firewalld systemd 家族的一部分。Firewalld 可以安装在 Debian/Ubuntu 机器上,但是默认情况下,它安装在 Red Hat 和 CentOS 上。如果你的计算机上运行了类似 Apache 的 web 服务器,你可以通过浏览服务器的 web 根目录来确认防火墙是否正常工作。如果站点无法访问,那么说明 firewalld 正在工作。

你可以使用 firewall-cmd 工具来管理 firewalld 设置。添加 --state 参数则返回当前防火墙的状态:


    # firewall-cmd --state
    running
    复制


    默认情况下,firewalld 处于激活状态,并将拒绝所有访问请求,但有几个例外,比如SSH。这意味着你的网站不会有太多的访问者,这肯定会为你节省大量的数据传输成本。不过,这可能不是你对web服务器所设想的,因此您需要打开 HTTP 和 HTTPS 端口,按照惯例,这两个端口分别被指定为80和443。firewalld 提供了两种方法,一种是通过 -add port 参数直接引用端口号和它将使用的网络协议(在本例中是TCP)。-permanent 参数告诉 firewalld 在服务器每次启动时加载此规则:


      # firewall-cmd --permanent --add-port=80/tcp
      # firewall-cmd --permanent --add-port=443/tcp
      复制


      -reload参数将这些规则应用于当前会话:

        # firewall-cmd --reload
        复制


        查看防火墙的当前设置,运行 -list-services:


          # firewall-cmd --list-services
          dhcpv6-client http https ssh
          复制


          假设您如前所述添加了浏览器访问,那么HTTP、HTTPS 和 SSH 端口现在都应该与 dhcpv6 客户机一起打开,dhcpv6 客户机允许Linux 从本地 DHCP 服务器请求 IPv6 IP 地址。


          使用 iptables 配置锁定的客户信息亭


          我相信你看到过像电脑一样的平板电脑、触摸屏和ATM电脑,它们放在机场、图书馆和商务室里,邀请顾客和路人浏览内容。大多数的问题是,你不希望用户在自己家里或者像对待他们自己的设备一样来操作。他们通常不是用来浏览、观看YouTube视频或对五角大楼发起拒绝服务攻击的。所以为了确保它们没有被滥用,你需要把它们锁起来。

          一种方法是应用某种 kiosk 模式,不管是通过使用 Linux显示管理器 还是设置在浏览器级别。但是为了确保所有的漏洞都被堵住了,您可能还需要通过防火墙添加一些硬件网络控制。在下一节中,我将描述如何使用 iptables 来实现它。


          关于使用 iptables,有两点比较重要:第一是设定的规则的顺序,第二是 iptables 规则无法在重启后继续起作用。我会在这里一次说明。


          信息亭项目


          为了便于说明,我们假设我们在为一家商店工作,这个商店属于一家叫做 BigMart 的大型连锁超市。已经存在了几十年,现如今,他们要面临被亚马逊收购的命运。

          尽管如此,BigMart 的 IT 部门仍在尽最大的努力,他们刚刚给你发送了一些可以连接 wifi 的 信息亭设备,你需要在整个商店的适当的位置安装这些设备。他们的想法是显示一个浏览器来展示 BigMart.com 上的产品页面,允许用户查看商品信息、位置以及库存信息。这些信息亭还可以访问 bigmart-data.com,展示许多图片和视频信息。

          除此之外,您还需要允许更新,并在必要时允许包下载。最后,您希望只允许从本地工作站进行入站SSH访问,并阻止其他所有人。下图说明了它将如何工作:


          脚本


          下面是 bash 脚本:


            #!/bin/bash
            iptables -A OUTPUT -p tcp -d bigmart.com -j ACCEPT
            iptables -A OUTPUT -p tcp -d bigmart-data.com -j ACCEPT
            iptables -A OUTPUT -p tcp -d ubuntu.com -j ACCEPT
            iptables -A OUTPUT -p tcp -d ca.archive.ubuntu.com -j ACCEPT
            iptables -A OUTPUT -p tcp --dport 80 -j DROP
            iptables -A OUTPUT -p tcp --dport 443 -j DROP
            iptables -A INPUT -p tcp -s 10.0.3.1 --dport 22 -j ACCEPT
            iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
            复制


            对规则的基本剖析从 -A 开始,告诉 iptables 我们要添加以下规则。输出意味着这个规则应该成为输出链的一部分, -p 表示此规则将仅适用于使用 TCP 协议的数据包,其中,正如 -d 所告诉我们的,目标是 bigmart.com。当数据包与规则匹配时,-j 标志指向 ACCEPT 作为要采取的操作。在第一条规则中,该操作是允许或接受请求。但再往下看,你可以看到将被丢弃或拒绝的请求。

            顺序很重要。这是因为 iptables 将运行一个超过其每个规则的请求,但只有在获得匹配之前。因此,对 youtube.com 发出的浏览器请求将通过前四条规则,但当它触发 -dport80 或 -dport443 规则时,将被丢弃,这取决于它是HTTP还是HTTPS请求。iptables 不会费心进一步检查,因为这是一个匹配规则。

            另一方面,系统向ubuntu.com请求软件升级的请求将在符合相应规则时通过。显然,我们在这里所做的是只允许发送HTTP或HTTPS请求到我们的BigMart或Ubuntu目的地,而不允许其他目的地。


            最后两条规则将处理传入的SSH请求。它们不会被前两个丢弃规则拒绝,因为它们不使用端口80或443,而是22。在这种情况下,将接受来自我的工作站的登录请求,但会丢弃对其他任何位置的请求。这一点很重要:确保用于端口22规则的IP地址与用于登录的计算机的地址匹配,如果不这样做,你将立即被锁定。当然,这没什么大不了的,因为按照目前的配置方式,只需重新启动服务器,iptables规则就会全部失效。如果使用 LXC 容器作为服务器并从 LXC 主机登录,则使用主机用于连接容器的 IP 地址,而不是其公共地址。

            如果你的机器 IP 发生变化,记得要更新规则,否则将会被锁定。

            要在家里(或者某种临时的虚拟机上)运行?好,创建一个脚本。现在我可以保存这个脚本,使用 chmod 使其可执行,并将其作为 sudo 运行。不要担心 bigmart-data.com没有找到错误,当然它没有找到;它不存在。


              chmod +X scriptname.sh
              sudo ./scriptname.sh
              复制


              你可以使用cURL从命令行测试防火墙。请求 ubuntu.com 成功,但 manning.com 失败:


                curl ubuntu.com
                curl manning.com
                复制


                配置 iptables 以在系统启动时加载


                如何让这些规则在每次系统启动时自动加载?第一步是使用 iptables-save 工具来讲当前规则保存到一个 .rules 文件中,这将在根目录中创建一个包含规则列表的文件。管道(后跟 tee 命令)是将sudo权限应用于字符串的第二部分所必需的:将文件实际保存到其他受限制的根目录。


                然后,我们告诉系统在每次启动时运行一个名为 iptables-restore 的工具。我们在上一个模块中看到的那种常规cron作业不会起作用,因为它们是在设置的时间运行的,我们不知道计算机何时会崩溃并重新启动。

                有很多方法可以解决这个问题,比如:

                在我的Linux机器上,我将安装一个名为 anacron 的程序,它将在 /etc/ 目录中提供一个名为anacrontab的文件。我将编辑该文件并添加这个 iptables-restore 命令,告诉它每天(必要时)在系统启动一分钟后将 .rules 文件的当前值加载到 iptables 中。给这个作业一个标识符(iptables-restore),然后添加这个命令。重新启动系统来测试。


                  sudo iptables-save | sudo tee root/my.active.firewall.rules
                  sudo apt install anacron
                  sudo nano etc/anacrontab
                  1 1 iptables-restore iptables-restore < root/my.active.firewall.rules
                  复制


                  以上这些例子说明了如何使用 iptables 和 firewalld 来管理 Linux 防火墙上的连接问题。


                  本文作者:David Clinton,翻译:GLIU

                  原文地址:https://opensource.com/article/18/9/linux-iptables-firewalld


                  文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论