为什么我的 ACL 需要这样配置才能授予我想要的访问权限?

为什么我的 ACL 需要这样配置才能授予我想要的访问权限?

我的 ER605 路由器有一个辅助网络,用于隔离连接的设备 Raspberry Pi。我使用它来隔离和扫描来自可疑来源(例如我岳父岳母的电脑一直受到恶意软件的感染)的传入文件。我需要能够访问 Raspberry Pi 并将扫描的文件泄露到我的主网络。我计划使用 VNC 进行访问,并通过 SMB 共享将已确认的文件直接放在我的 QNAP NAS 上。

ACL 规则 5 阻止从隔离网络到我的主网络的通信。为了将 VNC 从我的主网络传输到我的隔离 pi,我最初添加了规则 4,但这还不够(在线阅读建议我需要一个用于返回消息的 ACL),所以我添加了引用 VNC 服务的规则 3 的版本,但仍然失败了。一时兴起,我尝试创建 VNC_duplex 服务定义,该定义交换源端口和目标端口,并将规则 #3 从 VNC 服务更改为 VNC 双工,然后 Viola VNC 就成功了!

我很高兴它能正常工作,但我不确定为什么,或者它是否安全。我是否正确理解了 ACL 规则 3 允许恶意脚本从 Raspberry Pi 上的任何端口向我主网络上任何设备的端口 5900 发送消息?理解这一点的语义方式是什么,它可以变得更安全吗?

我的网络和 VLAN:

在此处输入图片描述

在此处输入图片描述

我还设置了一些 IP 范围来描述我想要细分/授予访问权限的网络区域:

在此处输入图片描述

在此处输入图片描述

我的服务类型(最后四个是我自定义输入的):

在此处输入图片描述

最后是我的 ACL:

在此处输入图片描述

答案1

在线阅读建议我需要一个用于返回消息的 ACL),因此我添加了引用 VNC 服务的规则 3 版本,但仍然失败。一时兴起,我尝试创建 VNC_duplex 服务定义,该定义交换源端口和目标端口,并将规则 #3 从 VNC 服务更改为 VNC 双工,然后 Viola VNC 就成功了!

当 Pi 向你的计算机发送回复时,Pi 是源头。

“返回”数据包不仅具有 Pi 的 IP 地址作为“源 IP”,还具有相应的端口号在 Pi 方面作为“源端口”。

Connection:        192.168.0.PC:54321 <--> 192.168.2.10:5900

Packets from PC:   src = 192.168.0.PC:54321, dst = 192.168.2.10:5900
Packets from Pi:   src = 192.168.2.10:5900, dst = 192.168.0.PC:54321

防火墙中的所有原始服务模板仅针对“转发”方向定义;例如,“VNC”模板将 5900 匹配为目标端口 - 如上所述,它仅匹配以 VNC 服务器为目的地的数据包,而不匹配“返回”数据包。

我是否正确理解了 ACL 规则 3 允许恶意脚本从 Raspberry Pi 上的任何端口向我的主要网络上的任何设备上的端口 5900 发送消息?

不。它允许的是相反的——它允许脚本发送消息从端口 5900在树莓派上到任何港口在您的主网络上。(“源端口”中的“源”= 5900真正意思数据包的来源。

由于连接的源端口可以任意选择(如果需要),这意味着主网络对任何人开放知道关于这个异常的存在;他们需要做的就是要求操作系统将连接绑定到本地端口 5900。(但另一方面,由于源端口通常是随机的,而且范围远远超出 5900,因此任何没有知道这个异常就不太可能偶然发现它。)

从语义上理解这一点是什么?

“来源”实际上是指个人的来源,而不是整个连接。(实际上,端口几乎可以被视为数据包的“传输层”地址的一部分,实际上在其他几个非 IP 协议中,它确实是地址的一部分。)

每个端口都与一个特定的端点相关联,就像每个 IP 地址都与一个特定的端点相关联一样 - 如果您连接到 Pi,您不会期望来自 Pi 的“返回”数据包仍会显示 Pi 的 IP 地址作为“目的地”,端口号也是如此。

并且可以使其更加安全吗?

通常的方法是完全避免这种反射 ACL,并使用有状态的防火墙。大多数路由器都能够跟踪活动连接(“状态”或“流量”)——它们有点像必须如果他们实现了典型的 1:多 NAT,则这样做 - 并且防火墙过滤器可能有一个特殊规则,允许任何对应于“已建立”连接的数据包(如在 iptables/nftables 中),或隐式允许此类数据包(如在 pf 中)。

ER603 似乎获得了对状态 ACL 的支持在固件 2.1 中(不过人们似乎说它不起作用。)

如果你必须使用无状态 ACL,那么替代方法是仅允许具有TCP“ACK”标志设置。TCP 连接的初始数据包绝不已设置此标志,而所有其他数据包也都设置了此标志;只需一条规则允许任何端口上的 TCP ACK 数据包即可。

当然,这种方法只适用于 TCP ——如果没有状态跟踪,你就无法对 UDP 做很多事情,只能希望没有人发现你的反射 ACL 造成的漏洞。

您还应该有另一条规则允许 ICMP“返回”数据包(例如 Echo Reply 和各种 ICMP“错误”消息 –至少需要允许“需要分片”,但最好也允许其他错误,如“无法到达”)。

相关内容