Nastavení síťového stacku v Linuxu
VLAN, dummy a bridge
VLAN rozhraní v Linuxu
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 > 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 > 172.16.1.1: ICMP echo request, id 107, seq 12, length 64
00:50:58.402057 00:16:3e:73:04:49 > 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 > 172.16.1.2: ICMP echo reply, id 107, seq 12, length 64
00:50:59.426033 00:16:3e:b2:ca:c6 > 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 > 172.16.1.1: ICMP echo request, id 107, seq 13, length 64
00:50:59.426070 00:16:3e:73:04:49 > 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 > 172.16.1.2: ICMP echo reply, id 107, seq 13, length 64
00:51:00.450057 00:16:3e:b2:ca:c6 > 00:16:3e:73:04:49, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.2 > 172.16.1.1: ICMP echo request, id 107, seq 14, length 64
00:51:00.450087 00:16:3e:73:04:49 > 00:16:3e:b2:ca:c6, ethertype 802.1Q (0x8100), length 102: vlan 10, p 0, ethertype IPv4, 172.16.1.1 > 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ůmip 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.