我有一个在 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容器作为中间人,因为我列出的端口通常都是用于我的主电脑而不是虚拟机,不管怎样,它现在运行得足够好
感谢您的帮助