这是一个关于理解和调试 Linux 系统上的软件防火墙的 规范 问题。
为了回应 EEAA 的回答和 @Shog 的评论,我们需要一个合适的规范问答来结束关于 iptables 的常见相对简单的问题。
什么是调试 Linux 软件防火墙问题的结构化方法,netfilter数据包过滤框架,通常被用户空间接口iptables所指?
什么是常见的陷阱、反复出现的问题以及简单或稍微模糊的事情,以检查偶尔的防火墙管理员可能会忽略或以其他方式受益于了解?
即使您使用UFW、FirewallD (aka firewall-cmd
)、Shorewall或类似工具,您也可能会受益于在没有这些工具提供的抽象层的情况下查看引擎盖。
这个问题不打算作为构建防火墙的方法:检查产品文档,例如为iptables Trips & Tricks提供食谱或搜索标记的iptables ufw firewalld firewall-cmd问题以获取现有的常见且广受好评的高分问答。
一般来说:
查看和修改防火墙配置需要管理员权限 (
root
),在受限端口号范围内打开服务也是如此。这意味着您应该以 root 身份登录root
或使用sudo
以 root 身份运行命令。我会尝试用可选的[sudo]
.内容:
-I
订单事项或和之间的区别-A
iptables -L -v -n
-I
1. 订单事项或和之间的区别-A
要记住的是防火墙规则是按照它们列出的顺序进行检查的。当触发允许或禁止数据包或连接的规则时,内核将停止处理链。
我认为 新手防火墙管理员最常见的错误是他们按照正确的说明打开新端口,例如以下:
然后发现它不会生效。
原因是该
-A
选项在所有现有规则之后添加了该新规则, 并且由于现有防火墙中的最终规则通常是阻止所有未明确允许的流量的规则,从而导致或 iptables-save 中的等价物:
并且永远不会达到打开 TCP 端口 8080 的新规则。(正如顽固地保持在 0 个数据包和 0 个字节的计数器所证明的那样)。
通过插入带有
-I
新规则的规则将是链中的第一个并且将起作用。2.显示当前防火墙配置
我对防火墙管理员的建议是查看 Linux 内核运行的实际配置,而不是尝试通过用户友好的工具诊断防火墙问题。通常,一旦您了解了潜在问题,您就可以在这些工具支持的问题中轻松解决它们。
命令
[sudo] iptables -L -v -n
是你的朋友(虽然有些人iptables-save
更喜欢)。--line-numbers
通常在讨论配置时,使用该选项以及编号行很有用。参考规则#X 使讨论它们变得更容易一些。注意: NAT 规则包含在
iptables-save
输出中,但必须通过添加选项单独列出,-t nat
即[sudo] iptables -L -v -n -t nat --line-numbers
.多次运行该命令并检查递增计数器可能是查看新规则是否实际触发的有用工具。
或者,输出
iptables-save
给出了一个可以重新生成上述防火墙配置的脚本:这是一个偏好问题,您会发现更容易理解。
3. 解释输出
iptables -L -v -n
当没有明确的规则匹配时,策略设置链使用的默认操作。在
INPUT
设置为接受所有流量的链中。INPUT 链中的第一条规则立即成为一个有趣的规则,它将所有流量(源 0.0.0.0/0 和目标 0.0.0.0/0)发送到 TCP 端口 22 (
tcp dpt:22
) SSH 的默认端口到自定义目标 (fail2ban-SSH
) . 顾名思义,此规则由 fail2ban(一种安全产品,除其他外扫描系统日志文件以查找可能的滥用行为并阻止滥用者的 IP 地址)维护。该规则将由类似于
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
或在 iptables-save as 的输出中找到的 iptables 命令行创建-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
。通常你会在文档中找到这些符号中的任何一个。计数器指示此规则已匹配 784'000 个数据包和 65 兆字节的数据。
然后,与第一条规则匹配的流量由
fail2ban-SSH
链处理,作为非标准链,列在 OUTPUT 链下方。该链包含两条规则,一条针对每个被阻止(带有 )的滥用者(源 IP 地址 117.253.221.166 或 58.218.211.166
reject-with icm-port-unreachable
)。不是来自那些被阻止主机的 SSH 数据包既不允许也不允许,现在自定义链已完成,将根据 INPUT 链中的第二条规则进行检查。
所有不是发往端口 22 的数据包都通过了 INPUT 链中的第一条规则,并且也将在 INPUT 规则 #2 中进行评估。
INPUT 规则编号 2 意味着这是一个有状态的防火墙,它跟踪连接。这有一些优点,只有新连接的数据包需要根据完整的规则集进行检查,但是一旦允许,属于已建立或相关连接的其他数据包将被接受,而无需进一步检查。
输入规则 #2 匹配所有打开的和相关的连接,匹配该规则的数据包不需要进一步评估。
注意:状态防火墙配置中的规则更改只会影响新连接,不会影响已建立的连接。
相反,一个简单的数据包过滤器根据完整的规则集测试每个数据包,而不跟踪连接状态。在这样的防火墙中,不会使用状态关键字。
INPUT 规则#3 很无聊,所有连接到环回(
lo
或 127.0.0.1)接口的流量都是允许的。INPUT 规则 4、5 和 6 用于通过授予对新连接的访问权限来打开 TCP 端口 22、80 和 443(分别为 SSH、HTTP 和 HTTPS 的默认端口)(现有连接已被 INPUT 规则 2 允许)。
在无状态防火墙中,这些规则会在没有状态属性的情况下出现:
或者
最后的 INPUT 规则 #7 是阻止在 INPUT 规则 1-7 中未授予访问权限的所有流量的规则。一个相当普遍的约定:所有不允许的都被拒绝。理论上,可以通过将默认 POLICY 设置为 REJECT 来省略此规则。
始终调查整个链条。
4.了解你的环境
4.1 . 软件防火墙中的设置不会影响网络中其他地方维护的安全设置,即尽管使用
iptables
路由器上未修改的访问控制列表打开网络服务或网络中的其他防火墙可能仍会阻止流量...4.2 . 当没有服务正在侦听时,无论防火墙设置如何,您都将无法连接并收到连接被拒绝错误。所以:
[sudo] netstat -plnut
或者使用ss -tnlp
.[sudo] nc -l -p 123
或者openssl s_server -accept 1234 [options]
如果您需要一个 TLS/SSL 侦听器(检查man s_server
选项)。telnet <IP of Server> 123
或echo "Hello" | nc <IP of Server> 123
在测试 TLS/SSL 安全服务openssl s_client -connect <IP of Server>:1234
时,然后再从远程主机尝试相同的操作。4.3 . 了解您的服务使用的协议。您无法正确启用/禁用您不太了解的服务。例如:
/etc/services
不一定与使用端口的实际服务相匹配。4.4 . 内核数据包过滤器并不是唯一可能限制网络连接的东西:
getenforce
将确认 SELinux 是否正在运行。ldd /path/to/service |grep libwrap
和/hosts.[allow|deny]
控制文件。5.
INPUT
或FORWARD
链条这里更彻底地解释了链的概念,但它的短处是:
该
INPUT
链是您在发出 iptables 命令的主机上为本地运行的服务打开和/或关闭网络端口的地方。当
FORWARD
您的 Linux 机器充当网桥、路由器、管理程序和/或网络地址时,您可以应用规则来过滤由内核转发到其他系统、实际系统以及 Docker 容器和虚拟客户服务器服务器的流量翻译和端口转发。一个常见的误解是,由于 docker 容器或 KVM 来宾在本地运行,因此应用的过滤规则应该在 INPUT 链中,但通常情况并非如此。
6.内核模块
由于包过滤器在 Linux 内核中运行,它也可以编译为动态模块,实际上是多个模块。大多数发行版都包含 netfilter 作为模块,所需的 netfilter 模块将根据需要加载到内核中,但对于某些模块,防火墙管理员需要手动确保它们被加载。这主要涉及连接跟踪模块,例如
nf_conntrack_ftp
可以加载insmod
.当前加载到运行内核中的模块可以用
lsmod
.确保模块在重新启动后持续加载的方法取决于 Linux 发行版。
iptables/防火墙“介绍”
防火墙基本上是基于策略的网络过滤器。Linux 防火墙是围绕 Netfilter 构建的;内核的网络数据包处理框架,它由几个执行特定任务的内核模块组成:
用户使用命令行中的 iptables 配置 Netfilter 框架以满足他们的防火墙需求。通过 iptables,我们定义了一些规则,这些规则指示内核在 IP 数据包到达、通过或离开我们的 Linux 机器时如何处理它们。每个 Netfilter 主进程都由 iptables 术语上的 TABLE (FILTER, NAT, MANGLE) 表示。它们在网络数据包流图中有几个特定的挂钩点,内核调用它们来执行它们的职责。某些特定位置的 TABLE 调用序列通常称为内置链,接收名称为 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。如果我们将 TABLE 与“进程类型”相关联,将 CHAIN 与调用这些进程实例的网络数据包流映射上的“位置”相关联,则很容易记住。
由于 IP 数据包是在网络接口上接收的,或者由本地进程创建的,因此在最终交付或丢弃之前,Netfilter 引擎将顺序测试并应用包含在网络数据包流映射中的规则。在由 TABLE@CHAIN 对标识的每个块上,用户可以添加一个或多个这些连续规则,其中包含 IP 数据包匹配标准和相应的操作过程。有一些动作(即 ACCEPT、DROP 等)可以由多个 TABLE 执行,而其他动作(即 SNAT、DNAT 等)是特定于 TABLE 的。
即,当 IP 数据包从网络接口到达时,它首先由 PREROUTING 链处理,调用 MANGLE 表用户定义的规则(如果有)。如果没有与当前数据包匹配的规则,则应用相应的 MANGLE@PREROUTING 默认操作过程或“策略”。此时,如果数据包没有被丢弃,则该过程现在将继续调用 PREROUTING 链上的 NAT 表的规则(参见地图),依此类推。为了方便规则布局,用户还可以创建自己的自定义链,并根据自己的意愿从地图的不同点“跳”进去。
虽然内置链可以具有用户定义的 ACCEPT 或 DROP 数据包策略,但用户定义的链始终具有不可更改的默认策略 RETURN 给调用者以继续该过程。
iptables 命令
iptables 主要命令使用所需的处理规则填充网络数据包流映射。
通用的 iptables 规则可以写成:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
可以这样读:
iptables辅助命令完成场景设置默认条件、列表规则、刷新规则等。
iptables 在运行时将我们的命令加载到 Netfilter 引擎中,Netfilter 立即强制执行加载的规则和设置,但它们不是持久的。重新启动后,所有以前加载的 Netfilter 规则和设置都将丢失。出于这个原因,有一些 iptables 实用程序允许将当前活动的规则集保存到文件中并在以后重新加载它。
iptables 总结
Netfilter 是一个非常灵活和强大的框架,但它是有代价的;iptables 很复杂。从用户的角度来看,某些术语,如 TABLE、CHAIN、TARGET 与它们所代表的概念并没有真正匹配,并且起初没有多大意义。话题很长,命令似乎有无穷无尽的参数列表。更糟糕的是,没有一本真正掌握 Iptables 的书。它们主要分为两类:“食谱书”或“手册页”。我认为这个介绍为您提供了 Netfilter/Iptables 环境的快照以及必要剂量的预先消化的联机帮助页内容。如果您是 iptables 的新手,在阅读这些段落几次之后,您将准备好阅读 iptables 示例。通过一些练习,您很快就会发现自己正在编写自己的规则。
防火墙
防火墙主要用于根据一组规则动态地允许或拒绝网络流量。至此,很容易理解为什么 Linux Netfilter/Iptables 框架非常适合防火墙构建。查看网络数据包流图,我们在 INPUT 和 FORWARD 链的 FILTER 表上发现了两个特别有趣的点;我们可以根据 IP 源地址、IP 协议 (UDP/TCP)、目标端口(80、21、443 等)等来决定是否接受、拒绝或只是丢弃特定的 IP 数据包。这是防火墙在 80% 的情况下所做的,即保护 Web 服务器免受未经授权的网络请求。另外 20% 的时间是在操纵(NAT、MANGLE)网络数据包。
防火墙方案
有数百种不同的防火墙布局可以满足不同的需求,但其中 3 种可以被认为是最典型的防火墙场景。
我写了这个: http ://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
不同协议的常见问题
DNS:默认情况下,DNS 使用端口 53 UDP,但不适合单个 UDP 数据报的消息将使用 TCP 传输(通常是区域传输等),当您运行名称服务器时,还需要打开端口 53 TCP .
电子邮件:许多消费者 ISP 阻止 SMTP 流量(或至少默认端口 TCP 25),使其无法直接接收或发送电子邮件,他们的客户被迫使用 ISP 的 SMTP 中继来处理所有传出电子邮件,有时也用于传入电子邮件. 涉及§1.1。
FTP:就使用两个连接而言,FTP 是一种奇怪的协议。第一个是控制连接,默认情况下,FTP 服务器将侦听 TCP 端口 21。控制连接用于认证和发布命令。实际的文件传输和诸如目录列表的输出之类的东西通过第二个 TCP 连接,即 DATA 连接. 在活动 FTP 中,DATA 连接将从 FTP 服务器从 TCP 端口 20 启动并连接到 FTP 客户端。主动 FTP 在防火墙和 NAT 网关后面的用户不能很好地工作,因此它大多已被废弃。大多数 FTP 服务器都支持被动 FTP。使用被动 FTP,FTP 服务器会在第二个端口上为 DATA 连接打开一个侦听器,然后 FTP 客户端可以连接到该端口。防火墙的问题在于 DATA 端口可以是 1024-65536 之间的任何可用的非特权端口。
在无状态防火墙中,通常通过限制 FTP 服务器可以分配的被动端口数量然后显式打开这些端口来解决。IE
在有状态防火墙中,您不需要显式打开 DATA 端口,netfilter 帮助程序模块将识别分配的动态端口,并通过将 DATA 连接标记为
RELATED
匹配通用规则来为正确的客户端动态打开该端口:这需要加载正确的内核模块,在 FTP 情况下,通过手动运行 instance
insmod nf_conntrack_ftp
,使持久性依赖于重新启动依赖于发行版。注意:当 FTP 与 SSL 一起使用时,FTP 连接跟踪模块将失败,因为控制连接将被加密,并且 nf_conntrack_ftp 将无法再读取 PASV 响应。
NFS和类似的RPC 服务:RPC 服务的问题在于它们不使用特定的固定端口。他们可以随机选择任何可用端口,然后将其注册到 RPC Portmap 守护进程。尝试连接的客户端将查询 Portmap 守护程序,然后直接连接到正确的端口。这解决了保留端口用完的问题......
从防火墙的角度来看,需要打开 TCP/UDP 端口 111 以及 RPC 服务当前使用的实际端口。在防火墙中打开这种随机端口的问题通常通过限制 RPC 服务(例如 NFS 服务器)使用预定义的固定端口来解决。