لدي مضيف Proxmox مع kernel 5.15.19-2-pve.

يحتوي على واجهة bond0 مصنوعة من eth2 و eth3 ، والتي تتلقى حركة مرور ذات علامات vlan.

لقد قمت بإنشاء جسر vmbr666 يظهر كالتالي:

# /etc/network/interfaces:
auto vmbr666
iface vmbr666 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094
        mtu 9220

# brctl show
vmbr666         8000.5a0a13a9dd29       no              bond0
                                                        tap151034i1
# ip -d link sh dev vmbr666
66: vmbr666: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9220 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5a:0a:13:a9:dd:29 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    bridge forward_delay 0 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 1 vlan_protocol 802.1Q bridge_id 8000.5a:a:13:a9:dd:29 designated_root 8000.5a:a:13:a9:dd:29 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer  251.81 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

لاحظ أن هذا vlan_filteringهو 1.

إذا كنت tcpdump -enlvvvعلى bond0 ، أرى حركة مرور لـ VLAN42. إذا قمت بتشغيل tcpdump vmbr666أو tap151034i1لا أرى حركة مرور لـ VLAN42 ( ولا حتى عمليات البث أو البث المتعدد ، على الرغم من أنني أرى حركة مرور البث لبعض شبكات VLAN الأخرى). سؤال: لم لا؟

المخرجات ذات الصلة من bridge -c vlan show:

bond0             1 PVID Egress Untagged
                  2-99
tap151034i1       1 PVID Egress Untagged
                  2-99
vmbr666           1 PVID Egress Untagged

كما قلت ، أرى حركة مرور لشبكات VLAN أخرى على جميع هذه الواجهات ، بما في ذلك العلامات ، على سبيل المثال

15:03:35.293420 00:50:56:b1:24:0c > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 64: vlan 49, p 0, ethertype ARP (0x0806), Ethernet (len 6), IPv4 (len 4), Request who-has 10.76.155.200 tell 10.76.155.51, length 46

الآن دعنا نضيف vlan 42 إلى vmbr666الواجهة لنرى ما إذا كان هناك أي فرق:

# bridge vlan add vid 42 dev vmbr666 self
# bridge -c vlan show dev vmbr666        
port              vlan-id  
vmbr666           1 PVID Egress Untagged
                  42

ما tcpdump -enlvvv -i vmbr666زلت لا أرى أي شيء متعلق بـ vlan42 ، فقط شبكات VLAN أخرى (مثل 49 و 50).

لنقم بإنشاء واجهة فرعية لـ vlan42 على tap151034i1هذا النحو:

ip link add link tap151034i1 name test type vlan protocol 802.1q id 42 reorder_hdr on gvrp on mvrp on loose_binding off; ip link set up dev test

أثناء الجري tcpdump -enlvvv -i testلا أرى أي حركة مرور على الإطلاق.

هناك عنصر vmbr42قد يتدخل (ولكن إذا كان الأمر كذلك ، فلماذا يتدخل؟):

vmbr42          8000.9a0f54fe1040       no              bond0.42
                                                        fwpr103p0
                                                        fwpr104p0
                                                        fwpr105p0
                                                        fwpr151034p0
                                                        tap102i0

في ip -d link sh:

31: vmbr42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 9a:0f:54:fe:10:40 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    bridge forward_delay 0 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.9a:f:54:fe:10:40 designated_root 8000.9a:f:54:fe:10:40 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer   53.08 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

لاحظ أن هذا vlan_filteringهو 0.

يعمل tcpump -enlvvvعلى vmbr42أو tap102i0، أحد أعضائه ، يعرض حركة مرور VLAN42 ، بدون علامات - لا توجد مفاجآت هناك.

ebtablesلا توجد arptablesقواعد.

أعتقد أنني لا أفهم التفاعل بين عضوية VLAN وواجهات الجسر في Linux.

بعض الأسئلة النظرية:

  1. ما هو تأثير إضافة VLAN إلى واجهة Bridge الرئيسية باستخدام selfالكلمة الأساسية bridge vlan add؟
  2. ما هو تأثير إنشاء واجهة VLAN فرعية لواجهة عضو جسر؟
  3. إذا كانت الواجهة الفعلية تحتوي على واجهة VLAN فرعية ، وتم إضافتها إلى جسر ، فهل من المفترض أن تكون أي إطارات لشبكة VLAN هذه مرئية على جسور أخرى نفس الواجهة المادية عضو فيها؟ إذا لم يكن كذلك ، فلماذا؟
  4. ما هو الاختلاف ، من الناحية النظرية والعملية ، بين إنشاء واجهات VLAN الفرعية للواجهات المادية وربطها من ناحية ، ومن ناحية أخرى ، التمكين vlan_filteringعلى الجسر واستخدام bridge vlan pvid untaggedبعض واجهات الأعضاء في شبكات محلية ظاهرية محددة؟
  5. هل يمكنك مزج هذين النهجين؟

تحرير: إزالة الأشياء التي تم إظهارها في التعليقات على أنها غير ذات صلة ، وإضافة أسئلة نظرية للمساعدة على أمل في تنظيم الإجابة بشكل أفضل.

answer

اشتري لماذا يجب أن تظهر على واجهة الجسر؟

فكر في جسر Linux باعتباره "مفتاح L2 مُدار افتراضيًا" ، حيث تعد واجهة الجسر وسيلة لتوصيل المضيف نفسه بالمحول. لذا تعتبر واجهة الجسر بمثابة "منفذ تبديل" حيث يكون الكمبيوتر المضيف "متصلًا".

الآن ، دعنا نغير المفتاح "الافتراضي" إلى مفتاح حقيقي لمدة دقيقة. يتصل بعض المنافذ ببعض المنافذ الأخرى. طبيعة التبديل هي أن حركة المرور هذه يجب ألا تكون مرئية على المنافذ الأخرى: فهي تغمر حركة المرور فقط عندما لا يكون لديها دليل على المنفذ الذي يعيش فيه عنوان MAC الوجهة ، أو إذا تم بث العنوان.

بالعودة إلى إعدادنا "الظاهري": يتحدث منفذ النقر على الجهاز الظاهري مع المنفذ "المادي" وهو bond0 ، فلماذا يجب رؤية حركة المرور هذه على المنفذ الثالث غير ذي الصلة (وهو منفذ "المضيف" ، الذي يحمل اسم الجسر نفسه) ؟ استعلامات ARP هي حزم البث الوحيدة التي تظهر على الشبكة ، ويتم بثها بشكل صحيح ، لذلك تراها ؛ الباقي ليس كذلك.

STP BPDUs هي وحوش مختلفة. يقوم الجسر المزود بمعالجة STP الممكنة بتوليدها وإرسالها إلى كل منفذ (ممكّن لـ STP). إذا كنت تراها على الخادم ، فهذا يعني أنك أخطأت في تهيئة شيء ما. من الأفضل تعطيل STP على الجسر وأيضًا تكوين المنفذ على الجانب الآخر (الواجهة المرتبطة ، على سبيل المثال ، Port-Channel إذا كانت Cisco وما إلى ذلك) لتكون سلبية لـ STP (لا ترسل أي وحدات BPDU إلى المنفذ ، بل قم بحظر المنفذ إذا تم استلام BPDU).


محدث :

لا يقوم PVE بتمكين شبكات محلية ظاهرية على منفذ المضيف. هكذا bridve -c vlan showتبدو لي:

[email protected]:~# bridge -c vlan show
port              vlan-id  
enp5s0f0          1 PVID Egress Untagged
                  2-4094
vmbr0             1 PVID Egress Untagged
veth105i0         111 PVID Egress Untagged
veth110i0         1 PVID Egress Untagged
                  2-4094
veth107i0         1 PVID Egress Untagged
                  2-4094

(هذه واحدة كاملة). تكوين هذا الجسر في /etc/network/interfacesالأساس يشبه تكوينك. كما ترى ، vmbr0(وهو الجسر الوحيد على هذا المضيف) لا يحتوي على أي شبكة محلية ظاهرية (VLAN) إلى جانب 1 (وهو في الواقع رقم 108 بدون علامة في هذه الشبكة). لذلك حتى إذا قمت بإنشاء vmbr0.111 (واجهة VLAN ID 111 الفرعية للجسر) ، فلن ترى أي حركة مرور ، حتى أقوم بإضافة VLAN إلى واجهة vmbr0 ، على الرغم من حقيقة أن VLAN 111 عالية جدًا هناك.


لماذا تتجادل معي؟ أقوم بهذه الأشياء لمدة 14 عامًا على الأقل:

[email protected]:~# ip link add testbr type bridge vlan_filtering 1 vlan_protocol 802.1Q
[email protected]:~# ip tuntap add tap0 mode tap
[email protected]:~# ip link set tap0 master testbr
[email protected]:~# bridge -c vlan show dev testbr
port              vlan-id  
testbr            1 PVID Egress Untagged
[email protected]:~# bridge -c vlan show dev tap0
port              vlan-id  
tap0              1 PVID Egress Untagged
[email protected]:~# bridge vlan add vid 100 dev testbr self pvid untagged
[email protected]:~# bridge vlan add vid 100 dev tap0 pvid untagged
[email protected]:~# bridge vlan del vid 1 dev testbr self
[email protected]:~# bridge vlan del vid 1 dev tap0
[email protected]:~# bridge vlan add vid 200 dev testbr self
[email protected]:~# bridge -c vlan show dev testbr
port              vlan-id  
testbr            100 PVID Egress Untagged
                  200
[email protected]:~# bridge -c vlan show dev tap0
port              vlan-id  
tap0              100 PVID Egress Untagged
[email protected]:~# ip tuntap del tap0 mode tap
[email protected]:~# ip link del testbr