Domain-Name-System

為什麼apache在使用外部域時會記錄內部IP?

  • September 15, 2021

我有一個 Raspberry Pi 正在執行,我們在辦公室使用它來進行我們不希望在主開發伺服器上使用的小型測試項目。它正在執行阿帕奇。DNS 通過 Cloudflare 處理,但在 DNS Only 模式下。目前,我測試時沒有 IP 限制。A 記錄mysite.domain.tld指向我的靜態 IP 地址123.123.123.123,只有一個標準的商業光纖路由器/調製解調器位於 Internet 和 Pi 之間。

例如,當我mysite.domain.tld從沒有 wifi 的手機訪問時,會顯示手機運營商 IP。當我wget來自遠端伺服器時,它的IP 會顯示在日誌中。一切都按預期工作。

但是,當我mysite.domain.tld從 Pi 所在的同一網路中訪問時,apache 會記錄路由器網關 IP 192.168.1.1。我希望看到我的公共 IP 地址,因為我與域名的連接通過 Cloudflare 解析為公共 IP。但相反,我在日誌中看到了本地網路 IP。

沒有任何設置/etc/hosts(我在 macOS 上)和路由器上,只有從埠 443 連接的埠轉發是路由器到同一埠上的 Pi - 關於域名的任何內容都沒有在任何地方引用。當我 pingmysite.domain.tld時,它給了我Cloudflare IP 地址,這是我所期望的。

似乎在鏈條的某個地方,我的 IP 地址和 Pi 的公共 IP 地址匹配,因此它用內部網關 IP 覆蓋 IP。**這裡實際發生了什麼?**我本身不介意,我只是想確保192.168.*在防火牆上設置 IP 限制時,我可以依賴 IP 可以信任的事實。

注意:Cloudflare 不會在此處發送 CF-Connecting-IP 和類似的標頭,我認為僅在不處於僅 DNS 模式時才會發生。似乎只有當使用與 Pi 使用相同的網路連接時。

您的路由器正在執行 Linux,這種行為很容易在任何現有的 Linux 發行版上實現。我可以猜到路由器的防火牆中必須存在哪些規則才能像這樣工作。但請注意,這只是一種推測,我們不知道規則在現實中的具體情況。

當您將埠轉發到您的網路伺服器時,它添加了一個特定的 DNAT 規則,可能如下所示:

iptables -t nat -A PREROUTING -p tcp -d <your-external-address> --dport 443 -j DNAT --to-destination <raspberry-pi-address>

換句話說,這意味著:“在決定這個數據包是發往設備還是必須轉發之前,請檢查數據包的目標地址是否是您的外部地址,目標埠是 443。如果匹配,請將目標地址更改為樹莓派的 LAN地址”。請注意,此規則不按介面過濾。

此外,它肯定有 SNAT 類型的規則(用於為 LAN 提供對網際網路的訪問),可能看起來像這樣:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

換句話說,在路由器決定數據包必須去哪里之後,在發送數據包之前,它會將其源地址更改為出站介面具有的任何地址(如果數據包是從 LAN 發送的)。同樣,介面沒有過濾任何內容。

現在考慮您的 HTTPS 連接。您在瀏覽器中指定主機名,對嗎?您對其進行設置,以便將其解析為路由器的外部地址,該地址成為目標地址。您的源地址在區域網路內。因此,這兩條規則似乎都適用於您的連接數據包。

處理它們,路由器首先遇到 DNAT 規則,檢查目標地址和埠,並決定將目標地址更改為樹莓派的地址。然後它發現數據包必須出去的介面是LAN 1。然後它根據第二條規則檢查部分轉換的數據包,並找出源地址來自 LAN。因此它將數據包的源地址替換為 LAN 介面的地址 192.168.1.1。這就是你的樹莓派看到的。

NAT 操作是有狀態的,即它還維護一個表記錄,該記錄說明哪個被替換為什麼以及如何檢測後續轉發和回複數據包,因此它可以正確轉換所有這些數據包。是的,事實證明 Linux 可以在同一流中同時執行 DNAT 和 SNAT。

你能相信這種行為嗎?我不知道。如果路由器的韌體是開源的,我們有機會檢查一下。沒有來源,我們無法確定。當源關閉時,情況總是如此,這就是為什麼如果您擔心安全性,必須避免使用封閉源產品。

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