![iptables 规则不适用于 AWS NLB 和 Elastic IP,但可以使用 EC2 实例公共 IP](https://linux22.com/image/747960/iptables%20%E8%A7%84%E5%88%99%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%20AWS%20NLB%20%E5%92%8C%20Elastic%20IP%EF%BC%8C%E4%BD%86%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20EC2%20%E5%AE%9E%E4%BE%8B%E5%85%AC%E5%85%B1%20IP.png)
我有点不知所措。
首先介绍一些背景信息:我有一个 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 而不是从发送的另一个实例发送的相同查询按预期被丢弃。EIP
iptables
ANY
EIP
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 可以随意处理它!