FreeBSD: routage avec des vtnet

Bonjour à tous,

Un petit billet portant sur la mise en place d'une machine virtuelle sous FreeBSD avec des cartes en VIRTIO (sous proxmox 4) qui servira de routeur (et de firewall).
Au départ j'utilisais des cartes en e1000 mais le type VIRTIO est censé être plus performant.

Un souci simple mais très handicapant s'est présenté: les paquets arrivent bien sûr les interfaces mais n'en repartent jamais.
Cependant, un tcpdump voyait bien les paquets arriver, montrait bien leur départ mais la commande (un ping par exemple) tombait en timeout.

Le fautif: le checksum offload hardware. Ce mécanisme sert à décharge le checksum des entêtes au niveau de la carte réseau (si elle possède cette capacité).

Pour le désactiver rien de plus simple:

ifconfig vtnet0 -rxcsum -txcsum

Le voici désactivé pour l'IPv4.
Si vous faites de l'IPv6, la commande n'est pas plus compliquée:

ifconfig vtnet0 -rxcsum6 -txcsum6

Et le ping est fonctionnel.
Ce souci était présent sur tout ce qui passait par ce routeur, que ce soit du simple icmp ou de l'http/https.

Cependant attention! au prochain reboot, la modification n'est plus effective. Pour que cela soit persistent, il faut rajouter ce qui suit dans votre /etc/rc.conf :

ifconfig_vtnet0="inet bla netmask bla -rxcsum -txcsum"
ifconfig_vtnet0_ipv6="inet6 bla prefixlen 64 -rxcsum6 -txcsum6"

La modification sera valable tout le temps maintenant.

Have a nice day.

Boris