使用iptable和Firewalld工具来管理Linux防火墙连接规则

防火墙

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

使用iptable和Firewalld工具来管理Linux防火墙连接规则 Linux 第1张

防火墙可以根据协议或基于目标的规则过滤请求.

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

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

你对此有意见吗?如果我告诉你外面还有另一个工具,叫做nftable?

好吧,我承认整件事闻起来有点怪怪的,所以让我解释一下。这一切都是从Netfilter开始的,Netfilter控制Linux内核模块级别对网络堆栈的访问。几十年来,管理Netfilter钩子的主要命令行工具是iptables规则集。

因为调用这些规则所需的语法可能有点神秘,各种用户友好的实现如下UFW并引入了Firewalld作为高级Netfilter解释器.然而,UFW和Firewalld主要是为了解决独立计算机所面临的各种问题而设计的。构建全尺寸的网络解决方案通常需要iptables的额外功能,或者自2014年以来,它的替代品nftable(通过nft命令行工具)。
iptables没有去任何地方,而且仍然被广泛使用。事实上,在未来的许多年里,您应该会在管理员的工作中遇到受iptables保护的网络。但是nftable通过添加到经典的Netfilter工具集,带来了一些重要的新功能。

从现在开始,我将通过示例演示Firewalld和iptables如何解决简单的连接问题。

使用Firewalld配置HTTP访问

正如您从其名称中可能猜到的那样,Firewalld是systemd一家人。Firewalld可以安装在Debian/Ubuntu机器上,但在RedHat和CentOS上是默认的。如果在计算机上运行了像Apache这样的Web服务器,则可以通过浏览服务器的Web根目录来确认防火墙是否正常工作。如果这个网站无法到达,那么Firewalld就在做它的工作。

您将使用firewall-cmd工具来管理命令行中的Firewalld设置。添加Cstate参数返回当前防火墙状态:

  # firewall-cmd --state  running

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

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

Creload参数将这些规则应用于本届会议:

  # firewall-cmd --reload  

对防火墙上的当前设置很好奇吗?跑Clist-services:

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

假设您添加了前面描述的浏览器访问,HTTP、HTTPS和SSH端口现在都应该是打开的dhcpv6-client,它允许Linux从本地DHCP服务器请求IPv 6 IP地址。

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

我敢肯定你见过售货亭-它们是平板电脑、触摸屏和类似ATM的个人电脑-在一个包厢里,机场、图书馆和商务室随处可见,邀请顾客和过路人浏览内容。大多数信息亭的特点是,你通常不希望用户在家里把自己当成自己的设备。它们通常不是用来浏览、观看youtube视频或对五角大楼发起拒绝服务攻击的。所以,为了确保它们不被滥用,你需要把它们锁起来。

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

关于使用iptables,有两件重要的事情要记住:您给出的规则的顺序是至关重要的,仅凭它本身,Iptable规则将无法在重新启动后存活下来。我会在这里一次讲一遍。

亭工程
为了说明这一切,让我们想象一下,我们在一家名为BigMart的大型连锁商店工作。他们已经存在了几十年;事实上,我们想象中的祖父母很可能是在那里购物长大的。但如今,BigMart公司总部的人可能只是在数着亚马逊(Amazon)把他们永远赶下去之前的几个小时。

尽管如此,BigMart的IT部门正在尽力而为,他们刚刚给您发送了一些WiFi准备的信息亭设备,您可以在整个商店的战略位置安装这些设备。他们的想法是,他们将显示一个登录到BigMart.com产品页面的网页浏览器,允许他们查找商品特征、走道位置和库存级别。这些信息亭还需要访问bigmart-data.com,那里存储了许多图像和视频媒体。

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

使用iptable和Firewalld工具来管理Linux防火墙连接规则 Linux 第2张

亭的交通流量由iptable控制。

剧本

下面是如何将所有这些都放入一个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我们要添加以下规则。OUTPUT这意味着这个规则应该成为输出链的一部分。-p指示此规则仅适用于使用tcp协议的数据包,其中,-d告诉我们,目的地是bigmart.com。这,这个,那,那个-j标志指向ACCEPT作为当数据包与规则匹配时要采取的操作。在第一条规则中,该操作是允许或接受请求。但在更低的范围内,您可以看到将被删除或拒绝的请求。

记住秩序很重要。这是因为iptables将运行一个请求,超过它的每个规则,但只有在它得到匹配为止。所以一个向外发送的浏览器请求,比如说,youtube.com将通过前四条规则,但是当它到达Cdport 80或Cdport 443规则-取决于它是HTTP请求还是HTTPS请求-它将被删除。Iptable不会再费心检查了,因为那是匹配的。

另一方面,如果系统请求ubuntu.com进行软件升级,那么当它达到适当的规则时,它就会通过。显然,我们在这里所做的是只允许发送HTTP或HTTPS请求到我们的BigMart或Ubuntu目的地,而不是其他目的地。

最后两个规则将处理传入的SSH请求。由于它们不使用端口80或443,而是使用22,所以它们不会被前面的两个DROP规则所拒绝。在这种情况下,从我的工作站登录请求将被接受,但其他任何地方的请求将被删除。这一点很重要:确保用于端口22规则的IP地址与用于登录的机器的地址相匹配-如果不这样做,您将立即被锁在门外。当然,这没什么大不了的,因为按照当前的配置方式,您可以简单地重新启动服务器,而iptables规则就会被删除。如果您使用LXC容器作为您的服务器并从您的LXC主机登录,那么使用您的主机用来连接到容器的IP地址,而不是它的公共地址。

如果我的机器的IP曾经改变,您需要记住更新这个规则;否则,您将被锁在门外。

在家里玩(希望是在一个丢弃的VM上)?太棒了创建自己的脚本。现在我可以保存脚本,使用chmod使其可执行,并将其运行为sudo。别担心bigmart-data.com not found错误-当然找不到;它不存在。

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

您可以在命令行中使用cURL。请求ubuntu.com有效,但是manning.com失败了。

  curl ubuntu.com  curl manning.com  

将iptables配置为在系统启动时加载

现在,我如何使这些规则自动加载每次售货机启动?第一步是使用iptables-save工具。这将在根目录中创建一个包含规则列表的文件。这个管道,后面跟着tee命令,是应用我的sudo权限到字符串的第二部分:将文件实际保存到其他受限制的根目录。

然后,我可以告诉系统运行一个名为iptables-restore每次它启动。像我们在前面的模块中看到的那样的常规cron作业不会有帮助,因为它们是在设定的时间运行的,但是我们不知道我们的计算机何时会决定崩溃和重新启动。

有很多方法来处理这个问题。这里有一个:

在我的Linux机器上,我将安装一个名为anacron这将在/etc/目录中提供一个名为anacrontab的文件。我将编辑该文件并添加以下内容iptables-restore命令,告诉它每天(必要时)在启动后一分钟将该.Rule文件的当前值加载到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的防火墙上的连接问题。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

参与评论