如何设置 Iptables 防火墙以启用对 Linux 中的服务的远程访问 - 第 8 部分
Linux 基金会认证计划简介
您会记得,在本LFCE(Linux 基金会认证工程师)系列的第 1 部分 - 关于 Iptables 中,我们对防火墙进行了基本描述:一种管理进出网络的数据包的机制。我们所说的“管理”实际上是指:
- 允许或阻止某些数据包进入或离开我们的网络。
- 将其他数据包从网络的一个点转发到另一个点。
根据预定的标准。
在本文中,我们将讨论如何实现基本的数据包过滤以及如何使用 iptables(netfilter 的前端)配置防火墙,netfilter 是用于防火墙的本机内核模块。
请注意,防火墙是一个庞大的主题,本文并非旨在成为理解所有相关知识的全面指南,而是作为深入研究该主题的起点。但是,我们将在本系列的第 10 部分中重新讨论该主题,届时我们将探讨 Linux 中防火墙的一些具体用例。
您可以将防火墙想象成一个国际机场,客机几乎 24/7 全天候在此起降。根据一系列条件,例如某人护照的有效期或其原籍国(仅举几个例子),他或她可能被允许或可能不被允许进入或离开某个国家。
同时,机场官员可以根据需要指示人们从机场的一个地方移动到另一个地方,例如当他们需要通过海关服务时。
在本教程的其余部分中,我们可能会发现机场类比很有用。在我们继续时,请记住以下关系:
- 人数 = 包裹
- 防火墙 = 机场
- 国家 #1 = 网络 #1
- 国家 #2 = 网络 #2
- 由官员执行的机场规定=防火墙规则
Iptables - 基础知识
在底层,内核本身根据链或语句分组的规则“决定”如何处理数据包。这些链定义了当包与它们指定的标准匹配时应采取什么操作。
iptables 采取的第一个动作是决定如何处理数据包:
- 接受它(让它进入我们的网络)吗?
- 拒绝它(阻止它访问我们的网络)?
- 转发它(到另一条链)?
如果你想知道为什么这个工具被称为iptables,那是因为这些链是按表组织的,其中filter 表最为人所知,它用于通过其三个默认链实现数据包过滤:
1. INPUT链处理进入网络、发往本地程序的数据包。
2. OUTPUT链用于分析源自本地网络并要发送到外部的数据包。
3. FORWARD链处理应转发到另一个目的地的数据包(如路由器的情况)。
对于每个链,都有一个默认策略,该策略规定当数据包与链中的任何规则不匹配时应该默认执行的操作。您可以通过运行以下命令查看为每个链创建的规则和默认策略:
# iptables -L
可用的策略如下:
- 接受→ 让数据包通过。任何不匹配链中任何规则的数据包都允许进入网络。
- DROP → 悄悄丢弃数据包。任何不匹配链中任何规则的数据包都将被阻止进入网络。
- REJECT → 拒绝数据包并返回一条信息。这个策略不能作为默认策略使用。相反,它旨在补充数据包过滤规则。
在决定实施哪种政策时,您需要考虑如上所述的每种方法的优缺点——请注意,没有一刀切的解决方案。
添加规则
要向防火墙添加规则,请按如下方式调用 iptables 命令:
# iptables -A chain_name criteria -j target
在哪里,
- -A代表附加(将当前规则附加到链的末尾)。
- chain_name可以是 INPUT、OUTPUT 或 FORWARD。
- 目标是在这种情况下应用的操作或策略(接受、拒绝或删除)。
- 标准是检查数据包所依据的一组条件。它由以下至少一个(很可能是多个)标志组成。括号内的选项由竖线分隔,彼此等效。其余的代表可选开关:
[--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 共享。
插入、附加和删除规则
在前面的例子中,我们展示了如何将规则附加到INPUT和OUTPUT链。如果我们想将它们插入到预定义的位置,则应该使用-I(大写 i)开关。
您需要记住,规则将逐一进行评估,并且当匹配DROP或ACCEPT策略时,评估将停止(或跳转)。因此,您可能需要根据需要在链表中上移或下移规则。
我们将使用一个简单的例子来证明这一点:
让我们制定以下规则,
# 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 部分中重新讨论这个主题并介绍更具体的应用程序。
如果您有任何问题或意见,请随时告诉我。