网站搜索

如何设置 Iptables 防火墙以启用对 Linux 中服务的远程访问 - 第 8 部分


Linux 基金会认证计划简介

您可能还记得在 LFCELinux 基金会认证工程师)系列的第 1 部分 – 关于 Iptables,我们对防火墙进行了基本描述:一种管理机制数据包进入和离开网络。我们所说的“管理”实际上是指:

  1. 允许或阻止某些数据包进入或离开我们的网络。
  2. 将其他数据包从网络的一点转发到另一点。

基于预定的标准。

在本文中,我们将讨论如何实现基本的数据包过滤以及如何使用 iptables(netfilter 的前端,它是用于防火墙的本机内核模块)配置防火墙。

请注意,防火墙是一个广阔的主题,本文并不是要提供全面的指南来了解有关防火墙的所有知识,而是作为更深入研究该主题的起点。不过,当我们探讨 Linux 中防火墙的一些特定用例时,我们将在本系列的第 10 部分中重新讨论该主题。

您可以将防火墙想象成一个国际机场,客机几乎 24/7 来来去去。根据许多条件,例如一个人的护照的有效性或其原籍国(仅举几个例子),他或她可能会或可能不会被允许进入或离开某个国家。

与此同时,机场官员可以指示人们在必要时从机场的一个地方移动到另一个地方,例如当他们需要通过海关服务时。

在本教程的其余部分中,我们可能会发现机场的类比很有用。在我们继续进行时,请记住以下关系:

  1. 人=数据包
  2. 防火墙=机场
  3. 国家 #1=网络 #1
  4. 国家 #2=网络 #2
  5. 官员执行的机场规定=防火墙规则

Iptables – 基础知识

在底层,内核本身根据句子中分组的规则“决定”如何处理数据包。这些链定义了当包符合它们指定的条件时应采取的操作。

iptables 采取的第一个操作将包括决定如何处理数据包:

  1. 接受它(让它进入我们的网络)?
  2. 拒绝它(阻止它访问我们的网络)?
  3. 转发它(到另一个链)?

万一您想知道为什么这个工具被称为 iptables,这是因为这些链是以表的形式组织的,其中 filter 表 是最广为人知的表,也是最常用的表。用于通过其三个默认链实现数据包过滤:

1. INPUT 链处理进入网络的数据包,这些数据包的目的地是本地程序。

2.OUTPUT链用于分析源自本地网络并发送到外部的数据包。

3. FORWARD 链处理应转发到另一个目的地的数据包(如路由器的情况)。

对于每个链都有一个默认策略,该策略规定当数据包与链中的任何规则不匹配时默认应执行的操作。您可以通过运行以下命令查看为每个链创建的规则以及默认策略:

iptables -L

可用的政策如下:

  1. 接受 → 让数据包通过。任何不符合链中任何规则的数据包都被允许进入网络。
  2. DROP → 安静地丢弃数据包。任何与链中任何规则不匹配的数据包都将被阻止进入网络。
  3. REJECT → 拒绝数据包并返回一条信息性消息。尤其是这一策略不能作为默认策略。相反,它旨在补充数据包过滤规则。

在决定实施哪种政策时,您需要考虑上述每种方法的优点缺点 - 请注意,没有一刀切的方法-所有解决方案。

添加规则

要将规则添加到防火墙,请调用 iptables 命令,如下所示:

iptables -A chain_name criteria -j target

在哪里,

  1. -A代表Append(将当前规则附加到链的末尾)。
  2. chain_name 可以是 INPUT、OUTPUT 或 FORWARD。
  3. 目标是在这种情况下应用的操作或策略(接受、拒绝或删除)。
  4. criteria 是检查数据包所依据的一组条件。它由至少一个(很可能更多)以下标志组成。括号内的选项由竖线分隔,彼此等效。其余代表可选开关:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

我们的测试环境

让我们将所有内容整合到 3 个经典示例中,前两个示例使用以下测试环境:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

这是最后一个例子

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
示例 1:分析 DROP 和 REJECT 策略之间的差异

我们将首先为防火墙的输入 ping 定义一个 DROP 策略。也就是说,icmp 数据包将被悄悄丢弃。

ping -c 3 192.168.0.15
iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

在继续 REJECT 部分之前,我们将刷新 INPUT 链中的所有规则,以确保我们的数据包将通过此新规则进行测试:

iptables -F INPUT
iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
ping -c 3 192.168.0.15

示例 2:禁用/重新启用从 dev2 到 dev1 的 ssh 登录

我们将在处理传出流量时处理 OUTPUT 链:

iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

示例 3:允许/阻止 NFS 客户端(来自 192.168.0.0/24)挂载 NFS4 共享

在 NFSv4 服务器/防火墙中运行以下命令以关闭所有类型流量的端口 2049 和 111:

iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

现在让我们打开这些端口,看看会发生什么。

iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

正如您所看到的,我们能够在开放流量后挂载 NFSv4 共享。

插入、追加和删除规则

在前面的示例中,我们展示了如何将规则附加到 INPUTOUTPUT 链。如果我们想将它们插入到预定义的位置,我们应该使用 -I (大写 i)开关。

您需要记住,规则将被一个接一个地评估,并且当DROPACCEPT策略匹配时评估停止(或跳转)。因此,您可能会发现自己需要根据需要在链表中向上或向下移动规则。

我们将使用一个简单的示例来演示这一点:

让我们放置以下规则,

iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

在 INPUT 链中的位置 2)(因此将之前的 #2 移动为 #3)

使用上面的设置,在检查端口 2049 之前,将检查流量是否定向到端口 80

或者,您可以删除规则并将其余规则的目标更改为 REJECT(使用 -R 开关):

iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

最后但并非最不重要的一点是,您需要记住,为了使防火墙规则持久存在,您需要将它们保存到文件中,然后在启动时自动恢复它们(使用您选择的首选方法或可供您分发)。

保存防火墙规则:

iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

恢复规则:

iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

在这里,我们可以看到类似的过程(手动保存和恢复防火墙规则),使用名为 iptables.dump 的虚拟文件,而不是如上所示的默认文件。

iptables-save > iptables.dump

要使这些更改在引导过程中保持不变:

Ubuntu:安装iptables-persistent软件包,它将加载/etc/iptables/rules.v4文件中保存的规则。

apt-get install iptables-persistent

CentOS:将以下两行添加到/etc/sysconfig/iptables-config文件中。

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE:在 /etc/sysconfig/SuSEfirewall2 中列出允许的端口、协议、地址等(以逗号分隔)。

有关更多信息,请参阅文件本身,该文件有大量注释。

结论

本文提供的示例虽然没有涵盖 iptables 的所有花哨功能,但其目的是说明如何启用和禁用传入或传出流量。

对于防火墙爱好者,请记住,我们将在本 LFCE 系列的第 10 部分中通过更具体的应用程序重新讨论此主题。

如果您有任何问题或意见,请随时告诉我。