Je pense que c'est pas une bonne idée de mélanger du routage et un bridge avec du NAT. Tu as des règles de masquerade donc les IP de tes VM sont remplacé par celle de l'host.
172.16.16.x veut communiquer en SSH avec 172.16.17.X. Son paquet arrive sur le host A, et le routage statique lui indique que 172.16.17.x passe par 172.16.0.17 soit l'ip de l'host B. Et avant de sortir du host A, le paquet est masqueradé par 172.16.0.16. Donc dans la table NAT de conntracking il va y avoir
SOURCE => DEST = MASQ_IP:MASQ_PORT SOURCE => DEST
172.16.16.X:abc => 172.16.17.x:22 = 172.16.0.16:xyz => 172.16.17.x:22
Mais le paquet de retour ne va pas ressembler à 172.16.17.x:22 => 172.16.0.16:xyz vu qu'il y aura aussi masquerading sur le host B.
Moi ce qui m'étonne c'est que ça marche dans certain cas. Le truc attendu c'est que ça ne marche jamais.
Pour moi il faudrait que tu empeches le masquerading quand les VM Ax causent avec Bx et inversement
Ex sur host B:
91274 7653K MASQUERADE tcp -- * * 172.16.17.0/24 !172.16.17.0/24 masq ports: 1024-65535
722 50116 MASQUERADE udp -- * * 172.16.17.0/24 !172.16.17.0/24 masq ports: 1024-65535
6 504 MASQUERADE all -- * * 172.16.17.0/24 !172.16.17.0/24
En gros ces règles masquerade dès que tes VM Bx sortent y compris vers Ax. Donc faudrait ajouter en destination !172.16.16.0/24