linux bridge, vlan, trunk példa

Fórumok

Egy interface-en (eth0) taggelt csomagok jönnek, 101,102,103 vlan id-kkal.
Másik három interface-en (eth101, eth102, eth103) taggeletlen csomagok jönnek.

Van 3 dummy interface-em. ip route:
10.10.101.0/24 dev dummy101 proto kernel scope link src 10.10.101.1
10.10.102.0/24 dev dummy102 proto kernel scope link src 10.10.102.1
10.10.103.0/24 dev dummy103 proto kernel scope link src 10.10.103.1

Ezeket berakom egy bridge-be:
br0-ban az eth0, eth101, eth102, eth103, dummy101, dummy102, dummy103 interface-ek.

Mi kell ahhoz, hogy ha bejön az eth101-on egy csomag, akkor az kapjon egy tag-et (101-et) és ezen az interface-en kimenjen de tag nélkül, ami a 101-es vlanba tartozik?

 

Szóval az lenne a cél, hogy ami dummy101 vagy eth101-as interface-en közlekedik az egy vlanban legyen azzal, ami az eth0-án 101-es vlan id-val.

Ugyan így a 102 és a 103

Maga a linux amin ezek az interface-ek, a router a vlanok/alhálózatok között, a dummy interface a gateway adott vlanban/alhálózatban. (vlan:subnet 1:1)

Valami ilyesmire gondoltam annak alapján amit hirtelen olvastam bridge vlan-ről

root@router# bridge vlan
port    vlan ids
eth0  None
eth101   101 PVID Egress Untagged
eth102   102 PVID Egress Untagged
eth103   103 PVID Egress Untagged
dummy101   101
dummy102   102
dummy103   103

...de sajnos ez nem így működik. Ill. a nyelvemen is van valami amit kifelejtek, de gyanús hogy amúgy se jó az elképzelésem.

Jelenleg ha az eth101-en keresztül pingelem a dummy101 címét, akkor tcpdump-al eth101 látom a requesteket, de a reply-t nem. Viszont a dummy101-et tcpdump közben, látom a reply-ket, de a requesteket nem.

 

Mi hiányzik? Alapvetően megcsinálható így nem? ...vagy hogy csinálnátok?

Hozzászólások

Szerkesztve: 2020. 02. 13., cs - 05:56

Szerintem ehhez switch kell, ha más nem teszel fel openvswitch-et. A bridge nem alkalmas erre.

Fedora 31, Thinkpad x220

Szóval az lenne a cél, hogy ami dummy101 vagy eth101-as interface-en közlekedik az egy vlanban legyen azzal, ami az eth0-án 101-es vlan id-val.

Ha ennyi a cél akkor kell egy eth0.101, kell egy br101 mondjuk es ebbe belerakod a dummy101, eth101 es az eth0.101 et. Ezt irták már. eht0 csak up on legyen. Azt nem kell tenni sehova.

Fedora 31, Thinkpad x220

Vlan-onkent csinalj kulon bridge-et, csinalj vlan interface-t eth0.101-hez azt rakd 1 bridge-be (pl br101) eth101-el es a bridge interface-re vedd fel a 10.10.101.0/24-es subnetet, nem kell dummy interface ezert es ugyanigy a masik 2 vlan-hoz is.

Dummy szimpatikusabb lenne, de kipróbálom.

 

...és mi legyen az eth0-al? Mindhárom bridgbe-be és csak azt engedi ami a megfelelő vlanban?

Mitől jutna el az eth101-en bejövő csomag az eth0 mögötti 101-es vlanban? (Mi taggelne)

 

Mi lehet az elméleti akadálya az elképzelésemnek?

Nem mondtad milyen distro kis elteresek lehetnek peldakent debian wiki oldal, arra gondoltam hogy az eth0 interface-eden csinalsz vlan interface-eket (debian vonalon vlan csomagot kell telepiteni ha nincs fenn) aminek neve szokott lenni a <fizikai interface>.<vlan id> de vlan<vlanid> vagy sok egyeb formatum is lehet. Igy a fizikai eth0 mellett lesz 3 vlan interface-ed, meg van mellette a 3 eth101-103 interface-ed es ezeket parossaval rakod 1-1 bridge-be (debian vonalon ifenslave csomag kell bar ujabbban ezek mar talan ip parancsokkal is megoldhatok) ami ad egy layer2 kapcsolatot, ha a bridge interface-ekre rateszed az ip tartomanyt amit adott vlan-okon szeretnel es ip forwardingot engedelyezed akkor lesz az a szervered lehet a router a vlan-ok kozott.
De fentebb emlitett ovs (openvswitch) is jo lehet erre, logikailag hasonlot kell ott is megvalositanod.

Kétféleképpen lehet bridge-t használni VLAN-okkal. Van a VLAN aware bridge, és a VLAN unaware bridge (ez a default linuxon és a leírások 99%-a ennek használatáról szól).

A fenti példában te VLAN aware bridge-et használnál...

Javasolt írások a témában:

 

https://vincent.bernat.ch/en/blog/2017-linux-bridge-isolation

https://developers.redhat.com/blog/2017/09/14/vlan-filter-support-on-br…

https://linux-blog.anracom.com/tag/vlan-aware-bridge/

Szerkesztve: 2020. 02. 17., h - 21:52

Szia! Meg lehet csinálni, már ha jól értettem a kérdésed. Jól indultál el, annyi, hogy kell még eth0-ra is mindhárom VLAN, másképp eldobja őket, meg a bridge-re is. Ha kiadod a bridge vlan-t ezt kellene lásd:

port    vlan ids
eth101   101 PVID Egress Untagged

eth102   102 PVID Egress Untagged

eth103   103 PVID Egress Untagged

eth0     101
         102
         103

bridge   101
         102
         103

Gyorsan össze is dobtam a setupodat, a h101 gép pingeli a h1-et, de alapból egyik sincs tagelve, hanem a tagger gép tageli meg h101-et, az trunkon küldi a switcher gépnek. Ez a swticher gép szintén vlan aware bridgel továbbdobja eth101 felé, leveszi a taget és h1 gép már tageletlenül kapja meg. tcpdumppal megnézheted, eth0-ás ICMP-n még ott a tag.
Setup: 

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
from functools import partial
import time

def start_network():
    net = Mininet()

    h101 = net.addHost('h101', ip='10.10.101.101/24')
    h102 = net.addHost('h102', ip='10.10.102.102/24')
    h103 = net.addHost('h103', ip='10.10.103.103/24')
    h1 = net.addHost('h1', ip='10.10.101.1/24')
    h2 = net.addHost('h2', ip='10.10.102.2/24')
    h3 = net.addHost('h3', ip='10.10.103.3/24')
    tagger = net.addHost('tagger')
    switcher = net.addHost('switcher')

    net.addLink(h101, tagger, intfName1='eth0', intfName2='eth101')
    net.addLink(h102, tagger, intfName1='eth0', intfName2='eth102')
    net.addLink(h103, tagger, intfName1='eth0', intfName2='eth103')
    net.addLink(h1, switcher, intfName1='eth0', intfName2='eth101')
    net.addLink(h2, switcher, intfName1='eth0', intfName2='eth102')
    net.addLink(h3, switcher, intfName1='eth0', intfName2='eth103')
    net.addLink(tagger, switcher, intfName1='trunk', intfName2='eth0')

    #setup the VLAN tagging of the hosts
    tagger.cmd('brctl addbr bridge')
    tagger.cmd('ip link set dev bridge up')
    tagger.cmd('ip link set bridge type bridge vlan_filtering 1')
    tagger.cmd('bridge vlan del vid 1 dev bridge self')
    tagger.cmd('bridge vlan del vid 1 dev trunk')
    tagger.cmd('ip link set dev trunk master bridge')
    for vlan_id in [101, 102, 103]:
        tagger.cmd('ip link set dev eth{} master bridge'.format(vlan_id))
        tagger.cmd('bridge vlan add vid {} dev bridge self'.format(vlan_id))
        tagger.cmd('bridge vlan add vid {} dev eth{} pvid untagged master'.format(vlan_id, vlan_id))
        tagger.cmd('bridge vlan del vid 1 dev eth{}'.format(vlan_id))
        tagger.cmd('bridge vlan add vid {} dev trunk'.format(vlan_id))

    #setup the main switch machine
    switcher.cmd('brctl addbr bridge')
    switcher.cmd('ip link set dev bridge up')
    switcher.cmd('ip link set bridge type bridge vlan_filtering 1')
    switcher.cmd('bridge vlan del vid 1 dev bridge self')
    switcher.cmd('ip link set dev eth0 master bridge')
    switcher.cmd('bridge vlan del vid 1 dev eth0')
    for vlan_id in [101, 102, 103]:
        switcher.cmd('ip link set dev eth{} master bridge'.format(vlan_id))
        switcher.cmd('bridge vlan add vid {} dev bridge self'.format(vlan_id))
        switcher.cmd('bridge vlan add vid {} dev eth{} pvid untagged master'.format(vlan_id, vlan_id))
        switcher.cmd('bridge vlan del vid 1 dev eth{}'.format(vlan_id))
        switcher.cmd('bridge vlan add vid {} dev eth0'.format(vlan_id))

    #setup dummy interfaces
    for vlan_id in [101, 102, 103]:
        switcher.cmd('ip link add link bridge name dummy{} type vlan id {}'.format(vlan_id, vlan_id))
        switcher.cmd('ip link set dev dummy{} up'.format(vlan_id))
        switcher.cmd('ip addr add 10.10.{}.254/24 dev dummy{}'.format(vlan_id, vlan_id))

    net.build()
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')
    start_network()

Kipróbáláshoz: apt install mininet, aztán meg sudo python vlans.py (vagy amilyen néven lemented). Ez után mininet konzolban add ki az xterm h1 h101 switcher parancsot és pingelgess.

 

Hogy már itt is lehet "like"-olni! :)

 

Köszönöm az írásodat!

Egyelőre csak javítgatni volt időm a korábbi próbálkozásomat annak alapján amit írtál és nem jártam sikerrel (fél sikereim voltak), de hamarosan folyt... Ill. ezt a mininetet amúgy is érdemes lenne megismerni azt hiszem.

(Hogy mit kutyultam össze amiért csak félsikerek, pl sokszorozódó csomagok... :o), nemsokára végigjátszom rendesen.)

Hajrá, sok sikert! Máskülönben a mininet igazából csak egy python wrapper a Linuxos veth/network namespacek fölött, de ilyesmire teljesen jó, például ha olyan hálózatos dolgokat akarsz kipróbálni amiket fizikai gépekkel nehéz lenne reprodukálni azt könnyen meg lehet vele csinálni. 

Alapvetően működni látszik, de broadcast storm (arp), ill. vannak duplikált icmp pingek is.

Egyelőre nem bírok rájönni hogy utóbbi miért, ill. hogy hogyan kellene mindkettőt megoldanom.

arptables, ebtables, iptables, és/vagy namespace-ek..., de szerintem megoldható.

Bár egyelőre az icmp-t nem értem hogyan sikerül...

Jó a dolog, működik rendesen!

Ami nekem bekavart az az, hogy az egész vmware esxi-ben van. Egy-egy subnet-vlan egy-egy portgroup. A vmware vswitchre, portroupra vonatkozó beállítások nem voltak megfelelőek, ill. a trunk portra meg egy esxi-ben futo hyperv küldi a taggelt csomagokat.

Ezek lehetőségeit átnézve, beállítva minden szép és jó! Köszönöm!

Szia!

Ez elég kusza, mi akar lenni a "dummy" csatoló?

Ha erre gondolsz:

$> modprobe dummy
$> ip link add dummy0 type dummy
$> ip link add dummy1 type dummy
$> ip link add dummy2 type dummy

Ezzel nem mész sokra, mert ez a "loopback" -nak felel meg.
L3 csatoló és "localhost only".

Amire te gondolsz(ha jól értem) az így néz ki:

$> ip link add link eth0 name eth0.101 type vlan id 101
$> ip link add link eth0 name eth0.102 type vlan id 102
$> ip link add link eth0 name eth0.103 type vlan id 103

$> ovs-vsctl add-br br101
$> ovs-vsctl add-br br102
$> ovs-vsctl add-br br103

$> ovs-vsctl add-port br101 eth0.101
$> ovs-vsctl add-port br101 eth101

$> ovs-vsctl add-port br102 eth0.102
$> ovs-vsctl add-port br102 eth102

$> ovs-vsctl add-port br103 eth0.103
$> ovs-vsctl add-port br103 eth103

$> ifconfig br101 10.10.101.1/24
$> ifconfig br102 10.10.101.2/24
$> ifconfig br103 10.10.101.3/24

Igazad van, dummy nem jó, veth-el próbáltam/om csinálni. eth0.x nem jó most nekem, a leírásban nem szereplő, a dolgot nem is érintő okból.

 

Leírom máshogy, nem sikerült korábban jól megfogalmaznom.

Debian stable

Adott linuxos ROUTER, aminek van 4 darab interface.

- eth1 10.10.10.100/24

- eth101 10.10.101.1/24

- eth102 10.10.102.1/24

- eth103 10.10.103.1/24

route-ol és tűzfal.

és adott egy managgelhető SWITCH, három vlan:

1-es port: - van egy trunk portja, ahol a 101,102,103-as vlan id-jú taggelt csomagok jönnek (egy kábelen, itt ilyen hostok vannak.

101 vlan id: 10.10.101.0/24 -es subnet beli ip-vel

102 vlan id: 10.10.102.0/24 -es subnet beli ip-vel

103 vlan id: 10.10.103.0/24 -es subnet beli ip-vel

2-es port: - egy másik portján (kábelen) tag-eletlen csomagok jönnek 10.10.101.0/24 -beli ip-kkel

3-as port: -egy másik portján (kábelen) tag-eletlen csomagok jönnek 10.10.102.0/24 -beli ip-kkel

4-es port: -egy másik portján (kábelen) tag-eletlen csomagok jönnek 10.10.103.0/24 -beli ip-kkel

és

5-ös port: -egy kábelen be van dugva a fenti router is a 10.10.101.1 interface-ével (itt is tag-eletlen csomag jön)

6-os port: - egy kábelen be van dugva a fenti router is a 10.10.102.1 interface-ével (itt is tag-eletlen csomag jön)

7-es port: -egy kábelen be van dugva a fenti router is a 10.10.103.1 interface-ével (itt is tag-eletlen csomag jön)

Szóval ez egy hét portos switch, 7 kábel van bele dugva. A 10.10.101.0/24 -beli ip-k számára a 10.10.101.1 a default gw, azaz mindent a routeren keresztül kell hogy elérjenek ami nem vele egy alhálózatban van. (és így a 10.10.102.0/24, 10.10.103.0/24 is)

 

KETTŐ A ZEGYBEN. Ezt a két dolgot, fenti router és switch akarom megvalósítani egy Debian stable OS-en. Ennek a rendszernek az interface-ei:
eth1 - erre van mondjuk az internet (router: eth1)

eth0 - ezen jönnek a tag-elt csomagok (switch: 1-es port)

eth101 - ide van bedugva az a kábel, ami mögött 10.10.101.1/24 -beli gépek taggeletlenül (switch: 2-ös port)

eth102 - ide van bedugva az a kábel, ami mögött 10.10.102.1/24 -beli gépek taggeletlenül (switch: 3-os port)

eth103 - ide van bedugva az a kábel, ami mögött 10.10.103.1/24 -beli gépek taggeletlenül (switch: 4-es port)

veth101 - eth101 nem lehet mert virtuális! és mert van is már ilyen, (így veth type). ipje: 10.10.101.1/24 (switch: 5-ös port, router eth101)

veth102 - eth102 nem lehet mert virtuális! és mert van is már ilyen, (így veth type). ipje: 10.10.102.1/24 (switch: 6-ös port, router eth102)

veth103 - eth103 nem lehet mert virtuális! és mert van is már ilyen, (így veth type). ipje: 10.10.103.1/24 (switch: 7-ös port, router 103)

 

SPYFF írása alapján javítva a saját ötletemet ilyen lenne ha bridge-el:

eth101   101 PVID Egress Untagged

eth102   102 PVID Egress Untagged

eth103   103 PVID Egress Untagged

xveth101  101 PVID Egress Untagged
xveth102  102 PVID Egress Untagged

xveth103  103 PVID Egress Untagged

eth0     101
         102
         103

bridge   101
         102
         103

Nem jártam még sikerrel (valamit elkutyultam és arpos probléma, strorm lett belőle... :),

de itt az xvethY a vethY -nek a párja (az ip a vethY-on van, nem a párján ami a bridge-ben)

Szóval ez egy bridge 3 vlannal. 1 port esetben tagget csomagok jönnek, másik 6 esetében a bejövő csomagokra attól függően hogy melyik port, rárakja a tag-et és ha kimegy rajtuk egy csomag (ami a megfelelő vlanban van, leszedi róla a tag-et (ugyanaz amit az ott bejövőre rakna).

Mint router pedig csak az eredeti eth1-e (internet) és a három veth-es interface-én/ip-jén bejött csomagok között route-ol.

Openvswitchel lenne szép a bridge-et (ez egy klasszikus switch), de ez a "klasszikus" bridge-es megoldás közelebb áll egyelőre hozzám, azzal próbálkozom most.

te mondtad:

eth0 - ezen jönnek a tag-elt csomagok (switch: 1-es port)

eth101 - ide van bedugva az a kábel, ami mögött 10.10.101.1/24 -beli gépek taggeletlenül (switch: 2-ös port)

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!