No final acabei criando apenas uma interface e encaminhando pacotes através dela com algumas regras do iptables, o que parece estar funcionando para mim. Isso NÃO usa a opção 'bridge' que todos os tutoriais parecem sugerir, então eu não sei se existe uma falha fatal?
auto lo
iface lo inet loopback
auto xenbr0
iface xenbr0 inet static
bridge_ports none
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 10.0.0.3
# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.0.3
netmask 255.0.0.0
network 10.0.0.0
broadcast 10.255.255.255
gateway 10.0.0.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8
Você precisa editar o /etc/sysctl.conf e descomentar a seguinte linha:
net.ipv4.ip_forward=1
Então você precisa criar um script para editar o iptables para encaminhar pacotes:
sudo /sbin/iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
sudo /sbin/iptables --append FORWARD --in-interface xenbr0 -j ACCEPT
return 0
Então você precisa ter certeza de que o script é chamado pelo arquivo rc.local:
sudo vi /etc/rc.local
Adicione a seguinte linha:
/bin/sh <path-to-script-you-just-created-here>
Em seguida, reinicialize para que todas as configurações entrem em vigor.
Como você pode perceber, eu o configurei para que as máquinas virtuais usem uma sub-rede de endereço 192.168.2.x enquanto a lan externa está em 10.xxx, o que é provavelmente diferente do que a maioria das pessoas vai querer, então você terá que edite-os de acordo com suas necessidades pessoais.
Atualizar
Mais tarde, percebi que a falta de ponte significava que eu não conseguia acessar minhas máquinas virtuais de fora da rede (ou seja, eu não conseguia acessá-las diretamente de casa ou executar um site delas, etc.)
Usando uma configuração de rede como assim funcionou:
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto xenbr0
iface xenbr0 inet static
address 23.29.115.142
netmask 255.255.255.248
network 23.29.115.136
broadcast 23.29.115.143
gateway 23.29.115.137
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Eu estou supondo que essas opções extras de bridge fizeram funcionar, ou talvez a ordem em que as interfaces foram listadas no arquivo (eth0 antes da bridge desta vez)