更新时间:2023-01-22 15:57:01浏览次数:686+次
最近,我的KVM服务器Linux网桥出现问题,原因是Netfilter阻止了所有到VM的流量和从VM流出的流量。我只能从虚拟机管理程序访问虚拟机。在进一步的故障排除中,我注意到问题出在Netfilter过滤流量上。解决方案是防止桥接流量通过主机的iptables规则。
Netfilter和iptables简介
Netfilter是Linux提供的一个框架,它允许以定制处理程序的形式实现各种与网络相关的操作。iptables是一种广泛使用的防火墙工具,它与内核的netfilter数据包过滤框架交互。
iptables防火墙通过与Linux内核网络堆栈中的数据包过滤挂钩交互来工作。这些内核钩子称为netfilter框架。
禁用KVM网桥上的netfilter
为了防止桥接流量通过主机的iptables规则,需要在/proc/sys/目录中设置内核设置。这可以是运行时更改或持久性更改。
要快速查看/proc/sys/目录中可配置的所有设置,请键入以下命令:
sudo sysctl -a
sysctl命令可以用来代替echo,为/proc/sys/目录中的可写文件分配值。因此,让我们禁用KVM网桥上的netfilter,对于运行时更改,请运行:
echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-arptables
echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-ip6tables
请注意,在重新启动计算机时,/proc/sys/中的这些特殊设置会丢失。要保留自定义设置,请将它们添加到/etc/sysctl.conf文件中:
sudo tee -a /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF
重新加载:
sudo sysctl -p /etc/sysctl.conf
每次系统启动时,init程序都会运行/etc/rc.d/rc.sysinit脚本,该脚本包含一个使用/etc/sysctl.conf执行sysctl的命令,以确定传递给内核的值。
至此,现在可以测试您的网桥连接是否正常了。