📜  如何在 Linux 中设置防火墙?

📅  最后修改于: 2021-10-20 10:18:54             🧑  作者: Mango

什么是防火墙?
防火墙是一种网络安全系统,它根据一组预先确定的规则过滤和控制流量。这是设备和互联网之间的中介系统。

注意:-如果您已经了解 Linux 中防火墙的工作,并且只想了解命令,那么请阅读本教程的结尾。

Linux 防火墙的工作原理:
大多数 Linux 发行版都附带可用于配置它们的默认防火墙工具。我们将使用 Linux 中提供的默认工具“IPTables”来建立防火墙。 iptables 用于在 Linux 内核中设置、维护和检查 IPv4 和 IPv6 包过滤规则的表。

注意:- 下面的所有命令都需要 sudo 权限。

链:-

链是为特定任务定义的一组规则。

我们有三个用于处理流量的链(规则集):-

  1. 输入链
  2. 输出链
  3. 前向链

1.输入链
从互联网(网络)到本地机器的任何流量都必须通过输入链。这意味着他们必须通过在输入链中设置的所有规则。

2. 输出链
从本地机器到互联网的任何流量都需要通过输出链。

3. 前向链
任何来自外部网络并进入另一个网络的流量都需要通过前向链。当两台或多台计算机连接并且我们想要在它们之间发送数据时使用它。

不同的政策:-

iptables 可以对流量执行三种操作

  1. 接受
  2. 降低
  3. 拒绝

1. 接受
当流量通过其指定链中的规则时,iptable 就会接受流量。
这意味着它打开了大门,允许这个人进入灭霸王国。

2. 删除
当流量无法通过其指定链中的规则时,iptable 会阻止该流量。
这意味着防火墙已关闭。

3. 拒绝
这种类型的操作类似于丢弃操作,但它会向流量的发送方发送一条消息,说明数据传输失败。
作为一般规则,当您希望另一端知道端口无法访问时使用 REJECT ‘使用 DROP 连接到您不希望人们看到的主机。


笔记:-
你需要记住一个简单的规则:-
你在iptables里设置的Rules是从最上面的规则到最下面的。每当数据包通过任何顶级规则时,它就被允许通过防火墙。不检查较低的规则。所以在设置规则时要小心。

基本的 iptables 命令:

1.列出iptable的当前规则:

列出当前 iptables 的规则:-

sudo iptables -L

输出将是:-

如您所见,我们有三个链(输入、转发、输出)。我们还可以看到列标题,但它们不是实际规则。这是因为大多数 Linux 都没有预定义的规则。

让我们看看每列的含义。

目标:-
这定义了需要对数据包执行什么操作(ACCEPT、DROP 等。)

保护:-
这定义了数据包的协议(TCP,IP)。

来源:-
这告诉数据包的源地址。

目的地:-
这定义了数据包的目标地址

2.清除规则:

如果您想清除/清除所有现有规则。运行以下命令:-

sudo iptables -F

这将重置 iptables。

3. 更改链的默认策略:

sudo iptables -P Chain_name Action_to_be_taken

如上图所示,每条链的默认策略都是 ACCEPT。

例如:
如果您看到转发链,您将看到“Chain FORWARD (policy ACCEPT)”。这意味着您的计算机允许将任何流量转发到另一台计算机。

为了将转发策略更改为丢弃:-

sudo iptables -P FORWARD DROP

上述命令将停止通过您的系统转发的任何流量。这意味着没有其他系统可以将您的系统作为中介来传递数据。

制定你的第一条规则:

1. 实施 DROP 规则:

我们现在将开始构建我们的防火墙策略。我们将首先处理输入链,因为这是传入流量将通过的地方。

句法:-

sudo iptables -A/-I chain_name -s source_ip -j action_to_take

我们将一个例子来理解这个话题。

假设我们要阻止来自 IP 地址 192.168.1.3 的流量。可以使用以下命令:-

sudo iptables -A INPUT -s 192.168.1.3 -j DROP

这可能看起来很复杂,但当我们回顾这些组件时,大部分都会变得有意义:-
-A 输入:-

标志 -A 用于将规则附加到链的末尾。这部分命令告诉 iptable 我们要在 INPUT 链的末尾添加规则。

-我输入:-
在这个标志中,规则被添加到链的顶部。

-s 192.168.1.3:-
标志 -s 用于指定数据包的来源。这告诉 iptable 查找来自源 192.168.1.3 的数据包

-j 删除
这指定了 iptable 应该对数据包做什么。

简而言之,上面的命令在 INPUT 链中添加了一条规则,即如果任何源地址为 192.168.1.3 的数据包到达,则丢弃该数据包,这意味着不允许该数据包到达计算机。

执行上述命令后,您可以使用以下命令查看更改:-

sudo iptables -L

输出将是:-

2. 实施 ACCEPT 规则:

如果要向网络的特定端口添加规则,则可以使用以下命令。

句法:-

sudo iptables -A/-I chain_name -s source_ip -p protocol_name --dport port_number -j Action_to_take

-p 协议名称:-
该选项用于匹配遵循协议protocol_name 的数据包。

-dport 端口号:
仅当您提供 -p protocol_name 选项时,此选项才可用。它指定查找去往端口“port_number”的数据包。

例子:-
假设我们要保持 SSH 端口打开(我们将在本指南中假设默认 SSH 端口为 22)来自我们在上述情况下阻止的 192.168.1.3 网络。也就是说,我们只想允许来自 192.168.1.3 的数据包到达端口 22。

我们做什么:-
让我们试试下面的命令:-

sudo iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT

上面的命令说查找来自 IP 地址 192.168.1.3 的数据包,具有 TCP 协议并且谁想要在我的计算机的端口 22 上传送某些东西。如果您找到这些数据包,则接受它们。

命令的输出是:-

但是,上面的命令有问题。它实际上不允许数据包。你能猜出这是什么?
提示:- 这与访问规则的方式有关。

记住我们之前讨论过的,你在iptables中设置的规则是从上到下检查的。每当数据包按照最高规则之一进行处理时,就不会使用较低规则对其进行检查。

好的!这是答案:-
在我们的例子中,使用最顶层规则检查数据包,该规则表示 iptable 必须丢弃来自 192.168.1.3 的任何数据包。因此,一旦数据包通过此规则被访问,它就不会进入下一个允许数据包到达端口 22 的规则。因此它失败了。

可以做什么?
最简单的答案是,将规则添加到链的顶部。您需要做的就是将 -A 选项更改为 -I 选项。 (在我们的场景中,我们首先删除上一节中添加的规则[参考下一节],然后再次添加以下规则)

执行此操作的命令是:-

sudo iptables -I INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT

现在使用 -L 命令检查 iptable 配置。输出将是:-

因此,首先检查来自 192.168.1.3 的任何数据包是否要到达端口 22,如果不是,则它
通过链中的下一个规则运行。否则允许通过防火墙。

现在您已经了解了如何阻止和接受传入流量,让我们看看如何删除规则:-

3.从iptable中删除规则:

句法:-

sudo iptables -D chain_name rule_number

例子:-
如果我们要删除接受到端口 22 的流量并在上一节中添加的规则,则:-

sudo iptables -D INPUT 1

记住规则编号从 1 开始
输出:-

4. 保存您的配置:

如果您在不是服务器的个人计算机上实现它,则这部分是不必要的,但是如果
您正在服务器上实施防火墙,那么您的服务器很可能会损坏并且
您可能会丢失所有数据。因此,最好保存您的配置。

有很多方法可以做到这一点,但我发现最简单的方法是使用iptables-persistent包。您可以从 Ubuntu 的默认存储库下载该软件包:

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

安装完成后,您可以使用以下命令保存配置:-

sudo invoke-rc.d iptables-persistent save

好了,教程到此结束。
让我们简要介绍一下到目前为止我们学到的所有命令:-

概括 :

1.列出iptables的当前规则:

sudo iptables -L

2. 更改默认策略:

sudo iptables -P Chain_name Action_to_be_taken

例子:-

sudo iptables -P FORWARD DROP

3.清除/刷新所有规则

sudo iptables -F

4. 在链的末尾附加规则:

sudo iptables -A

5. 在链的开头附加规则:

sudo iptables -I

6. 实施接受规则:-

sudo iptables -A/-I chain_name -s source_ip -j action_to_take

例子:-

iptables -A INPUT -s 192.168.1.3 -j ACCEPT

7. 实施 DROP 规则:-

sudo iptables -A/-I chain_name -s source_ip -j action_to_take

例子:-

iptables -A INPUT -s 192.168.1.3 -j DROP

8. 对特定端口/协议的实施规则:-

sudo iptables -A/-I chain_name -s source_ip -p protocol_name --dport port_number -j Action_to_take

例子:-

sudo iptables -I INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT

9. 删除规则:-

sudo iptables -D chain_name rule_number

例子:-

sudo iptables -D INPUT 1

10. 保存配置:-

sudo invoke-rc.d iptables-persistent save

这就是教程的结尾。我们已经看到了在本地机器上实现防火墙所需的所有必要命令。我们可以让防火墙执行各种其他操作,但不可能在一篇文章中涵盖所有这些操作。所以,我会写更多的文章来解释所有的命令。在那之前,继续实验!!