在桥接模式下,无法从 KVM apache 网站获取 php 中的原始/请求 IP 地址

在桥接模式下,无法从 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 可以连接,内部 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

答案1

删除 -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

虽然我怀疑这仍然可能是错误的,它可能会将所有流量路由到桥接器,然后再到达我的主电脑,所以我插入了docker容器作为中间人,因为我列出的端口通常都是用于我的主电脑而不是虚拟机,不管怎样,它现在运行得足够好

感谢您的帮助

相关内容