Linux防火墙:您需要了解的iptables和Firewalld

本文摘自我的书《 Linux in Action》以及尚未发布的第二个Manning项目。

防火墙

防火墙是一组规则。 当数据包移入或移出受保护的网络空间时,将根据防火墙规则测试其内容(特别是有关其来源,目标和计划使用的协议的信息),以查看是否应允许它通过。 这是一个简单的例子:

firewall filtering request

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

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

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

你对此有看法? 如果我告诉您还有另一种称为nftables的工具,会破坏您的一天吗?

好吧,我承认整个事情的确有些可笑,所以让我解释一下。 这一切都始于Netfilter,它在Linux内核模块级别控制对网络堆栈的访问和访问。 几十年来,用于管理Netfilter挂钩的主要命令行工具是iptables规则集。

引入了ufw和Firewalld作为更高级别的Netfilter解释器。 但是,Ufw和Firewalld的主要目的是解决独立计算机所面临的各种问题。 构建全尺寸网络解决方案通常需要iptables的强大力量,或者自2014年以来需要iptables的替代功能(通过nft命令行工具)。

iptables尚未普及,仍被广泛使用。 实际上,您应该期望在以后的许多年中以管理员身份进入受iptables保护的网络。 但是nftables通过添加到经典的Netfilter工具集中,带来了一些重要的新功能。

从这里开始,我将通过示例展示firewalld和iptables如何解决简单的连接问题。

使用Firewalld配置HTTP访问

正如您可能从其名称中猜到的那样,firewalld是systemd系列的一部分。 可以在Debian / Ubuntu机器上安装Firewalld,但默认情况下在Red Hat和CentOS上都存在Firewalld。 如果您的计算机上运行着诸如Apache之类的Web服务器,则可以通过浏览到服务器的Web根来确认防火墙是否正常工作。 如果该站点无法访问,则firewalld正在执行其工作。

您将使用firewall-cmd工具从命令行管理防火墙设置。 添加–state参数将返回当前防火墙状态:


   
   
# firewall-cmd --state
running

默认情况下,firewalld将处于活动状态,并会拒绝所有传入流量,但会有一些例外,例如SSH。 这意味着您的网站不会吸引太多的访问者,这无疑将为您节省大量的数据传输成本。 但是,由于您可能没有想到要使用Web服务器,因此您需要打开按照惯例分别指定为80和443的HTTP和HTTPS端口。 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-client ,该端口允许Linux从本地DHCP服务器请求IPv6 IP地址。

使用iptables配置锁定的客户亭

我敢肯定,您看到过自助服务终端,它们是平板电脑,触摸屏和类似ATM的PC,它们放在盒子里,机场,图书馆和商业场所都闲逛,邀请客户和路人浏览内容。 有关大多数信息亭的问题是,您通常不希望用户在家中摆弄自己,就像对待自己的设备一样。 它们通常不用于浏览,观看YouTube视频或对五角大楼发起拒绝服务攻击。 因此,为确保它们不会被滥用,您需要将其锁定。

一种方法是应用某种信息亭模式,无论是通过巧妙地使用Linux显示管理器还是在浏览器级别。 但是,要确保已填补所有漏洞,您可能还希望通过防火墙添加一些硬网络控件。 在下一节中,我将描述如何使用iptables来实现。

使用iptables时要记住两件重要的事情:赋予规则的顺序很关键,而且就其本身而言,iptables规则在重启后将无法生存。 我会一次在这里解决。

信息亭项目

为了说明所有这些,让我们想象一下我们为一家名为BigMart的较大连锁店的一部分的商店工作。 他们已经存在了几十年。 实际上,我们想象中的祖父母可能在那儿长大。 但是这些天来,BigMart公司总部的人们可能只是在计算亚马逊永久性压倒他们的时间。

不过,BigMart的IT部门正在尽力而为,他们只是向您发送了一些支持WiFi的自助服务终端设备,您希望将其安装在整个商店的战略位置。 他们的想法是,他们将显示登录到BigMart.com产品页面的Web浏览器,从而允许他们查找商品功能,过道位置和库存水平。 信息亭还将需要访问bigmart-data.com,其中存储了许多图像和视频媒体。

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

kiosk traffic flow ip tables

信息亭流量由iptables控制。

剧本

这就是将它们全部放入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表示此规则应成为OUTPUT链的一部分。 -p表示此规则仅适用于使用TCP协议的数据包,如-d告诉我们的,目的地为bigmart.com-j标志指向ACCEPT作为数据包与规则匹配时要采取的措施。 在此第一条规则中,该动作是允许或接受请求。 但是更进一步,您可以看到将被丢弃或拒绝的请求。

请记住,顺序很重要。 那是因为iptables会运行一个超出其每个规则的请求,但只会直到它得到匹配为止。 因此,例如youtube.com的传出浏览器请求将通过前四个规则,但是当到达–dport 80–dport 443规则时(取决于它是HTTP还是HTTPS请求),该请求将被丢弃。 iptables不会再检查了,因为那是一个匹配。

另一方面,当ubuntu.com达到其适当规则时,系统对ubuntu.com进行软件升级的请求将通过。 显然,我们在这里所做的只是允许传出的HTTP或HTTPS请求仅到达我们的BigMart或Ubuntu目标,而没有其他目标。

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

如果我的机器的IP发生变化,您将需要记住更新此规则。 否则,您将被锁定。

在家玩(希望在某种废弃的虚拟机上玩)? 大。 创建自己的脚本。 现在,我可以保存脚本,使用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工具将当前规则保存到.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的防火墙上的连接问题。

翻译自: https://opensource.com/article/18/9/linux-iptables-firewalld

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值