Debian

儘管規則明確允許,但無法從公共網路訪問 UFW 埠

  • January 6, 2022

我有兩個專用伺服器:“web”(YYY.YYY.YYY.YYY)和“monitor”(XXX.XXX.XXX.XXX)。兩者都在一個大眾主機(hetzner)的同一個網路中。

現在在“網路”上,我執行了 3 個普羅米修斯指標端點:裸機主機上的 docker-engine (9323) 和 neo4j (2004)、telegraf (9273) 作為 docker 容器。兩個 docker 容器都將其輸出埠正確映射到主機,因此在“web”上執行的以下呼叫有效:

lynx http://YYY.YYY.YYY.YYY:9323/metrics => OK
lynx http://YYY.YYY.YYY.YYY:9273/metrics => OK
lynx http://YYY.YYY.YYY.YYY:2004/metrics => OK

但是從“監視器”伺服器呼叫這些端點僅適用於熊金屬服務 docker-engine (9323)

lynx http://YYY.YYY.YYY.YYY:9323/metrics => OK
lynx http://YYY.YYY.YYY.YYY:9273/metrics => timeout
lynx http://YYY.YYY.YYY.YYY:2004/metrics => timeout

UFW 狀態詳細資訊提供以下內容

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
[...]
9323/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
9273/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
2004/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
[...]

這些 IP 沒有其他規則,也沒有適用於子網、介面等的一般規則。所有其他規則都適用於離散埠,例如 22、80、443 等。

奇怪的是,它在幾個小時前就起作用了。與此同時,我在這裡對此進行了一些試驗https://medium.com/@pitapun_44686/what-is-the-best-practice-of-docker-ufw-under-ubuntu-69e11c826b31並將以下塊附加到/etc/ufw/after.rules 的最後

*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
COMMIT

現在我將其註釋掉並重新啟動了ufw。那些埠 9273 和 2004 仍然無法訪問,所以這不是原因。

我將 ufw 日誌級別配置為高,但我看不到任何連接 attepmtps 或從主機 XXX.XXX.XXX.XXX 丟棄的數據包。

嘗試 telnet 進入一個工作埠(telnet YYY.YYY.YYY.YYY 9323)我可以在 ufw 日誌中看到通信,但對於其他兩個埠則看不到。

[UFW AUDIT] SRC=XXX.XXX.XXX.XXX DST=YYY.YYY.YYY.YYY DPT=9323 =>
[UFW AUDIT] SRC=YYY.YYY.YYY.YYY DST=XXX.XXX.XXX.XXX SPT=9323

我使用 ansible “ufw” 模組配置了 ufw。

還有什麼其他原因?到底是怎麼回事?:-)

由於“可疑”活動(頻繁通信),主機網路是否會在這些伺服器之間施加某種過濾器?也發生了,我今天在 YYY.YYY.YYY.YYY 上從 XXX.XXX.XXX.XXX 到埠 80/443 執行了一些過多的 artillery.io 測試,但是這個假設並不能解釋為什麼只有這兩個埠不起作用了。

最終測試,在 YYY.YYY.YYY.YYY 上關閉 ufw 也沒有幫助。埠 9273 和 2004 不可訪問,9323 可訪問。

這是iptables -L -v -n https://pastebin.com/HWeJGXb9的輸出

由於 Docker 暴露了 9273 和 2004 埠,因此到這些埠的數據包先通過FORWARD鏈,然後再通過DOCKER-USER鏈。您添加的規則DOCKER-USER阻止了大部分到 docker 容器網路的外部流量。您需要允許轉發流量,ufw route allow或者您可以直接將規則添加到DOCKER-USER鏈中。

引用自:https://serverfault.com/questions/1089196