Lab 06

VirtualBox · Debian Stable · VLAN 802.1Q

VLAN 802.1Q i routing między VLAN-ami

Zbuduj praktyczny wariant router-on-a-stick: jeden wspólny segment VirtualBox przenosi tagowane ramki, a Debian Router rozdziela VLAN 10 i VLAN 20 na subinterfejsach 802.1Q.

1

Cel ćwiczenia

Lab 06 pokazuje praktycznie różnicę między VLAN, ramką Ethernet i routingiem. W tym laboratorium VirtualBox Internal Network jest wspólnym medium dla tagowanych ramek, a nie pełnym zarządzalnym switchem VLAN.

Przydatne będą też materiały o ARP/ICMP i diagnostyce.

  • zrozumieć VLAN jako logiczny segment warstwy 2.
  • odróżnić VLAN ID od numeru podsieci IPv4.
  • utworzyć subinterfejsy VLAN 802.1Q w Debianie.
  • zbudować scenariusz trunk-only bez zarządzalnego switcha.
  • skonfigurować router-on-a-stick na jednym interfejsie bazowym.
  • uruchomić routing między VLAN 10 i VLAN 20.
  • zdiagnozować błędny VLAN ID, gateway, ip_forward i firewall.
0

Rejestracja stanu przed laboratorium

Na każdej VM zapisz konfigurację zanim utworzysz subinterfejsy i zmienisz tryb karty. Na routerze zapisz również bieżącą wartość ip_forward. Te dane są podstawą dokładnego rollbacku, więc nie zastępuj ich założeniem o stanie domyślnym.

STATE="$HOME/lab06-state"
umask 077
mkdir -p "$STATE"
ip -br link > "$STATE/link.before"
ip -br address > "$STATE/address.before"
ip route show table all > "$STATE/routes.before"

if sudo test -e /etc/network/interfaces; then
  printf 'present
' > "$STATE/interfaces.marker"
  sudo cp -a /etc/network/interfaces "$STATE/interfaces.before"
else
  printf 'absent
' > "$STATE/interfaces.marker"
fi

# Tylko na routerze
sysctl -n net.ipv4.ip_forward > "$STATE/ip-forward.before"

Przy wyłączonych VM zapisz na hoście numer adaptera, tryb, nazwę Internal Network i stan kabla. Oczekiwany rezultat to trzy katalogi stanu i zapis konfiguracji VirtualBox. Snapshot jest dodatkowym punktem powrotu, ale nie backupem.

2

Topologia Lab 06

Użyj trzech maszyn Debian: CLIENT A, ROUTER i CLIENT B. Każda VM ma jeden adapter VirtualBox podłączony do tej samej sieci lab-vlan-trunk. To jest scenariusz trunk-only: klienci sami tworzą subinterfejsy VLAN, a router tworzy oba VLAN-y na jednym interfejsie bazowym.

CLIENT A
VLAN 10
192.168.10.10/24
gateway 192.168.10.1

ROUTER
base: enp0s3 bez adresu IPv4 laboratorium
enp0s3.10 -> VLAN ID 10 -> 192.168.10.1/24
enp0s3.20 -> VLAN ID 20 -> 192.168.20.1/24

CLIENT B
VLAN 20
192.168.20.10/24
gateway 192.168.20.1

W podstawowym scenariuszu nie używamy NAT, DHCP, DNS, Internetu, drugiego interfejsu routera, bridge Linux, Open vSwitch ani klasycznego switcha zarządzalnego.

Jedno wspólne medium lab-vlan-trunk przenosi tagowane ramki VLAN 10 i VLAN 20.
3

VLAN i tag 802.1Q

VLAN to mechanizm warstwy 2, a podsieć IPv4 to mechanizm warstwy 3. Najczęściej jeden VLAN łączymy z jedną podsiecią IP, ale te pojęcia nie są tym samym. W tym labie numery są celowo czytelne: VLAN 10 używa 192.168.10.0/24, a VLAN 20 używa 192.168.20.0/24.

DEST MAC
SOURCE MAC
802.1Q TAG  -> VLAN ID 10 albo VLAN ID 20
ETHER TYPE
PAYLOAD

VLAN ≠ podsieć IPv4. VLAN rozdziela domeny warstwy 2, a routing warstwy 3 jest potrzebny do komunikacji między różnymi VLAN-ami.

IEEE 802.1Q dodaje do ramki Ethernet czterobajtowy tag z informacją o VLAN.
4

VirtualBox trunk-only

Wszystkie trzy maszyny ustaw na Internal Network lab-vlan-trunk. Nie opisuj tego jako prawdziwych portów access switcha. Tagowanie i rozpoznawanie VLAN realizują systemy Debian przez subinterfejsy 802.1Q.

Client A Adapter 1 -> Internal Network: lab-vlan-trunk
Router Adapter 1   -> Internal Network: lab-vlan-trunk
Client B Adapter 1 -> Internal Network: lab-vlan-trunk

Najpierw znajdź właściwy interfejs bazowy. Przykładowa nazwa to enp0s3, ale nie zakładaj jej bez sprawdzenia.

ip link show
ip address show
VirtualBox Internal Network jest tu medium przenoszącym ramki, a nie emulacją pełnego switcha z access ports.
5

Client A — VLAN 10

Jeżeli VM była używana wcześniej, usuń starą konfigurację IP tylko po potwierdzeniu, że enp0s3 jest dedykowanym interfejsem Lab 06. Nie wykonuj flush na przypadkowej karcie.

# UWAGA: flush usuwa całą bieżącą adresację IPv4 z interfejsu bazowego.
sudo ip addr flush dev enp0s3
sudo ip link set enp0s3 up
sudo ip link add link enp0s3 name enp0s3.10 type vlan id 10
sudo ip addr add 192.168.10.10/24 dev enp0s3.10
sudo ip link set enp0s3.10 up

ip address show
ip -d link show enp0s3.10
ip route show

Oczekujesz trasy connected 192.168.10.0/24. Nazwa .10 pomaga w czytelności, ale faktyczny VLAN ID ustala fragment type vlan id 10.

Adres IP przypisz do subinterfejsu VLAN, nie do interfejsu bazowego.
6

Client B — VLAN 20

# UWAGA: flush usuwa całą bieżącą adresację IPv4 z interfejsu bazowego.
sudo ip addr flush dev enp0s3
sudo ip link set enp0s3 up
sudo ip link add link enp0s3 name enp0s3.20 type vlan id 20
sudo ip addr add 192.168.20.10/24 dev enp0s3.20
sudo ip link set enp0s3.20 up

ip address show
ip -d link show enp0s3.20
ip route show

Oczekujesz trasy connected 192.168.20.0/24 i informacji vlan id 20 w wyniku ip -d link show.

Client B pracuje w VLAN 20 i w podsieci 192.168.20.0/24.
7

Router — dwa subinterfejsy

Na routerze interfejs bazowy enp0s3 nie dostaje adresu IPv4 laboratorium. Przenosi tagowane ramki, a warstwa 3 działa na subinterfejsach enp0s3.10 i enp0s3.20.

# UWAGA: flush usuwa całą bieżącą adresację IPv4 z interfejsu bazowego.
sudo ip addr flush dev enp0s3
sudo ip link set enp0s3 up

sudo ip link add link enp0s3 name enp0s3.10 type vlan id 10
sudo ip addr add 192.168.10.1/24 dev enp0s3.10
sudo ip link set enp0s3.10 up

sudo ip link add link enp0s3 name enp0s3.20 type vlan id 20
sudo ip addr add 192.168.20.1/24 dev enp0s3.20
sudo ip link set enp0s3.20 up

ip -d link show enp0s3.10
ip -d link show enp0s3.20
ip route show

Router powinien automatycznie mieć connected routes do 192.168.10.0/24 i 192.168.20.0/24. Nie dodawaj statycznych tras między tymi connected networks.

Router-on-a-stick używa jednego interfejsu bazowego i wielu subinterfejsów VLAN.
8

Test izolacji / gateway VLAN

Najpierw sprawdź, czy każdy klient osiąga swój gateway w swoim VLAN. Dopiero potem testuj komunikację między klientami.

# UWAGA: delete usuwa wskazane trasy i subinterfejsy wraz z ich adresacją runtime.
# Client A
ping 192.168.10.1

# Client B
ping 192.168.20.1

Przed konfiguracją default gateway Client A traktuje 192.168.20.10 jako sieć zdalną i nie ma odpowiedniej drogi. To jest kluczowy moment dydaktyczny: VLAN nie routuje między VLAN-ami.

Sam VLAN nie routuje między VLAN-ami.
9

Default gateway i ARP next-hop

Client A chce wysłać pakiet do 192.168.20.10. Ponieważ to inna podsieć, Client A nie szuka MAC Client B. Szuka MAC swojego gateway, czyli 192.168.10.1 w VLAN 10. Router później ustala MAC Client B w VLAN 20.

# Client A
sudo ip route replace default via 192.168.10.1
ip route show

# Client B
sudo ip route replace default via 192.168.20.1
ip route show

Oczekiwane trasy: Client A ma default via 192.168.10.1, a Client B ma default via 192.168.20.1.

Dla zdalnej sieci ARP dotyczy next-hop gateway.
10

IP forwarding / inter-VLAN routing

Subinterfejsy same w sobie nie powodują routingu między VLAN-ami. Sprawdź i włącz runtime IPv4 forwarding na routerze.

sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1
sysctl net.ipv4.ip_forward

Po ustawieniu gateway na klientach i ip_forward=1 test między VLAN-ami powinien działać, jeżeli firewall nie blokuje forwarding.

# Client A
ping 192.168.20.10

# Client B
ping 192.168.10.10

Inter-VLAN routing nie wymaga NAT. Router zna obie sieci bezpośrednio, a pakiet zachowuje adresy źródłowy i docelowy.

Inter-VLAN routing wymaga routingu L3 i ip_forward, ale nie wymaga NAT.
11

Obserwacja tagów tcpdump

Jeżeli tcpdump nie jest zainstalowany, przygotuj pakiet wcześniej. Nie wymagaj Internetu podczas właściwego laboratorium. Format outputu może różnić się między wersjami, ale szukasz obecności tagu i numeru VLAN ID.

sudo tcpdump -eni enp0s3 vlan
sudo tcpdump -eni enp0s3 vlan 10
sudo tcpdump -eni enp0s3 vlan 20

Na enp0s3 widzisz ramki na łączu bazowym. enp0s3.10 udostępnia logiczny ruch VLAN 10, a enp0s3.20 logiczny ruch VLAN 20.

Brak tagu 802.1Q w pojedynczym przechwyceniu nie dowodzi błędnej konfiguracji. Wynik zależy od punktu przechwytywania, działania wirtualnego przełącznika oraz funkcji VLAN RX/TX offload, GRO i LRO. Sterownik może zdjąć lub dodać tag poza miejscem, w którym obserwuje go tcpdump.

Pakiet ethtool przygotuj przed odłączeniem dostępu do repozytoriów. Najpierw ustal interfejs przezip -br link, a następnie zapisz pełny stan funkcji. Polecenia wymagają uprawnień administratora.

STATE="$HOME/lab06-state"
IFACE=enp0s3
sudo ethtool -k "$IFACE" | tee "$STATE/ethtool-k.before"

for SPEC in   "rxvlan rx-vlan-offload"   "txvlan tx-vlan-offload"   "gro generic-receive-offload"   "lro large-receive-offload"
do
  set -- $SPEC
  VALUE=$(sudo ethtool -k "$IFACE" | awk -v key="$2" '$1 == key ":" { print $2 }')
  printf '%s %s
' "$1" "$VALUE"
done > "$STATE/offload.before"

cat "$STATE/offload.before"

Opcjonalnie wyłącz funkcje pojedynczo tylko na czas powtórzenia przechwycenia. Wirtualna karta może odpowiedziećOperation not supported albo oznaczyć funkcję jako[fixed]; nie jest to błąd VLAN. Wyłączenie offloadingu może obniżyć wydajność, dlatego nie pozostawiaj go bez uzasadnienia.

IFACE=enp0s3
for OPTION in rxvlan txvlan gro lro; do
  sudo ethtool -K "$IFACE" "$OPTION" off ||
    echo "$OPTION: operacja nieobsługiwana"
done

sudo tcpdump -eni "$IFACE" vlan

Po teście przywróć dokładnie zapisane wartości i ponownie odczytaj funkcje. Nie wpisuj wszystkich wartości jako on, bo początkowy stan mógł być inny.

STATE="$HOME/lab06-state"
IFACE=enp0s3
while read -r OPTION VALUE; do
  case "$VALUE" in
    on|off) sudo ethtool -K "$IFACE" "$OPTION" "$VALUE" ||
      echo "$OPTION: nie można odtworzyć automatycznie" ;;
  esac
done < "$STATE/offload.before"

sudo ethtool -k "$IFACE"

Jeśli funkcji nie można zmienić, przechwytuj na innym punkcie: na interfejsie bazowym innej VM, na hoście z odpowiednią polityką promiscuous mode albo porównaj ruch bazowy z subinterfejsem.

Na interfejsie bazowym obserwujesz tagi, a na subinterfejsie logiczny ruch danego VLAN.
12

Typowe błędy VLAN

Zły VLAN ID: Client A ma VLAN ID 20, ale adres 192.168.10.10/24.
Literówka w lab-vlan-trunk: jedna VM trafia do innego segmentu VirtualBox.
IP na base interface: ruch jest untagged zamiast przechodzić przez subinterfejs VLAN.
Brak default gateway: klient osiąga gateway w swoim VLAN, ale nie drugą podsieć.
ip_forward=0: router ma obie connected routes, ale nie przekazuje ruchu IPv4.
Firewall blokuje FORWARD mimo poprawnych VLAN, gateway i ip_forward=1.
Subinterfejs DOWN: enp0s3.10 albo enp0s3.20 istnieje, ale nie jest aktywny.

Jeżeli wszystko wygląda poprawnie, ale inter-VLAN routing nadal nie działa, sprawdź sudo nft list ruleset. Nie wyłączaj firewalla automatycznie i nie używaj nft flush ruleset.

Diagnozuj VLAN ID, medium L2, adresację, gateway, forwarding i firewall osobno.
13

Diagnostyka VLAN krok po kroku

  1. Czy wszystkie VM używają lab-vlan-trunk?
  2. Czy znaleziono właściwy interfejs bazowy?
  3. Czy interfejs bazowy jest UP?
  4. Czy Client A ma faktyczny VLAN ID 10?
  5. Czy Client B ma faktyczny VLAN ID 20?
  6. Czy Router ma VLAN 10 i VLAN 20?
  7. Czy IP są przypisane do subinterfejsów?
  8. Czy Client A osiąga 192.168.10.1?
  9. Czy Client B osiąga 192.168.20.1?
  10. Czy klienci mają default gateway?
  11. Czy Router ma obie connected routes?
  12. Czy ip_forward=1?
  13. Czy firewall pozwala na FORWARD?
  14. Czy tcpdump pokazuje prawidłowy tag VLAN?
Najpierw L2 i VLAN, potem L3 i routing.
14

Cofnięcie zmian i walidacja

Konfiguracja w tym laboratorium jest runtime. Trwałą konfigurację VLAN przez systemd-networkd, NetworkManager albo ifupdown można przygotować osobno. Po ćwiczeniu usuwaj tylko utworzone subinterfejsy, nie interfejs bazowy. Pracuj z lokalnej konsoli, ponieważ restart sieci może przerwać SSH.

# Client A
sudo ip route delete default via 192.168.10.1 2>/dev/null || true
sudo ip link delete enp0s3.10 2>/dev/null || true

# Client B
sudo ip route delete default via 192.168.20.1 2>/dev/null || true
sudo ip link delete enp0s3.20 2>/dev/null || true

# Router
sudo ip link delete enp0s3.10 2>/dev/null || true
sudo ip link delete enp0s3.20 2>/dev/null || true

Na każdej VM przywróć jej własny plik konfiguracji i przeładuj ifupdown. Na routerze odtwórz dokładną zapisaną wartośćip_forward.

STATE="$HOME/lab06-state"
if grep -qx present "$STATE/interfaces.marker"; then
  sudo cp -a "$STATE/interfaces.before" /etc/network/interfaces
else
  # UWAGA: usuń plik tylko wtedy, gdy marker potwierdza jego wcześniejszy brak.
  sudo rm -- /etc/network/interfaces
fi
sudo systemctl restart networking

# Tylko na routerze
sudo sysctl -w net.ipv4.ip_forward="$(cat "$STATE/ip-forward.before")"

ip -d link show
ip -br address
ip route show table all
sysctl net.ipv4.ip_forward

Sprawdź, że subinterfejsy utworzone w Lab 06 nie istnieją, adresy i trasy odpowiadają plikom *.before, a ustawienia offloadingu odpowiadają offload.before. Wyłącz VM i odtwórz zapisany tryb kart VirtualBox. Procedura nie usuwa interfejsu bazowego, obcych VLAN-ów, pakietówtcpdump/ethtool ani konfiguracji trwałej utworzonej poza tym laboratorium.

Kontynuuję dalszą analizę: możesz pozostawić subinterfejsy, ale musisz odtworzyć tymczasowo zmieniony offloading i zachować katalog stanu. Kończę ćwiczenia: wykonaj pełny rollback i usuń katalogi stanu dopiero po wszystkich testach.

15

Zadania dla studenta

  1. Utwórz VLAN 30 na papierze i zaproponuj dla niego osobną podsieć.
  2. Wyjaśnij różnicę VLAN vs podsieć IPv4.
  3. Co oznacza VLAN ID 10 w tym laboratorium?
  4. Co robi subinterfejs enp0s3.10?
  5. Dlaczego IP nie powinien być na base interface w tym scenariuszu?
  6. Dlaczego Client A ARPuje gateway, a nie Client B?
  7. Dlaczego NAT nie jest potrzebny między VLAN 10 i VLAN 20?
  8. Co stanie się, gdy Client A ma VLAN ID 20 zamiast 10?
  9. Co sprawdza ip -d link show?
  10. Jak potwierdzić tag 802.1Q za pomocą tcpdump?

Pytania kontrolne

  1. Co to jest VLAN?
  2. W której warstwie działa 802.1Q?
  3. Co to jest trunk?
  4. Co to jest router-on-a-stick?
  5. Czy VLAN i podsieć IPv4 to to samo?
  6. Do czego służy VLAN ID?
  7. Po co tworzymy subinterfejs .10?
  8. Czy inter-VLAN routing wymaga NAT?
  9. Co robi net.ipv4.ip_forward?
  10. Co zobaczymy w tcpdump na trunku?

Checklist końcowy

  • wszystkie VM używają Internal Network lab-vlan-trunk.
  • Client A ma VLAN 10.
  • Client B ma VLAN 20.
  • Router ma VLAN 10 i VLAN 20.
  • adresy IP są przypisane do subinterfejsów.
  • Client A osiąga 192.168.10.1.
  • Client B osiąga 192.168.20.1.
  • klienci mają właściwe default gateway.
  • net.ipv4.ip_forward ma wartość 1.
  • inter-VLAN ping działa w obie strony.

Najważniejsze rozróżnienia

VLAN działa na L2, routing działa na L3, a VLAN ID nie jest tym samym co numer podsieci. W tym laboratorium skojarzenie VLAN 10 z 192.168.10.0/24 jest czytelną konwencją.

Base interface bez IP przenosi tagowane ramki. Adresy IP VLAN przypisuj do subinterfejsów VLAN. NAT nie jest potrzebny, bo router ma obie sieci jako directly connected.

Manifest grafik

Wszystkie grafiki wykorzystane w laboratorium znajdują się w poniższym katalogu Lab 06.

public/images/wirtualizacja/virtualbox/laboratoria/lab-06-vlan/
01-topologia-lab-vlan.png
02-ramka-8021q.png
03-trunk-virtualbox.png
04-client-a-vlan10.png
05-client-b-vlan20.png
06-router-subinterfejsy.png
07-test-izolacji-vlan.png
08-gateway-arp-vlan.png
09-inter-vlan-routing.png
10-tcpdump-tagi-vlan.png
11-bledy-vlan.png
12-diagnostyka-vlan.png

Adresacja i routing

VLAN 10

sieć: 192.168.10.0/24

router: 192.168.10.1/24

client A: 192.168.10.10/24

gateway: 192.168.10.1

VLAN 20

sieć: 192.168.20.0/24

router: 192.168.20.1/24

client B: 192.168.20.10/24

gateway: 192.168.20.1