Linux iptables:如何添加防火墙规则(以允许 SSH 为例)
本文介绍如何使用iptables -A
(附加)命令添加 iptables 防火墙规则。
-A
用于追加。如果它让我们更容易记住 -A
作为添加规则(而不是附加规则),那就可以了。但是,请记住,-A
将规则添加到链的末尾。
同样,记住 -A
在末尾添加规则非常重要。
通常最后一条规则是丢弃所有数据包。如果我们已经有一个丢弃所有数据包的规则,并且如果我们尝试从命令行使用 -A
创建新规则,我们最终会在当前的“丢弃所有数据包”规则之后添加新规则,这将使我们的新规则几乎毫无用处。
一旦你掌握了 iptables,并在生产环境中实现它,你应该使用 shell 脚本,在其中使用 -A 命令添加所有规则。在该 shell 脚本中,我们的最后一行应该始终是“丢弃所有数据包”规则。当我们想添加任何新规则时,请修改该 shell 脚本并将我们的新规则添加到“丢弃所有数据包”规则之上。
语法:
$ iptables -A chain firewall-rule
- -A 链 - 指定应附加规则的链。 例如,对传入数据包使用 INPUT 链,对传出数据包使用 OUTPUT。
- firewall-rule - 各种参数组成了防火墙规则。
如果你不知道链是什么意思,你最好先阅读一下 iptables 基础知识。
防火墙规则参数
以下参数适用于各种防火墙规则。
-p
用于协议
- 指示规则的协议。
- 可能的值为 tcp、udp、icmp
-
使用“all”允许所有协议。如果不指定
-p
,默认情况下将使用“all”协议。使用“all”并不是一个好习惯,并且总是指定一个协议。 - 使用名称(例如:tcp)或数字(例如:tcp 的 6)作为协议。
- /etc/protocols 文件包含所有允许的协议名称和编号。
-
我们也可以使用
--protocol
-s
用于源
- 指示数据包的来源。
- 这可以是 IP 地址、网络地址或主机名
- 例如:-s 192.168.1.101 表示具体的ip地址
- 对于网络掩码,请使用 /mask。例如:“-s 192.168.1.0/24”表示该网络的网络掩码 255.255.255.0。这匹配 192.168.1.x 网络。
- 当我们不指定来源时,它将匹配所有来源。
- 我们也可以使用 –src 或 –source
-d
用于目的地
- 指示数据包的目的地。
- 这与“-s”相同(除了它代表目标主机、IP 地址或网络)
-
我们也可以使用
--dst
或--destination
-j
是目标
- j 代表“跳转到目标”
- 这指定匹配此防火墙规则的数据包需要发生什么。
- 可能的值为 ACCEPT、DROP、QUEUE、RETURN
- 我们还可以指定其他用户定义的链作为目标值。
-i
用于在界面中
- i 代表“输入接口”
- 我们可能会忽略这一点并假设“-i”用于接口。请注意 -i 和 -o 都用于接口。但是,-i 用于输入接口,-o 用于输出接口。
- 指示传入数据包通过 INPUT、FORWARD 和 PREROUTING 链进入的接口。
-
例如:
-i eth0
表示此规则应考虑通过接口 eth0 传入的数据包。 - 如果我们不指定 -i 选项,系统上所有可用的接口都将被视为输入数据包。
-
我们也可以使用
--in-interface
-o
用于输出接口
- o 代表“输出接口”
- 指示通过 INPUT、FORWARD 和 PREROUTING 链发送出局数据包的接口。
- 如果不指定 -o 选项,系统上的所有可用接口都将被考虑用于输出数据包。
-
我们也可以使用
--out-interface
防火墙参数的附加选项
上面的一些防火墙参数又具有自己的选项,可以与它们一起传递。 以下是一些最常见的选项。
要使用这些参数选项,您应该在防火墙规则中指定相应的参数。 例如,要使用“–sport”选项,我们应该在防火墙规则中指定“-p tcp”(或“-p udp”)参数。
注意
:所有这些选项前面都有两个破折号。 例如,sport 前面有两个连字符。
--sport 用于源端口(用于 -p tcp 或 -p udp)
- 默认情况下,所有源端口都匹配。
- 我们可以指定端口号或名称。 例如,要在防火墙规则中使用 SSH 端口,请使用“--sport 22”或“--sport ssh”。
- /etc/services 文件包含所有允许的端口名称和编号。
- 在规则中使用端口号比使用端口名更好(为了性能)。
- 要匹配端口范围,请使用冒号。 例如,22:100 匹配从 22 到 100 的端口号。
-
我们也可以使用
--source-port
--dport 用于目标端口(用于 -p tcp 或 -p udp)
-
与
--sport
相同,但这是针对目标端口的。 -
我们也可以使用
--destination-port
--tcp-flags 用于 TCP 标志(用于 -p tcp)
- 这可以包含用逗号分隔的多个值。
- 可能的值有:SYN、ACK、FIN、RST、URG、PSH。 您也可以使用 ALL 或 NONE
--icmp-type 用于 ICMP 类型(用于 -p icmp)
- 使用 icmp 协议“-p icmp”时,还可以使用“–icmp-type”参数指定 ICMP 类型。
- 例如:使用“-icmp-type 0”表示“Echo Reply”,使用“-icmp-type 8”表示“Echo”。
允许传入 SSH 连接的示例防火墙规则
现在我们了解了防火墙规则的各种参数(及其选项),让我们构建一个示例防火墙规则。
在这个例子中,让我们只允许传入的 SSH 连接到服务器。所有其他连接将被阻止(包括 ping)。
警告
:使用防火墙规则可能会导致您的系统无法访问。如果我们不知道自己在做什么,我们可能会将自己(和其他所有人)锁定在系统之外。因此,请仅在没有人使用的测试系统上进行所有学习,并且如果我们被锁定,我们可以访问控制台以重新启动 iptables。
1.删除现有规则
如果我们已经有一些 iptables 规则,请在删除现有规则之前进行备份。
删除所有现有规则并允许防火墙接受所有内容。如前所述,使用 iptables flush 清理所有现有规则并从头开始。
测试以确保我们能够从外部 ssh 和 ping 此服务器。
完成此示例后,您将只能通过 SSH 连接到该服务器。您将无法从外部 ping 此服务器。
2.只允许SSH
仅允许与此服务器的传入 SSH 连接。我们可以从任何地方通过 ssh 连接到该服务器。
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
上面的 iptables 命令有以下 4 个组件。
- “-A INPUT” - 这表明我们正在向 INPUT 链附加(或添加)新规则。 因此,此规则适用于传入流量。
- “-i eth0” - 通过接口 eth0 的传入数据包将根据此规则进行检查。
- “-p tcp --dport 22” - 此规则适用于 TCP 数据包。 这有一个名为“–dport 22”的 tcp 选项,表示服务器上此规则的目标端口是 22(即 ssh)。
- “-j ACCEPT” - 跳转到接受,它只是接受数据包。
简单来说,上述规则可以表述为:所有通过 eth0 的 ssh 传入数据包都将被接受。
3. 丢弃所有其他数据包
一旦我们指定了接受数据包的自定义规则,我们还应该有一个默认规则来丢弃任何其他数据包。
这应该是我们在 INPUT 链中的最后一条规则。
要丢弃所有传入的数据包,请执行以下操作。
$ iptables -A INPUT -j DROP
4. 查看 SSH 规则并测试
要查看当前的 iptables 防火墙规则,请使用 iptables -L
命令。
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
DROP all -- anywhere anywhere
从上面的输出中可以看出,它依次具有以下两条规则。
- 接受所有传入的 ssh 连接
- 丢弃所有其他数据包。
与其从命令行添加防火墙规则,不如创建一个包含规则的 shell 脚本,如下所示。
$ vi iptables.sh
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
$ sh -x iptables.sh
+ iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
+ iptables -A INPUT -j DROP
$ iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
DROP all -- anywhere anywhere
与 iptables append/add
命令类似,iptables 可用的其他命令很少。 我们将在 iptables 系列的后续文章中介绍它们。 我们还将提供几个实用的防火墙规则示例,这些示例将在现实生活中有所帮助。
相关文章
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Linux 中计算文件中的唯一行
发布时间:2023/05/04 浏览次数:70 分类:操作系统
-
计算文件中的唯一行是 Linux 中的一项常见任务,可以使用多种不同的工具和方法来执行此操作。使用 sort 和 uniq 命令计算文件中的唯一行数