我的 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“错误”消息 –至少需要允许“需要分片”,但最好也允许其他错误,如“无法到达”)。