
私は Fedora 21 を搭載したマシンを所有しており、これは 2 つの仮想マシンのホスト システムとして機能します。VM は QEMU/KVM/libvirt/virt-manager を使用して構成されています。1 つの VM は Web サーバーを実行しており、もう 1 つの VM はクライアントとして機能します。クライアントはサーバーにアクセスできるため、ネットワークは今のところ正常に機能しています。VM のデフォルト ゲートウェイとしても機能するホスト マシンの virbr0 インターフェイスを介して何らかの方法で管理されていると思います。
さて、ホストマシン上で、仮想マシンのネットワークトラフィックをフィルタリングしたいと思います。例えば、それをネットフィルタキューに入れて、特定の状況に応じて受け入れたりドロップしたりしたいとします。iptablesルールの例は次のとおりです。iptables -I FORWARD -i virbr0 -j NFQUEUE --queue-num 1
一般的には、キューに入ってくるすべてのパケットをドロップすると、VM はインターネット上の Web サイトにアクセスできなくなるため、機能しているようです。もちろん、デフォルト ゲートウェイがパケットをドロップするわけではありません。ここまでは問題ありません。
しかし、2 つの VM 間のトラフィックを停止することはできません。パケットをドロップしても、クライアントは Web サーバー VM によって提供されるページを読み込むことができます。これは、仮想化によって、デフォルト ゲートウェイを必要とせずに 2 つの VM が接続されたネットワークが形成されるためだと思います。
では、iptables と netfilter キューを介して 2 つの VM 間のトラフィックを制御する方法を教えてください。
そして、フィルター処理はホスト マシン上でのみ実行したいです。トラフィック全体をブロックすることは意図していません。特定の状況でのみフィルタリングすることが目的です。そのため、netfilter キューを使用します。