仮想マシンのLinuxブリッジはIPパケットを転送しません(ただしARPは転送します)。

仮想マシンのLinuxブリッジはIPパケットを転送しません(ただしARPは転送します)。

カーネル: 5.5.8-arch1-1

物理インターフェイスに接続されているブリッジを使用して仮想ネットワークを操作しようとしています。これは一般的な設定であり、何も試していません。奇妙な

  • 足:br0
  • 物理インターフェイス:enp6s0f0

問題は、Linuxが物理インターフェイスの外部にIPトラフィックを転送しないことです。転送ARPトラフィックARP検証は機能しますが、IPトラフィックがないため双方向です。enp6s0f0から発行されました

私が試したこと:

  • enp6s0f1ブリッジに追加してenp7s0f0仮想マシンに提供し、ケーブルを使用して接続しますenp7s0f0enp6s0f1
    • 同じ結果(転送されたIPトラフィックではなく転送されたARPトラフィック)
  • Dockerを停止し、すべてのテーブルを更新します。
    • お金を維持してください
  • rp_filterを無効にする
    • お金を維持してください
  • オンボードNICの使用
    • 変更はありません(実際は初期設定なので、オンボードネットワークカードが問題を引き起こしていることを確認するためにこのクワッドポートカードを挿入しました)
  • 別のマシンで仮想マシンをping
    • エコリクエストが来るのがわかります存在する表示できますが、br0VMポート(vnetポートまたはenp6s0f1)には転送されません。
  • ブリッジでSTPを有効にする(最初は無効)
    • お金を維持してください
○ → ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp6s0f0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:10:18:85:1c:c0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::210:18ff:fe85:1cc0/64 scope link 
       valid_lft forever preferred_lft forever
3: enp6s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c2 brd ff:ff:ff:ff:ff:ff
4: enp7s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c4 brd ff:ff:ff:ff:ff:ff
5: enp7s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c6 brd ff:ff:ff:ff:ff:ff
6: enp9s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b4:2e:99:a6:22:f9 brd ff:ff:ff:ff:ff:ff
7: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:71:90:4e:e9:77 brd ff:ff:ff:ff:ff:ff
8: br-183e1a17d7f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ba:03:e1:9d brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-183e1a17d7f6
       valid_lft forever preferred_lft forever
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:02:61:00:66 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
10: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:10:18:85:1c:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.205/24 brd 192.168.1.255 scope global dynamic noprefixroute br0
       valid_lft 9730sec preferred_lft 7930sec
    inet6 fe80::210:18ff:fe85:1cc0/64 scope link 
       valid_lft forever preferred_lft forever
11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:be:eb:3e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:febe:eb3e/64 scope link 
       valid_lft forever preferred_lft forever

○ → brctl showstp br0
br0
 bridge id      8000.001018851cc0
 designated root    1000.44e4d9d88a00
 root port         1            path cost          4
 max age          19.99         bridge max age        19.99
 hello time        1.99         bridge hello time      1.99
 forward delay        14.99         bridge forward delay      14.99
 ageing time         299.99
 hello timer           0.00         tcn timer          0.00
 topology change timer     0.00         gc timer          25.78
 flags          


enp6s0f0 (1)
 port id        8001            state            forwarding
 designated root    1000.44e4d9d88a00   path cost          4
 designated bridge  1000.44e4d9d88a00   message age timer     19.21
 designated port    800d            forward delay timer    0.00
 designated cost       0            hold timer         0.00
 flags          

vnet0 (2)
 port id        8002            state            forwarding
 designated root    1000.44e4d9d88a00   path cost        100
 designated bridge  8000.001018851cc0   message age timer      0.00
 designated port    8002            forward delay timer    0.00
 designated cost       4            hold timer         0.22
 flags          

○ → bridge -d link show
2: enp6s0f0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4 
    hairpin off guard off root_block off fastleave off learning on flood on mcast_flood on mcast_to_unicast off neigh_suppress off vlan_tunnel off isolated off enp6s0f0
8: br-183e1a17d7f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 master br-183e1a17d7f6 br-183e1a17d7f6
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 master docker0 docker0
10: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 br0
11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100 
    hairpin off guard off root_block off fastleave off learning on flood on mcast_flood on mcast_to_unicast off neigh_suppress off vlan_tunnel off isolated off vnet0

○ → sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

○ → sysctl net.ipv4.conf.br0.forwarding
net.ipv4.conf.br0.forwarding = 1

答え1

ルーストアバウトジムこれbr_netfilterモジュール(入手するためにシステム制御プロパティnet.bridge.bridge-nf-call-iptables=1)iptablesを使用するとき。これは作るブリッジフレーム(イーサネット、レイヤ2)を許可iptablesフィルタリング(IP、レイヤ3):

ブリッジネットワークフィルタとは何ですか?

Linuxカーネル3.18-rc1以降、br_netfilterをmodprobeしてbridge-netfilterを有効にする必要があります。

bridge-netfilter コードは次の機能を有効にします。

{Ip,Ip6,Arp} テーブルは、ブリッジされた IPv4/IPv6/ARP パケットをフィルタリングできます。、802.1Q VLANまたはPPPoEヘッダーにカプセル化されている場合も同様です。これにより、ステートフルな透明ファイアウォール機能が可能になります。したがって、これら3つのツールのすべてのフィルタリング、ロギング、およびNAT機能はブリッジされたフレームで利用可能です。したがって、ebtablesと組み合わせたbridge-nfコードは、Linuxを非常に強力な透明なファイアウォールにします。これにより、透明な仮面舞踏会を作成できます(つまり、すべてのローカルホストは自分がインターネットに直接接続していると思います)。 {ip、ip6、arp}テーブルにブリッジされたトラフィックを表示させることは、適切な手順エントリを使用して無効または有効にできます。、嘘 /proc/sys/net/bridge/

  • bridge-nf-call-arptables

  • bridge-nf-call-iptables

  • bridge-nf-call-ip6tables

このモジュールによって引き起こされる副作用を説明する文書があります。これらの副作用は故意に透明なファイアウォールを接続するために使用するとき。さらに、iptables physdevbr_netfilterそれ自体がロードされたときにロードされます。)これがないと、マッチングは正しく機能しません(もはやマッチングされません)。また、特に次のような場合にその影響を防ぐ方法についても説明します。第7章:

br-nfコードにより、フレーム/パケットは3つの指定されたiptablesチェーンを介して双方向に渡されることがあります。最初の方法はフレームがブリッジされる場合であるため、ブリッジングコードによってiptablesチェーンが呼び出されます。。第2の方法は、パケットがルーティングされる場合である。

通話を無効にする代わりにiptablesby のコードはbr_netfilter次のとおりです。

sysctl -w net.bridge.bridge-nf-call-iptables=0

適応しなければならないiptables第7章で説明されているように(ネットワークネームスペースを含む)、どこにでもルールを適用して副作用を防ぎます。たとえば、ルーティング用ではなくブリッジング用のFORWARDチェーンに許可ルールを追加します。単に問題を解決するためにこれを無効にすると、Dockerの内部コンテナの分離から始まり、それに依存するアプリケーションがクラッシュします。

最近まで存在する カーネル 5.3このモジュールはネームスペースを認識せず、ロードするとすべてのネットワークネームスペースで突然アクティブになり、予期しない状況であらゆる種類の問題が発生します。その時点から、ip link set dev BRIDGE type bridge nf_call_iptables 1ネームスペースの代わりにブリッジ()ごとにアクティブにすることが可能です。

ツール(Docker...)とカーネル(> = 5.3)が適している場合は、選択したネットワーク名前空間とブリッジで有効にするだけで十分ですが、現在は不十分です。また参考にしてくださいカーネル 5.3ネイティブブリッジステートフルファイアウォールも継承して使用できます。nftablesこれは、このモジュールの使用を廃止するステップです(ブリッジングでVLANおよびPPPoEの直接カプセル化/カプセル化解除サポートが有効になったら)。

Webフィルタ

ブリッジの基本的な接続追跡サポートを追加します。このパッチセットの前に、人々がステータスベースのフィルタリングを実行する唯一の機会は、br_netfilterエミュレーションレイヤを使用することでした。これは廃止予定のステップです。

関連情報