当前位置: > Ubuntu >

设置在 Ubuntu 上使用 IPTables 防火墙 14.04

时间:2016-05-07 22:14来源:linux.it.net.cn 作者:IT

Iptables 是列入最标准的防火墙 Linux 发行版 默认情况下 (被称为 nftables 的现代变体将开始 替换 它). 这是实际上可以操纵 Linux 网络栈的内核级过滤钩子的前端. 它的工作方式匹配每个交叉对照一套规则来决定做什么的网络接口的数据包.

在先前的指南, 我们学到了 如何 iptables 规则工作要阻止不需要的通信. 本指南中, 我们会继续前进到一个实际的例子来演示如何创建基本的规则集 Ubuntu 14.04 服务器.

注: 本教程介绍 IPv4 安全. 在 Linux 中, IPv6 安全是单独维护的从 IPv4. 举个例子, “iptables” 只有保持防火墙规则分配的 IPv4 地址,但它具有称为一个 IPv6 对应版本 “ip6tables”, 可以用于维护防火墙规则对于 IPv6 网络地址.

如果你的 VPS 针对 IPv6 配置, 请记住,以确保您的 IPv4 和 IPv6 网络接口与适当的工具. 有关 IPv6 的工具的详细信息, 请参阅本指南:如何配置工具来对 Linux 的 VPS 使用 IPv6

 

基本 iptables 命令

现在,你已经很好地理解 iptables 的概念, 我们应涵盖基本的命令,将用来形成复杂的规则集,并在一般管理 iptables 界面.

第一次, 你应该知道 iptables 命令必须具有超级用户权限才能运行. 这意味着您需要以 root 身份登录, 使用 su 或 sudo -i 获取根外壳, 还是之前的所有命令 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

正如你可以看到, 我们都有我们三个默认链 (输入,输出, 和转发). 我们也可以看到每个链的默认策略 (每个链已接受作为其默认策略). 我们也看到一些列标题, 但我们看不到任何实际的规则. 这是因为 Ubuntu 不附带了默认规则集.

我们可以看到在反映了启用每个规则和政策而不使用所需命令的格式输出 -S 国旗:

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

要复制的配置, 我们只需要键入 sudo iptables 其次是每个输出中的行. (取决于配置, 它可能实际上稍微复杂的如果我们远程连接,所以,我们不要提起默认放置策略之前的规则已经到位,捕捉并允许我们当前的连接。)

如果你 做 在地方具有规则并且想要放弃他们,从头再来, 您可以通过键入刷新当前的规则:

sudo iptables -F

再来一次, 默认策略在这里很重要, 因为, 而所有的规则都删除从你的枷锁, 默认策略将 不 使用此命令更改. 这意味着,如果您远程连接, 您应该确保您输入和输出的链上的默认策略之前刷新您的规则都将设置为接受. 你可以通过键入:

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

您然后可以更改默认放弃政策回降后你已经建立了显式允许您连接的规则. 我们来复习如何做,在一个时刻.

 

让你的第一条规则

我们要开始构建我们的防火墙策略. 正如我们上面说, 我们要使用 INPUT 链,因为这是传入的通信量将被发送通过漏斗. 我们打算开始与我们谈过有点上面的规则: 明确地接受你的当前的规则 SSH 连接.

这是我们需要的全部规则:

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

这可能看起来令人难以置信的复杂, 但我们复习了组件,大部分是有道理:

  • -输入: 的 -A 国旗 追加 一项规则链的末端. 这是告诉我们要添加一个新规则的 iptables 命令的部分, 我们希望这一规则添加到链的末尾, 又要动手术链是 INPUT 链.
  • -m conntrack: iptables 有一组核心功能, 但也有一套扩展或模块,它们提供额外的功能.

在此部分中的命令, 我们要指出我们希望有对所提供的功能的访问 conntrack 模块. 此模块使访问命令可以用来基于先前连接的数据包的关系做出决策.
* –ctstate: 这是通过调用可用的命令之一 conntrack 模块. 此命令允许我们以匹配数据包的基础上他们如何相关的数据包,我们以前见过.

我们将它传递的值 ESTABLISHED 允许一部分的现有连接的数据包. 我们将它传递的值 RELATED 允许与已建立的连接相关联的数据包. 这是规则的符合我们当前的部分 SSH 会议.
* -j 接受: 这指定匹配的数据包的目标. 这里, 我们告诉 iptables 应接受与前面的条件相匹配的数据包,并允许通过.

我们需要将此规则置于开始,因为我们想要确保我们正在使用的连接相匹配, 接受, 并掏出之前达成的任何下降规则链.

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

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 配置, 修改你的价值在这里). 我们也要承担此计算机正在运行 web 服务器 在默认端口 80. 如果这不是您的情况相符, 你不需要添加该规则.

这两条线,我们要如何使用来添加这些规则:

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 给出了旗帜. 它给出了进一步的要求匹配的匹配的数据包的目标端口. 第一条规则匹配的端口的 TCP 数据包 22, 而第二个规则匹配 TCP 通信端口指向 80.

还有一个更多接受我们需要确保我们的服务器才能正确发挥作用的规则. 经常, 计算机上的服务相互沟通通过向彼此发送网络数据包. 他们这样做是通过利用一个称为的伪网络接口 loopback device, 用以指导交通回发到自身,而不是到其他计算机.

因此,如果一个服务想要传达与侦听端口上的连接的另一个服务 4555, 它可以将数据包发送到端口 4555 环回设备的. 我们希望这种类型的行为被允许, 因为它是许多程序正确运作必不可少的条件.

这是我们需要添加规则:

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

这看起来有点不同,比我们其他命令. 让我们复习它在做什么:

  • -我输入 1: 的 -I 标志告诉 iptables 到 插入 一条规则. 这是不同于 -A 结尾追加一个规则的旗帜. 的 -I 标志以链和执政地位要插入新的规则.

在这种情况下, 我们加入了这一规则作为 INPUT 链的第一个规则. 这就会撞上其他规则下来. 我们想要这顶部,因为它是基本,不会受到后续规则.
* -我瞧: 如果数据包正在使用的接口是此组件的规则匹配 “罗湖” 接口. 的 “罗湖” 接口是环回设备的另一个名称. 这意味着,任何使用该接口进行通信的数据包 (在我们的服务器上生成的数据包, 为我们的服务器) 应接受.

看到我们目前的规则, 我们应该使用 -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
 

执行 Drop 规则

我们现在有四个单独的规则明确接受基于某些条件的数据包. 然而, 目前我们的防火墙未阻止 任何东西.

如果一个数据包进入 INPUT 链,且不匹配我们的四个规则之一, 它将被传递到我们的默认策略, 哪,反正接收该数据包. 我们需要改变这.

有两种不同的方法我们可以这样做, 有一些很重要的区别.

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

sudo iptables -P INPUT DROP

这将捕捉漏网的我们 INPUT 链的任何数据包, 并把它们放. 这就是我们所谓的默认放置策略. 这种类型的设计的影响之一就是它退回上丢弃数据包,如果规则被刷新.

这可能是更多 安全, 但也可能产生严重后果,如果你没有另一种方式访问您的服务器. 与 DigitalOcean, 您可以通过才能访问到您的服务器,如果发生这种情况我们 web 控制台登录. 该 web 控制台作为一个虚拟的本地连接, 所以 iptables 规则不会影响它.

你可能会喜欢您的服务器来自动删除所有连接事件中规则甩了. 这将防止您的服务器被留敞开. 这也意味着你可以轻松地将规则附加到链的底端容易同时仍然丢弃数据包,你会像.

替代的方法是保持链的接受,并添加一个规则,滴到链本身的底部的每个其余数据包的默认策略.

如果您更改了默认策略为 INPUT 链上面, 您可以设置回跟着通过键入:

sudo iptables -P INPUT ACCEPT

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

sudo iptables -A INPUT -j DROP

在正常操作条件下的结果是完全相同的默认放置策略. 此规则进行匹配 每个 到达它的其余数据包. 这就防止了从数据包 过 删除所有通过链达到默认策略的方式.

基本上, 这用来保留默认策略接受交通. 这种方式, 如果有任何问题和规则被刷新, 您将仍然能够通过网络访问这台机器. 这是一种不改变将应用到一个空的链的政策执行的默认操作.

答案是肯定的, 这也意味着,任何你想添加到链的末尾的附加规则将不得不在 drop 规则之前添加的任何规则. 你可以做这要么通过暂时删除 drop 规则:

sudo iptables-D 输入-j 滴 sudo iptables-输入 new_rule_here
sudo iptables-输入-j 滴

或, 你可以在链的末尾插入你需要的规则 (但在下降之前) 通过指定的行号. 在行号处插入一条规则 4, 您可以键入:

sudo iptables-我输入 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-persistent 包. 您可以下载这从 Ubuntu 的默认存储库:

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

在安装过程中, 你会问是否想要保存您当前的规则,要自动加载. 如果你快乐与您的当前配置 (和您已经测试了您创建独立的 SSH 连接能力, 您可以选择保存您当前的规则.

它会问你是否你想要保存您已经配置了 IPv6 规则. 这些是通过一个称为的单独的实用程序配置 ip6tables 这几乎是同样的方式控制流程的 IPv6 数据包.

一旦安装完毕, 你将会有新的服务,叫 iptables-persistent 那被配置为在启动时运行. 这项服务将加载您的规则并将它们应用服务器启动时.

 

结论

你现在应该有一个良好的起点,发展一个防火墙,满足你的需要. 有很多其他防火墙实用程序和一些可能会更容易, 但是 iptables 是一种很好的学习工具, 如果只因为它揭露了一些基本的过滤结构,因为它是目前在很多系统中.






(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容