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

Linux Foundation Certified Engineer – Part 8

介绍Linux基金会认证计划

您可能还记得本系列的LFCELinux基金会认证工程师)第一部分 – 关于Iptables中的内容,我们对防火墙的基本描述:管理进出网络的数据包的机制。通过“管理”,我们实际上是指:

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

基于预定的标准。

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

请注意,防火墙是一个广泛的主题,本文并不旨在成为了解所有相关知识的全面指南,而是作为深入研究这个主题的起点。但是,在本系列的第10部分中,我们将重新讨论这个主题,探讨Linux中防火墙的一些特定用例。

您可以将防火墙看作一个国际机场,客机几乎24/7进出。根据一些条件,例如一个人的护照有效性,或者他/她的国籍(仅举几个例子),他/她可能被允许或不被允许进入或离开某个国家。

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

在接下来的教程中,我们可能会发现机场类比很有用。在我们继续之前,请记住以下关系:

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

Iptables – 基础知识

在低级别上,内核本身会根据分组在链中分组的规则“决定”如何处理数据包,或者句子。这些链定义了当数据包符合它们指定的标准时应采取的操作。

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

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

以防您想知道为什么这个工具被称为iptables,这是因为这些链被组织在表中,其中过滤表是最为人熟知的表,也是用于实现数据包过滤的表,它具有三个默认链:

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

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

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

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

# iptables -L

可用的策略如下:

  1. 接受 → 允许数据包通过。任何不匹配链中任何规则的数据包都允许进入网络。
  2. 丢弃 → 静默丢弃数据包。任何不匹配链中任何规则的数据包都被阻止进入网络。
  3. 拒绝 → 拒绝数据包并返回信息性消息。这个特别不适用作为默认策略。相反,它旨在补充数据包过滤规则。
Linux Iptables Policies

在决定要实施哪种策略时,您需要考虑上述每种方法的优点缺点 – 请注意,没有一种大小适合所有的解决方案。

添加规则

要向防火墙添加规则,请按以下方式调用 iptables 命令:

# iptables -A chain_name criteria -j target

其中,

  1. -A 代表追加(将当前规则追加到链的末尾)。
  2. chain_name 可以是 INPUT、OUTPUT 或 FORWARD。
  3. 目标是在这种情况下要应用的操作或策略(接受、拒绝或丢弃)。
  4. 条件是要检查数据包的一组条件。它由至少一个(很可能更多)以下标志组成。方括号内用竖线分隔的选项是等效的。其余表示可选开关:
[--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:分析“拒绝”和“丢弃”策略之间的差异

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

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

在继续拒绝部分之前,我们将清除输入链中的所有规则,以确保我们的数据包将由这个新规则进行测试:

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
示例2:禁用/重新启用从dev2到dev1的ssh登录

我们将处理输出链,因为我们正在处理出站流量:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
示例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
Block NFS Ports in Firewall

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

# 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
Open NFS Ports in Firewall

如您所见,在打开流量后,我们能够挂载NFSv4共享。

插入、追加和删除规则

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

你需要记住,规则将会逐个进行评估,当匹配到DROPACCEPT策略时,评估就会停止(或跳过)。因此,你可能会发现自己需要根据需要在链列表中上下移动规则。

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

Check Rules of Iptables Firewall

让我们将以下规则,

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

放置在INPUT链的第2个位置(因此将前面的#2移为#3)

Iptables Accept Rule

使用上面的设置,流量将在检查是否指向端口80之前,进行端口2049的检查。

或者,你可以删除一条规则,并将剩余规则的目标更改为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 Drop Rule

最后,但同样重要的是,你需要记住为了让防火墙规则持久生效,你需要将它们保存到文件中,然后在启动时自动恢复(使用你选择的首选方法或者你的发行版可用的方法)。

保存防火墙规则:

# 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
Dump Linux Iptables

为了使这些更改在启动时持久生效:

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

# apt-get install iptables-persistent

CentOS:在/etc/sysconfig/iptables-config文件中添加以下2行。

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

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

有关更多信息,请参考文件本身,其中有大量注释。

结论

本文提供的示例虽然未涵盖iptables的所有功能,但旨在说明如何启用和禁用传入或传出流量。

对于那些防火墙爱好者,请记住我们将在本LFCE系列的第10部分中重新讨论这个主题。

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

Source:
https://www.tecmint.com/configure-iptables-firewall/