私のサーバーには、VM間ファイアウォールとルーティングのための単純なL2 Linuxブリッジを介してOPNsense VMに接続された複数のVMがあります。
仮想マシンはOPNsense
サーバーの単一のインターフェイスを介して接続されます。仮想マシンは、この単純なL2ブリッジを介して仮想マシンに接続されます。macvtap
enp3s0
vm01
OPNsense
vm01
仮想マシンのブリッジ構成hypervisor
:
auto br_vm01
iface br_vm01 inet manual
bridge_ports none
vm01
ブリッジに接続されたインターフェイスbr_vm01
:vnet2
ブリッジに接続されたインターフェイス:OPNsense
br_vm01
vnet6
hypervisor
IPホスティングvm0
仮想マシンOPNsense
:10.1.0.8
私は次を試してみます。たとえば、単純なnetcatを実行してvm01
仮想マシンから接続を試みますhypervisor
。
root@vm01:~# nc -vzw 2 10.1.0.8 8080
10.1.0.8: inverse host lookup failed: Unknown host
(UNKNOWN) [10.1.0.8] 8080 (http-alt) : Connection timed out
vm01
OPNsense
ハイパーバイザーと通信するには、仮想マシンに必要なファイアウォールルールが必要です。また、他のすべてのタイプの接続も正常に機能します。
この問題をより詳細に診断するために、vnet2
インターフェイスvnet6
でいくつかのtcpdumpを実行しました。
IPパケットは通常そのインターフェイスに入ってきますが、再びそのインターフェイスvnet2
には送信されませんvnet6
。したがって、Linuxブリッジは何らかの方法でこのパケットをフィルタリングします。また、仮想マシンでパケットキャプチャを実行しましたが、OPNsense
パケットがそこに到達できませんでした。
これはハイパーバイザーに接続しようとした場合にのみ発生し、他の項目に接続しても発生しません。
私の質問:Linuxにブリッジを愚かなレイヤ2スイッチとして扱うように指示することは可能ですか?OPNsense
仮想マシンが提供するフィルタリングなので、いかなる種類のフィルタリングも必要ありません。
私はそれを試してみました:
/sys/class/net/br_vm01/bridge/nf_call_iptables
0に設定しました。
sysctl net.bridge.bridge-nf-call-iptables
また、ゼロを表示します。
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
ブリッジでVLAN認識を有効にしても役に立ちません。
ebtables ルールはありません。
そしてhypervisor
カーネルでvm01
実行Debian 11
5.10.0-11
答え1
解決策:
答えを見つけました。問題はパラメータをテストする方法です/proc/sys/net/bridge/bridge-nf-call-iptables
。
テストをしてみると、変更しただけでなく/proc/sys/net/bridge/bridge-nf-call-iptables
他の変数もたくさん変更しました。残念ながら、これは機能しません。結局、0
このように設定すると問題が解決できることがわかりました。
理由
しかし、これがなぜ問題を引き起こすのか、まだ説明していません。
問題は、ブリッジと混同されているように見えるdockerのiptablesルールが原因で発生します。この問題は、ドッカーが開いたハイパーバイザーのオープンポートに接続しようとした場合にのみ発生します。したがって、これは開かれていないものでは発生しません。nc -l -p 8081