如何在 iptables 中添加防火墙规则,以便仅允许特定 SSL 连接的数据包。
我目前根据内容类型允许/拒绝 SSL 数据包,例如,以下规则将阻止所有 TLS 应用程序数据包。它允许其他类型的 SSL 握手/警报数据包通过,但将阻止应用程序数据包。
iptables -I FORWARD 1 -p tcp -m state --state NEW,ESTABLISHED -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFF000000=0x17000000" -j DROP
如果在未来的某个时间点,我希望端点之间进行通信,我该如何只允许单个 ssl 连接发送数据包。
据我所知,目前已采取以下措施:
1.一个tcp连接中只能有一个ssl会话。
2.两个端点之间可以有多个 tcp 连接,因此 src 和 dst ip 地址可以有多个 ssl 连接。
3.我可以获取 ssl 连接的握手值作为唯一标识符。
4.如果会话重新建立,将使用新的 TCP 连接。
我想允许特定于 SSL 连接的数据包。是否可以使用 conntrack/state 模块仅允许单个 TCP 会话的数据包?
答案1
TLS 会话重用是一个包含多个步骤的过程。首先是完整的 TLS 握手,其中服务器可能会向客户端提供会话 ID 和/或会话票证,以便稍后恢复会话。在稍后的 TLS 握手(即新的 TCP 连接)中,客户端可能会在 TLS 握手中提供此会话 ID 或会话令牌。服务器是否同意并且会话是否真正被重用只能通过分析握手中的下一条消息来判断,即它是完整的握手(无恢复)还是不是(成功恢复)。要跟踪所有这些,您需要对 TLS 消息有更详细了解的代码,并且该代码还可以保留多个数据包中的 TCP 状态以外的内容。我怀疑这是否可以通过通常的 iptables 来实现,也就是说,如果没有一些特殊的(可能不存在的)模块,就无法做到这一点。
一般来说,像 iptables 这样的第 3..4 层过滤器(即 IP、TCP、UDP)不是执行第 5..7 层(TLS、HTTP...)过滤的合适工具。虽然在某些情况下它似乎有效,但通常可以通过将数据拆分为多个数据包轻松绕过它,这样像您的示例中那样列入黑名单的数据包将不再与他们分析的单个数据包相匹配。