
我有點不知所措。
首先是一些背景資訊:我在 NLB 後面有一個 AWS EC2 執行個體。 NLB 使用彈性 IP。 EC2 執行個體正在執行 DNS 伺服器並偵聽 UDP 和 TCP 53。
我試圖解決的問題:我想確保刪除記錄類型的所有 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 執行個體上的資料包擷取中。 NLB 後面只有一個 EC2 實例,使用我在 dig 查詢中使用的彈性 IP。由於徹底感到奇怪,我隨後在 Ubuntu 電腦和 Windows 10 電腦上執行了相同的 dig 命令。這兩個查詢都超時(由 iptables 正確過濾),我在 tcpdump 中看到它們,並且日誌訊息按預期位於 /var/log/kern.log 中。我回到我的 Macbook 上運行相同的 dig 命令,它仍然返回一個答案,但 tcpdump 中什麼都沒有…wtf!
我重新啟動了我的 Macbook,第一百萬次檢查我是否使用了正確的 IP 和相同的查詢,嘗試了不同的網域,以及可能還有一百種其他事情。我完全不明白為什麼這似乎返回了一個回應,但我的 Macbook 捕獲的資料包中沒有任何內容。
所以最終這似乎是一個奇怪的孤立問題(也許是蘋果的一些跛行…),而不是像我最初想像的那樣,AWS 進行了一些奇怪的資料包破壞或破壞了 iptables 規則。所以真正的答案是:在發佈到 StackExchange 之前在多台機器上嘗試一下。
編輯:澄清一下。如果我使用實例的公共 IP 而不是 EIP,我確實會在 Macbook 的 tcpdump 中看到查詢(並且按預期逾時)。只有 EIP 我看不到查詢,它回傳了回應...
另外,我不確定這是否應該是一個答案帖子,或者我是否應該修改我的初始帖子。模組可以隨心所欲地使用它!