Iptables

使用 iptables 從 NAT 後面的 localhost 到達 apache 公共反向代理虛擬主機 url

  • May 12, 2022

我遇到了一個在執行 iptables 防火牆的伺服器後面使用 virsh 的來賓問題。這位客人託管網站,最重要的是使用反向代理。

一切運作良好。然後我線上安裝了collabora 1https ://www.collaboraoffice.com/code/ 。打開文件超級酷,他們有一個最重要的外掛

我從一個遠端伺服器上測試了這個外掛,它也執行著mattermost,它可以連接到我的iptables後面的這個本地盒子,它工作得很好。但是,當我從來賓本地伺服器本身測試這個外掛時,在 iptables 後面,所以 NAT 基本上,它找不到自己。我超時了。

所以,我在 iptables 後面的客人,通過適當的規則設置來傳遞流量,擁有 mattermost 和 CollaboraOnline,但是如果我將公共 URL 從 mattermost 指向來獲取 CollaboraOnline,兩個 localhost 他們都找不到彼此。我不能在外掛中做 localhost:9980 或 127.0.0.1:9980 (這是 CollaboraOnline 所在的位置),它不喜歡地址中的埠……

如果我 curl https://CollaboraOnline.domain.ca我可以看到它超時。

如果我在 localhost 伺服器上編輯 /etc/hosts 文件127.0.0.1 CollaboraOnline.domain.ca,然後 curl 工作,mattermost-plugin 確實找到 CollaboraOnline,但它仍然無法工作,因為我最終遇到了這樣的 SSL 類型驗證錯誤。

AH02032:通過 SNI 提供的主機名和通過 HTTP 提供的主機名沒有兼容的 SSL 設置如何繞過

所以現在我已經沒有什麼好主意了。我有另一個不在 virsh 後面的帶有 iptables 的公共盒子,如果我捲曲到它的一個本地主機,一切都很好。這只會讓我相信 iptables 可能需要一個規則來讓我的客人執行mattermost 和 CollaboraOnline 以便在請求它自己服務的公共 URL 時能夠循環回到自己?!?

有人對此有任何想法嗎?

我的來賓 VM 是 192.168.122.126,我託管 Vrish 來賓和 iptables 的父伺服器是 192.168.122.1

這是 iptables 規則(刪除了一些雜亂無章的東西,比如 fail2ban 的東西)

iptables -L
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.126      state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
iptables -L -t nat 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:9980 to:192.168.122.126:9980
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:12000 to:192.168.122.126:12000
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:11000 to:192.168.122.126:11000
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:submission to:192.168.122.126:587
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:imap2 to:192.168.122.126:143
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:smtp to:192.168.122.126:25
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:webmin to:192.168.122.126:10000
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:4443 to:192.168.122.126:4443
DNAT       udp  --  anywhere             148.59.149.79        udp dpt:10000 to:192.168.122.126:10000
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:http to:192.168.122.126:80
DNAT       tcp  --  anywhere             148.59.149.79        tcp dpt:https to:192.168.122.126:443

這裡的罪魁禍首是錯誤/不完整的 NAT 規則。在 TCP 連接期間,每個端點都有固定的源/目標 IP,如果在此埠上接收到具有不同源/目標 IP 的 IP 數據包,則該數據包將被丟棄。這對於兩個端點都是如此:客戶端( curl )和伺服器。

為了理解這個問題,我將從客戶端開始跟踪數據包流:

  • 來自 VM 內部的 curl 將數據包發送到公共 IP 地址。源IP:192.168.122.126,目的IP:148.59.149.79
  • VM的核心檢查它的路由表,並將ip數據包發送到它的預設網關,即192.168.122.1
  • 主機的核心接收數據包並將其通過 iptables 鏈(請記住首先遍歷哪個鏈 - PREROUTING 在 POSTROUTING 之前)
  • 在 PREROUTING 鏈中,目標 IP 被替換為 192.168.122.126
  • 在這裡,將遍歷 POSTROUTING 鏈。
  • 由於目標 IP,數據包會返回到 VM
  • 在伺服器套接字處,IP 數據包到達。目標和源 IP 是 192.168.122.126。到目前為止沒有問題。
  • 伺服器套接字發送回复 - 這一次,由於目標 IP 是它自己的介面,主機的 NAT 規則將不會被應用。
  • 客戶端套接字接收來自 192.168.122.126 的回复 - 這不是客戶端套接字已向其發送連接請求的 IP,因此數據包被丟棄。

解決方案是以某種方式更改源 IP 地址,即來自 VM 的伺服器套接字的回复必須通過主機 NAT 規則:

iptables -t nat -I POSTROUTING 1 -s 192.168.122.126 -d 192.168.122.126 -j SNAT --to-source 192.168.122.1

請記住,SNAT 目標僅適用於 POSTROUTING 鏈內部 - 因此,來自 PREROUTING 鏈的 DNAT 已經被應用。

使用此規則,VM 內的伺服器套接字接收來自 192.168.122.1 的傳入連接請求 - 發送回复,回復將獲得反向應用的 SNAT / DNAT 規則,一旦它到達主機:源到 192.168。 122.126,目的地為 148.59.149.79。

此回復與初始連接請求匹配,連接嘗試成功。

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