Nastavení síťového stacku v Linuxu

VLAN, dummy a bridge

bridge

O linuxovém bridgi už jsme toho napsali dost, ale ještě nepadlo, jak se takový bridge vytvoří a jak se spravuje. Zatím to za nás udělalo LXC.

Představa bridge je taková, že to je virtuální switch, do jednoho jeho virtuálního portu je připojen L3 interface, který bridge reprezentuje v systému - v našem případě to je lxcbr0 na naší VM. Dále pak jsou do bridge zapojeny další rozhraní (ať už fyzická - enp3s0 a nebo virtuální - u nás to jsou dva virtuální ethernetové páry), jako další „porty“.

Linuxový bridge se nastavuje dvojicí nástrojů: ip link z iproute2 a pak zvláštním nástrojem bridge. Oba tyto nástroje opět slouží jak k zobrazení stavu tak k manipulaci s bridgem:

root@osboxes:/home/osboxes# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:19:77:53 brd ff:ff:ff:ff:ff:ff
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
4: vethwfg1Dt@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxcbr0 state UP mode DEFAULT group default qlen 1000
    link/ether fe:08:30:5a:d7:82 brd ff:ff:ff:ff:ff:ff link-netnsid 0
5: vethWV90Pz@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxcbr0 state UP mode DEFAULT group default qlen 1000
    link/ether fe:5a:c8:49:f8:82 brd ff:ff:ff:ff:ff:ff link-netnsid 1

root@osboxes:/home/osboxes# bridge link
4: vethwfg1Dt@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master lxcbr0 state forwarding priority 32 cost 2 
5: vethWV90Pz@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master lxcbr0 state forwarding priority 32 cost 2 

Ve výstupu ip link je důležité pole master, které u rozhraní, která jsou "porty" bridge, představuje právě tento podřízený vztah k bridgi. Ve výstupu bridge link vidíme pak aktivní rozhraní konkrétního bridge (což je vlastně obdobná informace, jakou bychom získali podrobným přečtením výstupu ip link). Nicméně interní stav bridge přes ip zobrazit nelze, na to je právě utilita bridge. S její pomocí můžeme zobrazit switch tabulku bridge pro unicast a multicast (ta je u nás prázdná) a také mapping VLAN. (Nicméně ten je relevantní, jen pokud je nakonfigurovaný VLAN filtering a ten my v tomto příkladu zaplý schválně nemáme):

root@osboxes:/home/osboxes# bridge fdb
33:33:00:00:00:01 dev enp0s3 self permanent
01:00:5e:00:00:01 dev enp0s3 self permanent
33:33:ff:19:77:53 dev enp0s3 self permanent
01:80:c2:00:00:00 dev enp0s3 self permanent
01:80:c2:00:00:03 dev enp0s3 self permanent
01:80:c2:00:00:0e dev enp0s3 self permanent
33:33:00:00:00:01 dev lxcbr0 self permanent
01:00:5e:00:00:01 dev lxcbr0 self permanent
33:33:ff:00:00:00 dev lxcbr0 self permanent
00:16:3e:00:00:00 dev lxcbr0 vlan 1 master lxcbr0 permanent
00:16:3e:00:00:00 dev lxcbr0 master lxcbr0 permanent
00:16:3e:73:04:49 dev vethwfg1Dt master lxcbr0 
fe:08:30:5a:d7:82 dev vethwfg1Dt vlan 1 master lxcbr0 permanent
fe:08:30:5a:d7:82 dev vethwfg1Dt master lxcbr0 permanent
33:33:00:00:00:01 dev vethwfg1Dt self permanent
01:00:5e:00:00:01 dev vethwfg1Dt self permanent
33:33:ff:5a:d7:82 dev vethwfg1Dt self permanent
00:16:3e:b2:ca:c6 dev vethWV90Pz master lxcbr0 
fe:5a:c8:49:f8:82 dev vethWV90Pz vlan 1 master lxcbr0 permanent
fe:5a:c8:49:f8:82 dev vethWV90Pz master lxcbr0 permanent
33:33:00:00:00:01 dev vethWV90Pz self permanent
01:00:5e:00:00:01 dev vethWV90Pz self permanent
33:33:ff:49:f8:82 dev vethWV90Pz self permanent

root@osboxes:/home/osboxes# bridge mdb

root@osboxes:/home/osboxes# bridge vlan
port    vlan ids
lxcbr0   1 PVID Egress Untagged

vethwfg1Dt   1 PVID Egress Untagged

vethWV90Pz   1 PVID Egress Untagged

Jak tedy takový bridge vytvoříme? Předvedeme zde příklad, jak by šlo ručně vytvořit bridge, který pro nás udělal LXC (předem si jej však musíme smazat a pak všechno znovnu nastavit):

root@osboxes:/home/osboxes# ip link add name lxcbr0 type bridge
root@osboxes:/home/osboxes# ip link set lxcbr0 up
root@osboxes:/home/osboxes# ip address add 10.0.3.1/24 dev lxcbr0

A teď jak do nového bridge přidáme "porty" v podobě rozhraní virtuálních ethernetových párů LXC kontejnerů:

root@osboxes:/home/osboxes# ip link set vethwfg1Dt up
root@osboxes:/home/osboxes# ip link set vethwfg1Dt master lxcbr0

root@osboxes:/home/osboxes# ip link set vethWV90Pz up
root@osboxes:/home/osboxes# ip link set vethWV90Pz master lxcbr0

Odkazy:

Na závěr stojí za to upozornit na to, že historicky se bridge konfigurovaly a ovládaly utilitou brctl. Ta je však momentálně považována za zastaralou, podobně, jako ifconfig a nelze než doporučit se jí vyhnout a neučit s ji používat, přestože může vypadat na první pohled snadněji, než naznačená metoda přes moderní nástroje.