我正在尝试在同一个专用网络上设置多个 qemu 任务。我希望它们不能在主机外部访问,但它们应该能够相互访问并从互联网访问资源。就上下文而言,这将是一个 thrash kubernetes 设置。
我做了什么:
- 使用私有 IP 设置桥接接口
ip link add name br0 type bridge
ip addr add 10.24.0.1/24 dev br0
ip link set dev br0 up
qemu-bridge-helper
通过添加以下行来允许访问/etc/qemu/bridge.conf
allow br0
- 启动绑定到桥接口的 DHCP 服务器
dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.24.0.2,10.24.0.254
- 允许访客通信跳过 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