从桥接网络后面的 qemu 来宾访问互联网主机

从桥接网络后面的 qemu 来宾访问互联网主机

我正在尝试在同一个专用网络上设置多个 qemu 任务。我希望它们不能在主机外部访问,但它们应该能够相互访问并从互联网访问资源。就上下文而言,这将是一个 thrash kubernetes 设置。

我做了什么:

  1. 使用私有 IP 设置桥接接口
ip link add name br0 type bridge
ip addr add 10.24.0.1/24 dev br0
ip link set dev br0 up
  1. qemu-bridge-helper通过添加以下行来允许访问/etc/qemu/bridge.conf
allow br0
  1. 启动绑定到桥接口的 DHCP 服务器
dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.24.0.2,10.24.0.254
  1. 允许访客通信跳过 iptables
sysctl -w net.bridge.bridge-nf-call-iptables=0

此时,我可以:

  • 从主机访问 (ping/ssh) 来宾
  • 从客人那里,访问(ping/ssh)其他客人
  • 从来宾访问 (ping/ssh) 主机
  • 从访客中 ping 主机的其他 IP
  • 从来宾那里执行主机名查找

我不能做的是访问主机之外的任何内容,例如互联网资源。

我安装了 docker 并且 docker 网络工作正常,例如docker run -t alpine ping google.com工作完美。

在我看来,我需要允许从网络转发数据包10.24.0.0,但我不知道该怎么做。我努力了

iptables -I FORWARD -i br0 -j ACCEPT
iptables -I FORWARD -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o '!br0' --source 10.24.0.0/24 -j MASQUERADE

但这没有帮助。

为了澄清事情,启用 IP 转发:

$ cat /proc/sys/net/ipv4/ip_forward
1

我可以更改什么以允许我的 QEMU 访客访问互联网?

答案1

如果您纠正不正确的规则,它应该会起作用:

iptables -t nat -A POSTROUTING -o '!br0' --source 10.24.0.0/24 -j MASQUERADE
                               ^^^^^^^^^

(永远不会匹配,因为没有名为 的接口!br0

进入:

iptables -t nat -A POSTROUTING ! -o br0 --source 10.24.0.0/24 -j MASQUERADE

使用(更简单的)虚拟接口进行简单测试以显示 iptables 不被视为'!br0'否定:

ip link add '!test' type dummy
ip address add dev '!test' 10.11.12.1/24
ip link set '!test' up
iptables -I OUTPUT -o '!test'

现在您可以尝试通过此接口进行 ping:ping 10.11.12.2并且会看到,例如,iptables-save -c |grep test当使用该接口时,计数器会增加,如果不使用,则计数器不会增加。

# iptables-save -c|grep test
[1:84] -A OUTPUT -o !test

相关内容