如何设置防火墙在Ubuntu 14.04使用iptables

在iptables防火墙是保护你的Linux服务器的好方法。在本指南中,我们将讨论如何在Ubuntu 14.04服务器上配置iptables规则。

介绍

设置好的防火墙是确保任何现代操作系统安全的必要步骤。 大多数Linux发行版附带几种不同的防火墙工具,我们可以用它们来配置我们的防火墙。 在本指南中,我们将介绍iptables防火墙。

Iptables是默认情况下包含在大多数Linux发行版中的标准防火墙(一个称为nftables的现代变体将开始替换它)。 它实际上是内核级netfilter钩子的前端,可以操纵Linux网络栈。 它通过匹配跨越网络接口的每个分组与一组规则来决定要做什么来工作。

在前面的指南中,我们学会了iptables规则如何工作来阻止不需要的流量 在本指南中,我们将讨论一个实际示例,演示如何为Ubuntu 14.04服务器创建基本规则集。 生成的防火墙将允许SSH和HTTP流量。

注:本教程介绍IPv4的安全性。 在Linux中,IPv6安全性与IPv4分开维护。 例如,“iptables”仅维护IPv4地址的防火墙规则,但它有一个称为“ip6tables”的IPv6对等体,可用于维护IPv6网络地址的防火墙规则。

如果您的VPS配置为IPv6,请记住使用适当的工具保护IPv4和IPv6网络接口。 有关IPv6工具的更多信息,请参阅本指南: 如何配置工具使用IPv6在Linux VPS

先决条件

在开始使用本教程之前,您应该在服务器上设置一个单独的非root超级用户帐户 - 具有sudo权限的用户。 如果您需要设置的,按照本指南: 与Ubuntu 14.04初始服务器设置

基本iptables命令

既然您对iptables概念有了很好的理解,我们应该覆盖将用于形成复杂规则集和管理iptables接口的基本命令。

首先,您应该知道iptables命令必须以root权限运行。 这意味着你需要以root身份登录,使用susudo -i来获得root的shell,或者与之前的所有命令sudo 我们将使用sudo本指南中,因为这是一个Ubuntu系统上的首选方法。

一个好的起点是列出为iptables配置的当前规则。 你可以做到这一点与-L标志:

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

正如你所看到的,我们有三个默认链(INPUT,OUTPUT和FORWARD)。 我们还可以看到每个链的默认策略(每个链都有ACCEPT作为其默认策略)。 我们还看到一些列标题,但我们没有看到任何实际规则。 这是因为Ubuntu不附带默认规则集。

我们可以看到,反映需要启用由而是采用每个规则和政策的命令的格式输出-S标志:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

要复制配置,我们就只需要输入sudo iptables下面是每个输出的线条。 (根据配置,如果我们远程连接,我们不会在规则捕获并允许我们当前的连接之前不建立默认丢弃策略,实际上可能会稍微复杂一些。)

如果有到位的规则,并希望他们取消并重新开始,你可以刷新通过键入目前的规则:

sudo iptables -F

再次,默认的策略是在这里很重要的,因为,虽然所有的规则都从链中删除,默认策略将使用此命令更改。 这意味着,如果您远程连接,您应该确保INPUT和OUTPUT链的默认策略在清除规则之前设置为ACCEPT。 您可以输入以下命令:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

您可以在建立明确允许连接的规则后将默认丢弃策略更改回DROP。 我们稍后将讨论如何做到这一点。

制定你的第一条规则

我们将开始构建我们的防火墙策略。 如上所述,我们将使用INPUT链,因为这是传入流量将通过的漏斗。 我们将从我们上面谈到的规则开始:明确接受当前SSH连接的规则。

我们需要的完整规则是:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

这可能看起来令人难以置信的复杂,但大多数它是有意义的,当我们浏览组件:

  • -A输入-A标志追加规则到链的末端。 这是命令的一部分,告诉iptables我们希望添加一个新规则,我们希望该规则添加到链的末尾,并且我们要操作的链是INPUT链。
  • -m连接跟踪 :iptables的都有一组核心功能,而且还拥有一组扩展或提供额外的功能模块。

在命令的这一部分,我们指出,我们希望有机会获得由提供的功能conntrack模块。 此模块允许访问可用于根据数据包与先前连接的关系做出决策的命令。

  • --ctstate:这是通过调用可用的命令之一conntrack模块。 此命令允许我们基于数据包与我们之前见过的数据包的相关性进行匹配。

我们通过它的价值ESTABLISHED以允许是现有连接的一部分包。 我们通过它的价值RELATED ,以允许与已建立的连接相关的数据包。 这是与我们当前的SSH会话匹配的规则部分。

  • -j ACCEPT:指定的匹配数据包的目标。 在这里,我们告诉iptables应该接受和允许匹配前面的标准的数据包。

我们把这个规则放在开始,因为我们想要确保我们已经使用的连接在达到任何DROP规则之前被匹配,接受和拉出链。

如果我们列出规则,我们可以看到更改:

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

现在你知道一般的语法,让我们继续添加一些更多的情况,我们想接受连接。

接受其他必要的连接

我们告诉iptables保持打开任何已经打开的连接,并允许与这些连接相关的新连接。 但是,我们需要创建一些规则来确定我们何时接受不满足这些条件的新连接。

我们要保持两个港口专门开放。 我们希望保持我们的SSH端口打开(我们将在本指南中假设这是默认值22.如果您在SSH配置中更改了此设置,请在此处修改您的值)。 我们还将假设此计算机在默认端口80上运行Web服务器。如果不是这样,您不必添加该规则。

我们将使用两行来添加这些规则:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

如你所见,这些与我们的第一条规则非常相似,但也许更简单。 新选项是:

  • -p TCP:此选项匹配数据包,如果正在使用的协议是TCP。 这是一种基于连接的协议,将被大多数应用程序使用,因为它允许可靠的通信。
  • --dport:如果此选项可用-p tcp标志给出。 它给出了匹配匹配分组的目的端口的进一步要求。 第一个规则匹配到目的地为端口22的TCP分组,而第二个规则匹配指向端口80的TCP流量。

还有一个接受规则,我们需要确保我们的服务器可以正常运行。 通常,计算机上的服务通过向彼此发送网络分组来彼此通信。 他们利用一种叫做伪网络接口做loopback device ,它指挥交通回本身,而不是到其他计算机。

因此,如果一个服务想要与侦听端口4555上的连接的另一个服务通信,则它可以将数据包发送到回送设备的端口4555。 我们希望允许这种类型的行为,因为它对于许多程序的正确操作是必要的。

我们需要添加的规则是:

sudo iptables -I INPUT 1 -i lo -j ACCEPT

这看起来有点不同于我们的其他命令。 让我们来看看它在做什么:

  • -I INPUT 1: -I标志告诉iptables来插入规则。 这比不同-A其中附加的规则结束标志。 -I标志需要一个链条和要插入新规则的规则位置。

在这种情况下,我们将此规则添加为INPUT链的第一条规则。 这将打破其余的规则。 我们希望这在顶部,因为它是根本的,不应受后续规则的影响。

  • -i罗 :规则的这一部分,如果该数据包所使用的接口是“LO”接口匹配。 “lo”接口是回送设备的另一个名称。 这意味着应该接受使用该接口进行通信的任何数据包(在我们的服务器上生成的数据包)。

要看到我们的现行规定,我们应该用-S标志。 这是因为-L标志不包括一些信息,这样的规则是联系在一起的接口,这是我们刚才添加的规则的重要组成部分:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

实施删除规则

现在,我们有四个单独的规则,根据特定标准显式接受数据包。 然而,我们目前的防火墙没有阻止任何东西

如果一个数据包进入INPUT链,并且不匹配我们做的四个规则之一,它被传递到我们的默认策略,这是接受数据包。 我们需要改变这一点。

有两种不同的方式,我们可以做到这一点,有一些非常重要的差异。

第一种方法是修改INPUT链的默认策略。 我们可以通过键入:

sudo iptables -P INPUT DROP

这将捕获通过我们的INPUT链丢弃的任何数据包,并删除它们。 这就是我们所说的默认丢弃策略。 这种类型的设计的一个含义是,如果规则被刷新,它会丢弃丢弃的数据包。

这可能更安全,但如果您没有其他方式访问您的服务器,也可能产生严重后果。 使用DigitalOcean,您可以通过我们的Web控制台登录,以便在发生这种情况时访问您的服务器。 Web控制台充当虚拟本地连接,因此iptables规则不会影响它。

您可能希望服务器在规则被转储的情况下自动删除所有连接。 这将阻止您的服务器被打开。 这也意味着你可以轻松地附加规则到链的底部,同时仍然丢弃数据包,你想要的。

替代方法是将链的默认策略保持为接受,并添加将每个剩余数据包丢弃到链本身底部的规则。

如果您更改了上述INPUT链的默认策略,您可以将其设置回以后跟输入:

sudo iptables -P INPUT ACCEPT

现在,您可以在链的底部添加一个规则,删除任何剩余的数据包:

sudo iptables -A INPUT -j DROP

正常操作条件下的结果与默认丢弃策略完全相同。 这条规则的工作原理是到达它的每一个数据包剩余匹配。 这可以防止数据包从以往任何时候都删除所有的方式,通过链到达默认策略。

基本上,这用于保持默认策略接受流量。 这样,如果有任何问题,并且规则被刷新,您仍然能够通过网络访问机器。 这是一种实现默认操作而不更改将应用​​于空链的策略的方法。

当然,这也意味着任何规则,任何您希望添加到链的结尾的附加规则将必须在删除规则之前添加。 您可以通过暂时删除删除规则来执行此操作:

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT new_rule_here
sudo iptables -A INPUT -j DROP

或者,您可以通过指定行号,在链的末尾插入所需的规则(但是在删除之前)。 要在第4行插入规则,您可以键入:

sudo iptables -I INPUT 4 new_rule_here

如果您无法知道每个规则是哪个行号,您可以通过键入以下命令让iptables对规则编号:

sudo iptables -L --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere            
2    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

这有助于确保您在适当的位置添加规则。

列出和删除Iptables规则

如果您想了解上市和删除iptables规则的细节,看看这个教程: 如何列出和删除iptables防火墙规则

保存Iptables配置

默认情况下,添加到iptables的规则是短暂的。 这意味着,当你重新启动服务器,你的iptables规则将会消失。

这实际上是一些用户的功能,因为它给他们一个回来,如果他们意外锁定了自己的服务器的一个渠道。 但是,大多数用户将需要一种方法来自动保存已创建的规则,并在服务器启动时加载它们。

有几个方法可以做到这一点,但最简单的方法是用iptables-persistent包。 您可以从Ubuntu的默认存储库下载:

sudo apt-get update
sudo apt-get install iptables-persistent

在安装过程中,系统将询问您是否要保存当前规则以自动加载。 如果您对当前配置感到满意(并且您已测试过创建独立SSH连接的能力,则可以选择保存当前规则。

它还会询问您是否要保存已配置的IPv6规则。 这些都通过一个单独的实用程序调用配置ip6tables它控制的IPv6数据包中几乎相同的方式流动。

一旦安装完成后,你将有一个新的服务,称为iptables-persistent配置为在启动运行。 此服务将在您的规则中加载并在服务器启动时应用。

保存更新

如果您更新防火墙并希望保留更改,则必须保存iptables规则以使其保持持久。

使用此命令保存防火墙规则:

sudo invoke-rc.d iptables-persistent save

结论

您现在应该有一个良好的起点,开发一个满足您需求的防火墙。 还有许多其他的防火墙公用事业和一些可能会更容易,但iptables是一个很好的学习工具,如果仅仅是因为它暴露了一些底层的netfilter的结构,也因为它存在于许多系统。

要了解有关使用iptables保护网络的更多信息,请查看以下教程: