iptables 规则不适用于 AWS NLB 和 Elastic IP,但可以使用 EC2 实例公共 IP

iptables 规则不适用于 AWS NLB 和 Elastic IP,但可以使用 EC2 实例公共 IP

我有点不知所措。

首先介绍一些背景信息:我有一个 AWS EC2 实例,位于 NLB 后面。NLB 使用的是弹性 IP。EC2 实例正在运行 DNS 服务器,并监听 UDP 和 TCP 53。NLB 针对 TCP 和 UDP 端口 53 进行设置。该实例位于目标组中,在 NLB 看来运行正常(并按预期处理请求)。

我正在尝试解决的问题:我想确保删除所有针对记录类型的 DNS 查询ANY(以及速率限制和过滤的一些其他规则),因此我添加了以下iptables规则:

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 40 -j DROP

$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 52 -j DROP

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 40 -j LOG \
    --log-prefix "BLOCKED ANY: "

$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
    --hex-string "|0000FF0001|" --algo bm --from 52 -j LOG \
    --log-prefix "BLOCKED ANY: "

现在的问题是...

如果我尝试,dig some.domain -t any @public.ip.of.instance我的查询会被阻止,并且我会看到预期的日志条目/var/log/kern.log

如果我尝试,dig some.domain -t any @elastic.ip.on.nlb请求不会被阻止,并且我会得到响应。没有日志条目kern.log

对我来说最奇怪的是,我尝试将 NLB 从图片中移除,并直接将相同的弹性 IP 分配给实例。结果相同 -即使存在上述规则ANY,发送到的查询也不会被丢弃。从使用私有 IP 而不是从发送的另一个实例发送的相同查询按预期被丢弃。EIPiptablesANYEIP

nat我在(也使用PREROUTING链)和filter(使用链)表中尝试了相同的规则。我的规则INPUT中是否遗漏了一些明显的内容?iptables

还有其他想法吗?

答案1

环顾 ServerFault 我找到了这个答案 -iptables 根据十六进制字符串匹配丢弃数据包显示十六进制值之间的空格,我建议尝试一下:

该问题的示例:

$ iptables --append INPUT --match string --algo kmp \
    --hex-string '|f4 6d 04 25 b2 02 00 0a|' --jump ACCEPT

因此,请像这样改变你的例子:

$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
    --hex-string "|00 00 FF 00 01|" --algo bm --from 40 -j DROP

答案2

好的,之后许多经过数小时的故障排除,看起来简短的答案是它一直在工作......

我在 NLB 后面的 EC2 实例上运行了 tcpdump ( tcpdump udp port 53 -X -nn)。然后从我的 Macbook (Catalina 10.15.2) 上运行dig some.domain -t any @elastic.ip.on.nlb,不仅得到了响应,而且查询甚至从未出现在 EC2 实例上的数据包捕获中。只有一个 EC2 实例位于 NLB 后面,使用我在 dig 查询中使用的弹性 IP。彻底感到奇怪了,然后我在 Ubuntu 机器和 Windows 10 计算机上运行了相同的 dig 命令。这两个查询都超时了(由 iptables 正确过滤),我在 tcpdump 中看到了它们,并且日志消息按预期位于 /var/log/kern.log 中。我回到我的 Macbook 运行相同的 dig 命令,它仍然返回答案,而 tcpdump 中什么都没有......wtf!

我重启了 Macbook,检查了无数次我使用的 IP 是否正确,是否使用了相同的查询,尝试了不同的域名,可能还尝试了上百种其他方法。我完全搞不懂为什么我的 Macbook 的数据包捕获中似乎没有任何内容。

所以最终这似乎是一个奇怪的孤立问题(可能是 Apple 的某些缺陷......),而不是像我最初认为的那样,AWS 进行了一些奇怪的数据包破坏或 iptables 规则被破坏。所以真正的答案是:在发布到 StackExchange 之前,先在多台机器上试用一下。

编辑:澄清一下。如果我使用实例的公共 IP 而不是 EIP,我确实会在 Macbook 的 tcpdump 中看到查询(并且它会按预期超时)。只有使用 EIP 时我才看不到查询,并且它会返回响应...

另外,我不确定这是否应该是一个回答帖,或者我是否应该只是修改我的初始帖子。Mods 可以随意处理它!

相关内容