Mesmo problema, mas solução diferente. As duas portas não estavam conectadas à mesma rede e precisavam aparecer do endereço IP da máquina virtual, portanto, o mascaramento não funcionava.
A questão principal aqui é que o contêiner openvz configura a sub-rede de todos os ips na venet para 255.255.255.255. Não há preferência de uma interface. Não há preferência em qual roteador ele deve passar, por isso, às vezes, usa eth0 e, às vezes, usa eth1. O resultado foi uma falha aleatória de determinados endereços IP quando a solicitação foi finalizada na interface errada.
Uma solução foi adicionar uma rota que especificava a fonte assim:
ip route add 10.20.0.0/16 dev venet0 src 10.20.0.xxx
ip route add a.b.c.241/24 dev venet0 src a.b.c.xxx
Descobri que a solução mais simples, por enquanto, era configurar as sub-redes logo depois de terem sido criadas (em um contêiner do ubuntu / debian em /etc/network/if-up.d):
#!/bin/sh
if [ "$IFACE" = "venet0:1" ]; then
ifconfig venet0:1 netmask 255.255.0.0 up
fi
if [ "$IFACE" = "venet0:0" ]; then
ifconfig venet0:0 netmask 255.255.255.0 up
fi
exit 0
Ambas as soluções devem ter o mesmo efeito. Ambas as soluções me preocupam um pouco que, ao acessar a Internet (para atualizar ou para o DNS), ele possa inadvertidamente usar o endereço 10.x.x.x que não tem rota para a Internet. A rota padrão é default via 192.0.2.1 dev venet0
, então não tenho certeza de como ela chega lá, mas parece funcionar como planejado após várias reinicializações do contêiner e do host.
UPDATE Para uma solução mais robusta: usei o bash para verificar o IP e descobrir em qual sub-rede adicioná-lo.
Ubuntu / Debian (/etc/network/if-up.d):
#!/bin/bash
if [ "${IF_ADDRESS:0:6}" = "xx.yy." ]; then
echo "AlReece45: $IFACE, IP Address $IF_ADDRESS marked as internal"
ifconfig "$IFACE" netmask 255.255.0.0 up
fi
if [ "${IF_ADDRESS:0:11}" = "xxx.yy.zzz." ]; then
echo "AlReece45: $IFACE, IP address $IF_ADDRESS marked as external"
ifconfig "$IFACE" netmask 255.255.255.0 up
fi
exit 0
CentOS / Redhat (/ sbin / ifup-local):
#!/bin/bash
IFACE="$1"
IF_ADDRESS=$(ifconfig $IFACE | grep "inet addr" | awk '{print $2}' | cut -d':' -f2);
if [ "${IF_ADDRESS:0:6}" = "xx.yy." ]; then
echo "AlReece45: $1, IP Address $IF_ADDRESS marked as internal"
ifconfig "$1" netmask 255.255.0.0 up
fi
if [ "${IF_ADDRESS:0:11}" = "xxx.yy.zzz." ]; then
echo "AlReece45: $1, IP address $IF_ADDRESS marked as external"
ifconfig "$1" netmask 255.255.255.0 up
fi
exit 0