使用 iptables 從 NAT 後面的 localhost 到達 apache 公共反向代理虛擬主機 url
我遇到了一個在執行 iptables 防火牆的伺服器後面使用 virsh 的來賓問題。這位客人託管網站,最重要的是使用反向代理。
一切運作良好。然後我線上安裝了collabora 1:https ://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。
此回復與初始連接請求匹配,連接嘗試成功。