Ok, eu encontrei o problema:
Todos os pacotes para Floating IPs (10.1.100.0/24 no meu caso) são DNATed para o destino da rede privada (10.0.0.0/24 no meu caso). Os pacotes ssh circulam pelo controlador e voltam para a VM. O servidor ssh responde, mas envia o pacote com seu endereço privado como fonte (é claro - não tem outro). Então o cliente ssh recebe um pacote de 10.0.0.13 como resposta a um pedido para 10.1.100.4 que ele ignora.
Bem, então ao enviar pacotes de Private para Floating IPs, não apenas o destino tem que ser NAT, mas também a fonte. Mas isso não é direto porque o DNAT está no PREROUTE enquanto o SNAT está no POSTROUTE. Isso pode ser feito usando o módulo de rastreamento de conexão:
iptables -t nat -A nova-network-2.7-float-snat -s 10.0.0.13/32 -d 10.0.0.0/24 -j SNAT --to-source 10.1.100.4 -m conntrack --ctstate DNAT
Isso fez o truque para mim (para cada IP flutuante, é claro). Ele manipula cada pacote de particular para privado que já estava DNATed (então deve ir para IP Flutuante), para fazer com que pareça vir de um IP Flutuante.
No meu cenário ssh agora acontece o seguinte:
- o cliente envia de 10.0.0.13 para 10.1.100.4
- o pacote é DNATed para 10.0.0.13
- o pacote é SNATed para 10.1.100.4
- servidor responde ao pacote para 10.1.100.4
- o pacote é DNATed para 10.0.0.13
- o pacote é SNATed para 10.1.100.4
- o cliente recebe a resposta de 10.1.100.4 e está feliz
Isso funciona também para ping e também para tráfego entre diferentes VMs.
Parece que tenho que corrigir o código da nova rede e enviá-lo para o projeto openstack: - /.