VLAN, dummy a bridge

VLAN rozhraní v Linuxu

VLAN lab

Takže vytvoříme a nastartujeme další kontejner:

root@osboxes:/home/osboxes# lxc-create -t download -n c2 -- -d debian -r buster -a amd64
Using image from local cache
Unpacking the rootfs

---
You just created a Debian buster amd64 (20201229_05:24) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.
root@osboxes:/home/osboxes# lxc-start c2
root@osboxes:/home/osboxes# lxc-info c2
Name:           c2
State:          RUNNING
PID:            75936
IP:             10.0.3.148
CPU use:        0.38 seconds
BlkIO use:      16.77 MiB
Memory use:     32.16 MiB
KMem use:       4.29 MiB
Link:           vethWV90Pz
 TX bytes:      1.24 KiB
 RX bytes:      1.42 KiB
 Total bytes:   2.66 KiB

Nyní můžeme vstoupit do obou kontejnerů, vytvořit VLAN rozhraní nad eth0 a dejme tomu, že na ně použijeme adresy ze subnetu 172.16.1.0/24. Každopádně musíme zvolit nový subnet tak, aby nám nekolidoval s ničím, co máme nastaveno na VM nebo v některém z kontejnerů, což naše volba splňuje. Adresy zvolíme následovně:

Kontejner Rozrhaní eth0.10
c1 172.16.1.1/24
c2 172.16.1.2/24
root@osboxes:/home/osboxes# lxc-attach c1

root@c1:/# ip link add link eth0 name eth0.10 type vlan id 10
root@c1:/# ip link set up dev eth0.10
root@c1:/# ip address add 172.16.1.1/24 dev eth0.10

root@c1:/# ip address
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: eth0@if4: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:73:04:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.3.9/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe73:449/64 scope link 
       valid_lft forever preferred_lft forever
3: eth0.10@eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:73:04:49 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.1/24 scope global eth0.10
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe73:449/64 scope link 
       valid_lft forever preferred_lft forever

Obdobně nastavíme kontejner c2:

root@osboxes:/home/osboxes# lxc-attach c2

root@c2:/# 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: eth0@if5: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:b2:ca:c6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.3.148/24 brd 10.0.3.255 scope global dynamic eth0
       valid_lft 3160sec preferred_lft 3160sec
    inet6 fe80::216:3eff:feb2:cac6/64 scope link 
       valid_lft forever preferred_lft forever

root@c2:/# ip link add link eth0 name eth0.10 type vlan id 10
root@c2:/# ip link set up dev eth0.10
root@c2:/# ip address add 172.16.1.2/24 dev eth0.10

root@c2:/# ip address
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: eth0@if5: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:b2:ca:c6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.3.148/24 brd 10.0.3.255 scope global dynamic eth0
       valid_lft 3121sec preferred_lft 3121sec
    inet6 fe80::216:3eff:feb2:cac6/64 scope link 
       valid_lft forever preferred_lft forever
3: eth0.10@eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:b2:ca:c6 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.2/24 scope global eth0.10
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:feb2:cac6/64 scope link 
       valid_lft forever preferred_lft forever

A teď zkontrolujeme, že konektivita opravdu funguje:

root@c2:/# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=64 time=0.220 ms
^C
--- 172.16.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.220/0.220/0.220/0.000 ms

Nechme ping 172.16.1.1 z c2 ještě chvili běžet a podívejme se na datagramy, které prochází přes lxcbr0 ve VM. Připojíme se tedy na VM další SSH session a spustíme tcpdump:

root@osboxes:/home/osboxes# tcpdump -n -e -i lxcbr0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lxcbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:50:58.402023 00:16:3e:b2:ca:c6 &gt; 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 &gt; 172.16.1.1: ICMP echo request, id 107, seq 12, length 64
00:50:58.402057 00:16:3e:73:04:49 &gt; 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 &gt; 172.16.1.2: ICMP echo reply, id 107, seq 12, length 64
00:50:59.426033 00:16:3e:b2:ca:c6 &gt; 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 &gt; 172.16.1.1: ICMP echo request, id 107, seq 13, length 64
00:50:59.426070 00:16:3e:73:04:49 &gt; 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 &gt; 172.16.1.2: ICMP echo reply, id 107, seq 13, length 64
00:51:00.450057 00:16:3e:b2:ca:c6 &gt; 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 &gt; 172.16.1.1: ICMP echo request, id 107, seq 14, length 64
00:51:00.450087 00:16:3e:73:04:49 &gt; 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 &gt; 172.16.1.2: ICMP echo reply, id 107, seq 14, length 64

Ctrl-C

6 packets captured
6 packets received by filter
0 packets dropped by kernel

Všimněme si teď, co všechno nám výpis zachycených rámců z programu tcpdump říká:

  • Vidíme MAC adresy, zdrojovou i cílovou pro každý rámec (abychom je viděli, pokužili jsme přepínač tcpdump -e), můžeme MAC adresy zkontrolovat proti výpispům ip address na obou kontejnerech.
  • Vidíme u všech rámců, jestli mají 802.1Q tag - to je pole vlan 10 ve vystupu.
  • Vidime IP adresy (zdrojovou a cílovou) každého IP datagramu, který se přenáší v ethernetovém rámci.
  • Vidíme, že payload v IP jsou ICMP echo request a ICMP echo reply, tedy ping.
  • Vidíme ID jednotlivých ICMP echo dotazů a odpovědí, takže je můžeme přesně asociovat s výstupem programu ping.

Ještě stojí za to poznamenat, že historicky ke konfiguraci VLAN rozhraní sloužila utilita vconfig. 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 se ji používat, přestože může vypadat na první pohled snadněji, než naznačená metoda přes moderní nástroje.