如下是如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则。
html
防火墙linux
防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会根据防火墙规则进行检测,以肯定是否容许其经过。下面是一个简单的例子:web
防火墙能够根据协议或基于目标的规则过滤请求。ubuntu
一方面,iptables是 Linux 机器上管理防火墙规则的工具。浏览器
另外一方面,firewalld也是 Linux 机器上管理防火墙规则的工具。bash
好吧,我认可整件事确实有点可笑,因此让我来解释一下。这一切都从 Netfilter 开始,它在 Linux 内核模块级别控制访问网络栈。几十年来,管理 Netfilter 钩子的主要命令行工具是 iptables 规则集。服务器
由于调用这些规则所需的语法看起来有点晦涩难懂,因此各类用户友好的实现方式,如 ufw和 firewalld 被引入,做为更高级别的 Netfilter 解释器。然而,ufw 和 firewalld 主要是为解决单独的计算机所面临的各类问题而设计的。构建全方面的网络解决方案一般须要 iptables,或者从 2014 年起,它的替代品 nftables (nft 命令行工具)。网络
iptables 没有消失,仍然被普遍使用着。事实上,在将来的许多年里,做为一名管理员,你应该会使用 iptables 来保护的网络。可是 nftables 经过操做经典的 Netfilter 工具集带来了一些重要的崭新的功能。ssh
从如今开始,我将经过示例展现 firewalld 和 iptables 如何解决简单的链接问题。curl
使用 firewalld 配置 HTTP 访问
正如你能从它的名字中猜到的,firewalld 是systemd家族的一部分。firewalld 能够安装在 Debian/Ubuntu 机器上,不过,它默认安装在 RedHat 和 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-client同样开放的 —— 它容许 Linux 从本地 DHCP 服务器请求 IPv6 IP 地址。
使用 iptables 配置锁定的客户信息亭
我相信你已经看到了信息亭——它们是放在机场、图书馆和商务场所的盒子里的平板电脑、触摸屏和 ATM 类电脑,邀请顾客和路人浏览内容。大多数信息亭的问题是,你一般不但愿用户像在本身家同样,把他们当成本身的设备。它们一般不是用来浏览、观看 YouTube 视频或对五角大楼发起拒绝服务攻击的。所以,为了确保它们没有被滥用,你须要锁定它们。
一种方法是应用某种信息亭模式,不管是经过巧妙使用 Linux 显示管理器仍是控制在浏览器级别。可是为了确保你已经堵塞了全部的漏洞,你可能还想经过防火墙添加一些硬性的网络控制。在下一节中,我将讲解如何使用iptables 来完成。
关于使用 iptables,有两件重要的事情须要记住:你给出的规则的顺序很是关键;iptables 规则自己在从新启动后将没法保持。我会一次一个地在解释这些。
信息亭项目
为了说明这一切,让咱们想象一下,咱们为一家名为 BigMart 的大型连锁商店工做。它们已经存在了几十年;事实上,咱们想象中的祖父母多是在那里购物并长大的。可是现在,BigMart 公司总部的人可能只是在数着亚马逊将他们永远赶下去的时间。
尽管如此,BigMart 的 IT 部门正在尽他们最大努力提供解决方案,他们向你发放了一些具备 WiFi 功能信息亭设备,你在整个商店的战略位置使用这些设备。其想法是,登陆到 BigMart.com 产品页面,容许查找商品特征、过道位置和库存水平。信息亭还容许进入 bigmart-data.com,那里储存着许多图像和视频媒体信息。
除此以外,您还须要容许下载软件包更新。最后,您还但愿只容许从本地工做站访问 SSH,并阻止其余人登陆。下图说明了它将如何工做:
*信息亭业务流由 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 意味着这条规则应该成为输出链的一部分。-p 表示该规则仅使用 TCP 协议的数据包,正如 -d 告诉咱们的,目的地址是 bigmart.com。-j 参数的做用是当数据包符合规则时要采起的操做是 ACCEPT。第一条规则表示容许(或接受)请求。但,往下的规则你能看到丢弃(或拒绝)的请求。
规则顺序是很重要的。由于 iptables 会对一个请求遍历每一个规则,直到遇到匹配的规则。一个向外发出的浏览器请求,好比访问 bigmart.com 是会经过的,由于这个请求匹配第一条规则,可是当它到达 dport 80 或 dport 443 规则时——取决因而 HTTP 仍是 HTTPS 请求——它将被丢弃。当遇到匹配时,iptables 再也不继续往下检查了。
另外一方面,向 ubuntu.com 发出软件升级的系统请求,只要符合其适当的规则,就会经过。显然,咱们在这里作的是,只容许向咱们的 BigMart 或 Ubuntu 发送 HTTP 或 HTTPS 请求,而不容许向其余目的地发送。
最后两条规则将处理 SSH 请求。由于它不使用端口 80 或 443 端口,而是使用 22 端口,因此以前的两个丢弃规则不会拒绝它。在这种状况下,来自个人工做站的登陆请求将被接受,可是对其余任何地方的请求将被拒绝。这一点很重要:确保用于端口 22 规则的 IP 地址与您用来登陆的机器的地址相匹配——若是不这样作,将当即被锁定。固然,这没什么大不了的,由于按照目前的配置方式,只需重启服务器,iptables 规则就会所有丢失。若是使用 LXC 容器做为服务器并从 LXC 主机登陆,则使用主机 IP 地址链接容器,而不是其公共地址。
若是机器的 IP 发生变化,请记住更新这个规则;不然,你会被拒绝访问。
在家玩(是在某种一次性虚拟机上)?太好了。建立本身的脚本。如今我能够保存脚本,使用 chmod 使其可执行,并以 sudo 的形式运行它。不要担忧“igmart-data.com 没找到”之类的错误 —— 固然没找到;它不存在。
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 。咱们在上一章节(LCTT 译注:指做者的书)中看到的常规 cron 任务并不适用,由于它们在设定的时间运行,可是咱们不知道何时咱们的计算机可能会决定崩溃和重启。
有许多方法来处理这个问题。这里有一个:
在个人 Linux 机器上,我将安装一个名为anacron的程序,该程序将在 /etc/ 目录中为咱们提供一个名为 anacrontab 的文件。我将编辑该文件并添加这个 iptables-restore 命令,告诉它加载那个 .rule 文件的当前内容。当引导后,规则天天(必要时)01:01 时加载到 iptables 中(LCTT 译注:anacron 会补充执行因为机器没有运行而错过的 cron 任务,所以,即使 01:01 时机器没有启动,也会在机器启动会尽快执行该任务)。我会给该任务一个标识符(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://www.linuxprobe.com/linux-iptables-irewalld.html