我有一个运行在 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 解决了这个问题
无需打开盒子即可解除防火墙
我有最后一个防火墙规则
因此,以前未处理的任何内容都将被丢弃,因为这是一台具有多个暴露于互联网的端口的生产机器
我目前的工作规则的简要快照是
这会丢弃我没有明确添加的所有数据包,保持虚拟机相对安全的网络,我现在可以再次正确地在 php 中获取外部 IP
尽管我怀疑这仍然可能是错误的,并且它可能会在到达我的主电脑之前通过网桥路由所有流量,所以我已经插入了 docker 容器作为中间人,因为我列出的端口通常都是用于我的主电脑而不是虚拟机,无论它现在是否运行良好
谢谢你的帮助