Linux iptables 防火墙简化示例

2023-10-18

在上一篇文章中,我们讨论了如何使用强化最佳实践保护 Linux 服务器。有人问我防火墙部分,里面简单介绍了iptables防火墙。今天我们就来详细讨论一下Linux iptables 防火墙以及如何使用出色的防火墙来保护您的服务器流量。

 

 

CentOS 7 上的 iptables

如果你使用的是CentOS 7,你会发现firewalld管理iptables,所以如果你想回到iptables,你必须停止并屏蔽firewalld。


$ systemctl stop firewalld

$ systemctl mask firewalld  

然后安装 iptables 服务并启用它:


$ yum install iptables-services

$ systemctl enable iptables  

然后你就可以启动它:


$ systemctl start iptables  

 

Linux 防火墙的工作原理

Iptables 防火墙功能构建在 Linux 内核中用于数据包过滤的 Netfilter 框架之上。

防火墙类型

有两种类型的防火墙:

无状态防火墙单独处理每个数据包,这意味着它不会看到同一连接的其他数据包。

状态防火墙这种类型的防火墙关心通过它的所有数据包,因此它知道连接的状态。它可以更好地控制流量。

网络过滤器包含tables。这些表包含chains,并且链包含个体rules.

如果数据包匹配任何规则,iptables 将应用该规则action到那个数据包。

行动可以是:accept, rejectignore, or pass将数据包转移到其他规则以进行更多处理。

Netfilter 可以使用 IP 地址和端口号处理传入或传出流量。

iptables 命令管理和配置 Netfilter。

在开始编写防火墙命令之前,我们需要了解一下防火墙的结构,以便我们可以轻松地编写防火墙规则。

 

iptables 防火墙表

Netfilter有三个表可以携带处理规则。

iptables过滤表是处理流量的主表。

第二个是NAT表,它处理 NAT 规则。

第三张表是磨床用于破坏数据包。

 

桌链

上述表中的每个表都包含链;这些链是iptables规则的容器。

过滤表包含前进,输入, and OUTPUT 链。您可以创建自定义链来保存您的规则。

如果一个数据包是来到主人身边, iptables 将通过以下方式处理它输入链rules.

如果数据包是去另一个主机,这意味着 OUTPUT 链规则将对其进行处理。

iptables 使用正向链用于处理具有访问了主机但注定是另一位主人。

 

连锁政策

过滤表中的每个链都有一个策略。该策略是 iptables 采取的默认操作。

该政策可能是丢弃、拒绝, and ACCEPT.

ACCEPT 策略允许数据包通过防火墙。 DROP 策略丢弃数据包而不通知客户端。 REJECT 策略还会丢弃数据包并通知发送方。

从安全角度来看,您应该丢弃所有到达主机的数据包,并仅接受来自可信来源的数据包。

 

添加 iptables 规则

您可以使用 iptables 命令添加新规则,如下所示:


$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT  

让我们把这个命令分成几部分,这样我们就可以理解它的一切。

-A 表示我们正在添加一条新规则。默认情况下,iptables 将所有新规则添加到过滤表除非您指定另一个表。

-i 标志指定将应用规则的设备。如果您不指定设备,iptables 会将规则应用于所有传入流量,无论设备如何。

-p 标志指定您要处理的数据包的协议,在我们的例子中是 TCP。

–dport 标志指定目标端口,即 80。

-d 指定目的IP 地址,即1.2.3.4。如果未指定目标 IP 地址,则该规则将应用于 eth1 上的所有传入流量,无论 IP 地址如何。

-j 指定操作或JUMP要做的行动。这里我们使用接受策略接受数据包。

上述规则允许端口 80 上的传入 HTTP 流量。

允许传出流量怎么样?


$ iptables -A OUTPUT -o eth1 -p tcp --sport 80 -j ACCEPT  

您可以使用 -A 标志将规则添加到 OUTPUT 链。

-o 标志用于用于传出流量的设备。

-sport 标志指定源端口。

您可以使用 http 或 https 等服务名称来代替 sport 或 dport 上的数字端口号。所有服务名称都在 /etc/services 文件中。

您应该使用服务名称而不是端口号,这使得阅读规则更容易。

 

iptables 规则顺序

iptables 将新规则放置在链的末端。您可以使用 -I 选项将其添加到顶部。

正如您现在将看到的,规则的顺序很重要。您可以使用 I 标志将规则准确插入到您想要的位置。

查看以下规则以了解规则排序的重要性:


$ iptables -I INPUT 3 -i eth1 -p udp -j ACCEPT
$ iptables -I INPUT 4 -i eth1 -p udp --dport 80 -j DROP  

第一条规则接受来自 eth1 的所有 UDP 流量,数字 3 是规则顺序。

第二条规则丢弃进入端口 80 的流量。

第一个规则将接受所有流量,然后应该丢弃流量的第二个规则将不执行任何操作,因为 iptables 在第一个规则中传递流量。

您的规则应该有意义,因为链中规则的顺序很重要。

 

列出 iptables 规则

您可以使用 -L 标志列出链中的规则:


$ iptables -L INPUT  

您可以使用 –line-numbers 显示规则的行号:


$ iptables -L INPUT --line-numbers  

该列表显示服务的名称。您可以使用 -n 选项来显示端口号:


$ iptables -L INPUT -n --line-numbers  

上述规则将使列表更快,因为它可以防止 iptablesDNS解析和服务查找。

您可以像这样列出所有链的所有规则:


$ iptables -L -n --line-numbers  

要获取每个规则处理的数据包数量,可以使用 -v 标志:


$ iptables -L -v  

此外,您可以使用 -Z 标志将计数器重置为零。

现在我们可以向任何我们想要的链添加新规则,我们可以按特定顺序插入规则,我们可以列出任何链或所有链的规则,但是删除规则怎么样?

 

删除规则

您可以使用 -D 标志删除规则:


$ iptables -D INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT  

此命令将删除您之前指定的 HTTP 规则。

在删除规则之前,只需列出规则规范以确保规则规范,然后将其删除。

您可以使用订单号删除规则,而不用编写规则规范。


$ iptables -D INPUT 2  

您可以使用 -F 标志删除特定链中的所有规则,这意味着刷新所有规则。


$ iptables -F INPUT  

如果您在使用 -F 标志时忘记提及链名称,则所有链规则将被删除。

 

替换规则

您可以使用 -R 标志将现有规则替换为您自己的规则:


$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT  

此命令将用键入的规则替换 INPUT 链中的第一个规则。

 

列表具体表

要列出特定表,请使用 -t 标志和表名,如下所示:


$ iptables -L -t nat  

这里我们列出nat表中的规则。

 

iptables 用户定义链

要创建用户定义的链,请使用 -N 标志。


$ iptables -N MY_CHAIN  

另外,您可以使用 -E 标志重命名它。


$ iptables -E MY_CHAIN NEW_NAME  

您可以使用 -X 标志删除用户定义的链。


$ iptables -X MY_CHAIN  

如果使用 -X 标志时不提及链名称,它将删除所有用户定义的链。您无法删除 INPUT 和 OUTPUT 等内置链。

 

重定向到用户定义的链

您可以使用 -j 标志将数据包重定向到用户定义的链,例如内置链。


$ iptables -A INPUT -p icmp -j MY_CHAIN  

上述规则会将所有 ICMP 流量重定向到链 MY_CHAIN。

 

设置链的默认策略

您可以使用 -P 标志来设置特定链的默认策略。默认策略可以是接受、拒绝和丢弃。


$ iptables -P INPUT DROP  

因此,现在,输入链将丢弃任何传入的数据包,除非您编写规则允许任何传入流量。

 

同步洪泛

攻击者仅在未完成 TCP 握手的情况下发送 SYN 数据包,因此接收主机将有许多打开的连接,并且您的服务器变得太忙而无法响应其他客户端。

我们可以使用iptables防火墙的限制模块来保护我们免受SYN洪水攻击。


$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT  

这里我们只指定每秒 10 个 SYN 数据包。您可以根据您的网络需求调整该值。

如果这会限制您的网络,您可以使用 SYN cookies。

同步 Cookie

In


/etc/sysctl.conf  

文件并添加这一行:


net.ipv4.tcp_syncookies = 1  

然后保存并重新加载。


$ sysctl -p  

 

丢弃无效状态数据包

INVALID 状态数据包是不属于任何连接的数据包,您将丢弃它们。


$ iptables -A INPUT -m state --state INVALID -j DROP  

此规则将丢弃所有传入的无效状态数据包。

 

丢弃碎片数据包

碎片数据包是大的畸形数据包的碎片,您应该编写规则来丢弃它们。

-f 标志告诉 iptables 防火墙选择所有片段。因此,如果您不使用 iptables 作为路由器,则可以丢弃碎片数据包。


$ iptables -A INPUT -f -j DROP  

 

保存 iptables 规则

如果重新启动服务器,您将丢失您编写的所有规则,那么如何保留它们呢?

如果您使用的是 CentOS 或 Red Hat,则可以使用 iptables-save 命令保存所有规则。


iptables-save > /etc/sysconfig/iptables  

在 CentOS 7 上,您可以像这样保存规则:


$ service iptables save  

您可以仅保存特定的表,例如过滤表:


$ iptables-save -t filter  

另外,您可以使用 iptables-restore 来恢复规则。

在基于 Debian 的发行版上,您可以使用 iptables-persistent 包来保存和恢复规则。

首先,安装它:


$ apt-get install iptables-persistent  

然后您可以保存和恢复规则:


$ netfilter-persistent save  

$ netfilter-persistent reload  

我希望您发现 iptables 防火墙很简单。继续回来。

谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux iptables 防火墙简化示例 的相关文章

  • 使用 Python 函数

    在编程时 我们经常重复执行相同的任务 例如执行数字加法或使用不同的输入打印相同的语句 这些是一般示例 但对于这些示例 您愿意编写相同的代码 10 次还是只编写一次 这就是函数的目的 它们是仅针对特定任务定义一次的代码片段 并具有可重用的功能
  • 在 HDFS 中创建目录并复制文件 (Hadoop)

    HDFS is the Hadoop分布式文件系统 它是一个用于大型数据集的分布式存储系统 支持容错 高吞吐量和可扩展性 它的工作原理是将数据划分为在集群中的多台机器上复制的块 这些块可以并行写入或读取 从而提高吞吐量和容错能力 HDFS

随机推荐

  • 如何在 Debian 11/10/9 上安装 Gulp.js

    Gulp是一个工具包 可帮助开发人员在开发过程中实现痛苦工作流程的自动化 本教程将帮助您在 Debian 11 Debian 10 和 Debian 9 操作系统上安装 Gulp 第 1 步 安装 Node js 首先 你需要安装node
  • 如何在 Linux 中递归更改文件的权限

    如果您使用 Linux 作为主要操作系统或管理 Linux 服务器 您会遇到尝试创建或编辑文件并收到 权限拒绝 错误的情况 通常 与权限不足相关的错误可以通过设置正确的文件权限或所有权 Linux 是一个多用户系统 对文件的访问是通过文件权
  • 如何显示 MySQL 中所有数据库的列表

    给药时MySQL对于数据库服务器 您要做的最常见的任务之一就是熟悉环境 这涉及诸如列出驻留在服务器上的数据库等任务 显示表格特定数据库的信息或获取有关用户帐户及其权限的信息 本教程介绍如何通过命令行显示 MySQL 或 MariaDB 服务
  • 如何创建 Tar Gz 文件

    tar 存档是一个存储其他文件集合的文件 包括有关这些文件的信息 例如所有权 权限和时间戳 在 Linux 操作系统中 您可以使用tar创建 tar 档案的命令 该命令还可以使用各种压缩程序来压缩档案 其中 gzip 是最流行的算法 按照约
  • 如何在 Ubuntu 20.04 上安装 GCC (build-essential)

    GNU 编译器集合 GCC 是 C C Objective C Fortran Ada Go D 编程语言 很多开源项目 包括Linux内核和GNU工具 都是使用GCC编译的 本文介绍如何在 Ubuntu 20 04 上安装 GCC 在 U
  • 如何在 Debian 9 上安装和使用 FFmpeg

    FFmpeg 是一个免费的开源命令行工具 用于对多媒体文件进行转码 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率以
  • 如何在 Ubuntu 18.04 上安装 Python 3.7

    Python 是世界上最流行的编程语言之一 凭借其简单易学的语法 Python 是初学者和经验丰富的开发人员的绝佳选择 Python 是一种非常通用的编程语言 它可以用作脚本语言来构建游戏 开发网站 创建机器学习算法和分析数据 Python
  • 如何在 CentOS 7 上安装 VLC 媒体播放器

    VLC 是一种流行的开源多媒体播放器和流媒体服务器 它是跨平台的 几乎可以播放所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本教程介绍如何在 CentOS 7 上安装 VLC 媒体播放器 先决条件 您需要以以下身份登录具有 s
  • 如何在 Ubuntu 20.04 上安装和使用 FFmpeg

    FFmpeg 是一个用于处理多媒体文件的免费开源工具集合 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率 捕获流音频
  • Linux 睡眠命令(暂停 Bash 脚本)

    sleep是一个命令行实用程序 允许您将调用进程挂起指定的时间 换句话说 sleep命令将下一个命令的执行暂停给定的秒数 The sleep该命令在 bash shell 脚本中使用时非常有用 例如 在重试失败的操作或在循环内时 在本教程中
  • 如何在 Ubuntu 18.04 上安装 CouchDB

    CouchDB 是由 Apache 软件基金会维护的免费开源容错 NoSQL 数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布尔值等 它包
  • 如何在 Debian 10 上安装 Xrdp 服务器(远程桌面)

    Xrdp 是 Microsoft 远程桌面协议 RDP 的开源实现 允许您以图形方式控制远程系统 使用 RDP 您可以登录到远程计算机并创建真实的桌面会话 就像登录到本地计算机一样 本教程介绍如何在 Debian 10 Linux 上安装和
  • 如何使用SFTP命令传输文件

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密的 SSH 传输访问 管理和传输文件 与传统的相比FTPSFTP 提供 FTP 的所有功能 但更安全且更易于配置 Unlike SCPSFTP 仅支持文件传输 但允许您对远程文
  • 15+ yum update 命令示例

    Yum 是 Red Hat CentOS 和其他操作系统上使用的包管理器Linux 发行版使用 RPM 包管理器 Yum 用于安装 更新 删除或以其他方式操作这些 Linux 系统上安装的软件包 在本教程中 我们将介绍 yum update
  • Seaborn barplot 教程(以条形图可视化您的数据)

    数据可视化已成为与分析数据进行交流的重要阶段 通过数据可视化 数据科学家和业务分析师可以轻松地从大量数据中提取见解 Seaborn 是一种 Python 中的统计图形绘图和可视化库 允许数据分析师和数据科学专业人员呈现可视化 在本文中 我们
  • 15 个 Linux 读取命令示例

    The readLinux 中的命令允许您从标准输入或文件中读取输入 它允许您接收数据并将其分配给变量 本教程将指导您完成不同的选项read命令 目录 hide 1 读取用户的输入 2 从文件中读取输入 3 指定分隔符
  • 创建和使用动态 Laravel 子域路由

    许多网站为用户的个人资料或页面提供了一个自定义子域 因此用户可以通过 http username website com 访问他的个人资料 这要好得多 在这篇文章中 我们将了解如何高效地进行动态 Laravel 子域路由 配置DNS 要做到
  • 使用 Pandas read_html 函数读取 HTML 表格

    您可以使用read html直接从网站抓取 HTML 表格并将其转换为数据框 它简化了从网页提取数据的过程 The read html函数接受一个包含 URL 或指向 HTML 文件的文件路径的字符串 提取该 HTML 页面中包含的所有表
  • Python SQLite3教程(数据库编程)

    在本教程中 我们将使用 Python 以编程方式使用 SQLite3 数据库 一般来说 SQLite 是一种无服务器数据库 您可以在包括 Python 在内的几乎所有编程语言中使用它 无服务器意味着无需安装单独的服务器即可使用 SQLite
  • Linux iptables 防火墙简化示例

    在上一篇文章中 我们讨论了如何使用强化最佳实践保护 Linux 服务器 有人问我防火墙部分 里面简单介绍了iptables防火墙 今天我们就来详细讨论一下Linux iptables 防火墙以及如何使用出色的防火墙来保护您的服务器流量 目录