Ubuntu

無法以橋接模式從 KVM apache 網站獲取 php 中的源/請求 IP 地址

  • April 23, 2021

我有一個執行在 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 而不是虛擬機,無論它現在是否執行良好

謝謝你的幫助

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