Ubuntu
無法以橋接模式從 KVM apache 網站獲取 php 中的源/請求 IP 地址
我有一個執行在 KVM 上的 ubuntu 18.04 上的 apache 網路伺服器 這個 KVM 在 Linux Mint 20.1 主機作業系統上執行
網路是使用 KVM 中的網橋設置的
<network connections="1"> <name>host-bridge</name> <uuid>some-uuid</uuid> <forward mode="bridge"/> <bridge name="br0"/> </network>
我有防火牆規則將流量從真實網路傳遞到網橋
sudo iptables -I INPUT 1 -i lo -j ACCEPT #Pass to KVM Bridge sudo iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE sudo iptables -A FORWARD -i br0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i virbr0 -o br0 -j ACCEPT sudo iptables -I FORWARD -i br0 -o br0 -j ACCEPT
這一切都在工作,我正在將流量傳送到主機並路由到 kvm 機器,外部 ips 可以連接,內部也可以
不幸的是,我也有一些自定義的 html,可以根據引用者是在本地區域網路還是遠端 ip 上通過 php 改變行為
自從從 VmWare 遷移到 KVM 後,現在一切都源自主機 ip 地址,並且此邏輯不起作用
有沒有辦法維護請求 IP 地址,以便我可以保持相同的行為?
我用 php 檢查 ips
function getUserIpAddress() { $ip = getenv('HTTP_CLIENT_IP')?: getenv('HTTP_X_FORWARDED_FOR')?: getenv('HTTP_X_FORWARDED')?: getenv('HTTP_FORWARDED_FOR')?: getenv('HTTP_FORWARDED')?: getenv('REMOTE_ADDR'); return $ip; }
我已經嘗試輸出以上所有內容,它們都顯示為主機 linux mint 機器本地區域網路 IP
刪除 -j MASQUERADE 解決了這個問題
無需打開盒子即可解除防火牆
我有最後一個防火牆規則
-A INPUT -j DROP
因此,以前未處理的任何內容都將被丟棄,因為這是一台具有多個暴露於網際網路的埠的生產機器
我目前的工作規則的簡要快照是
-A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #Just one example rule -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p udp -m udp --dport 443 -j ACCEPT -A INPUT -j DROP -A FORWARD -i br0 -o br0 -j ACCEPT -A FORWARD -i br0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i virbr0 -o br0 -j ACCEPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
這會丟棄我沒有明確添加的所有數據包,保持虛擬機相對安全的網路,我現在可以再次正確地在 php 中獲取外部 IP
儘管我懷疑這仍然可能是錯誤的,並且它可能會在到達我的主 PC 之前通過網橋路由所有流量,所以我插入了 docker 容器作為中間埠,因為我列出的埠通常都是用於我的主 PC 而不是虛擬機,無論它現在是否執行良好
謝謝你的幫助