OPNsense+virtio

pfSenseの時から、"仮想化したLinuxNICにvirtioを選ぶと通信が失敗する"、"iTunesの通信がよく失敗する"、"添付ファイル付きメールが送れない"、”Windows Updateがたまに失敗する"、"内側(dmz)側のルーターのネットワーク経由のアップデートができない"など微妙にイラっと来る問題が発生していた。
それぞれ毎回起こるわけでもなかったり、代替手段で何とかなったりしていたので、真剣に追わず、"仮想化モニタ側の問題で、今にアップデートで直るだろう"と思っていた。


本日、予期せず原因が見つかって直せたのでメモ。


OPNsenseのドキュメントを読んでいたら、仮想化環境にインストールした時の設定方法が書いてあった。
Virtual & Cloud based Installation — OPNsense documentation


まず、General TipsとしてネットワークアダプタのすべてのハードウェアオフロードオプションはOFFにせよと書いてあり、Xen上だがChecksum Offloadを無効化しないとNATに問題が出るとあった。
もしかして…と思い、標準で無効化されているTSOとLROに加え、CRCも無効化したのち、ルーターを再起動したところ上記の問題が直った。


完全に仮想化モニタ側だと思い込んでいて、ルーター側をあまり疑わなかったのが失敗だったかもしれない。
pfSenseでもほぼ同じことが起きており、ベースも同じFreeBSDなのでおそらく同じ原因だと思われる。


とりあえず、全仮想マシンNICをvirtioに変更し、動作することを確認した。
virtioは準仮想化と呼ばれるもので、実ハードのエミュレーションの代わりに専用のドライバ+ハイパーバイザ側の対応によって都合のいいインターフェースを作る仕組み。
特権/非特権間のコンテキストスイッチとデータのコピーが減るので処理が軽くなるという仕組みらしい。


virtio: Linux の I/O 仮想化フレームワーク


今までもストレージデバイスにはvirtioを使っていたが、今回NICも置き換えた。
性能などは測っていないが、同じ条件で仮想化モニタのメモリ使用量が気持ち減った。


しばらく様子を見る。