DIY x86 gateway v2

Két évvel ezelőtt íródott bejegyzésem folytatása, melyben lényegében ugyanazt a felépítést (router, tűzfal, gateway, VPN-szerver stb.) próbálom bemutatni egy más absztrakciós szintről. – írta: haddent, 4 éve

Előkészületek

QEMU, KVM, libvirt
Néhány csomag telepítése szükséges:

pacman -S libvirt virt-install
systemctl enable libvirtd
systemctl start libvirtd

Illetve a virtualizációt engedélyezni kell a BIOS-ban/UEFI-ben és a kernel paramétereknél is. Jelen esetben Intel CPU-val dolgozom, AMD esetén mást kell hozzáfűzni. Nagyjából így kell kinézzen egy entry systemd-bootd esetén:

cat /boot/loader/entries/arch.conf
## This is just an example config file.
## Please edit the paths and kernel parameters according to your system.

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=PARTUUID=dd4c9881-450a-4f6a-a8b5-d524f7399ee8 rootfstype=ext4 add_efi_memmap iommu=pt intel_iommu=on

Tehát a kernel paraméterekhez fűztük hozzá a iommu=pt intel_iommu=on részt

Következhet egy reboot, készen állunk.

KVM init script
Az előzőleg telepített virt-install segítségével egyszerűsödik a történet. Jelen esetben pci-passthrough-val fogok élni, tehát a NIC-ek teljes egészükben átadásra kerülnek a virtuális gép részére, a teljesítmény maximalizálása érdekében. Saját méréseim alapján a virtuális bridge interfész virtio driverrel <10% veszteséget jelent.

Az én installációs konfigom:

#!/bin/bash

virt-install \
--virt-type=kvm \
--name pfsense \
--ram 2048 \
--vcpus=2 \
--os-variant=freebsd11.1 \
--virt-type=kvm \
-v \
--cdrom=/server/kvm/pfsense.iso \
--host-device=pci_xxxx_yy_zzz \
--host-device=pci_xxxx_yy_zzz \
--graphics vnc \
--disk path=/server/kvm/pfsense.qcow2,size=10,bus=virtio,format=qcow2

Ha esetleg szükséges még virtuális interfészre is pluszban, akkor azt egy --network=bridge=bridge_neve,model=virtio résszel adhatjuk hozzá. (Természetesen utólag is szabadon variálhatóak az I/O-k.)
Nyilván az említett bridge-et létre kell hoznunk. Mivel kb. minden disztró más managert használ, ezért inkább a sztenderd ip és brctl paranccsal mutatnám meg:

ip link add name bridge_neve type bridge
brctl addif bridge_neve interfész_neve

Ha a hoszt gépet is fel szeretnénk kötni a LAN-ra majd, akkor IP-t is kell adnunk a bridge-nek:

ip a add 10.0.0.10/24 dev lan_bridge_neve

Illetve nem árt uppolni, route-okat létrehozni stb.

ip link set dev lan_bridge_neve up
ip route add default via 10.0.0.1/24 dev lan_bridge_neve
ip route add 10.0.0.0/24 dev lan_bridge_neve

Ez alapvetően nem permanens beállítás, tehát érdemes scriptet készíteni belőle, vagy nyilván optimálisabb egy manager konfigjában beállítani ezeket. Ilyen minimális konfig esetén pl. a systemd-networkd tökéletes. Arch esetén egyébként a netctl-t ajánlom.

A pci-passthrough-hoz először ki kell keresnünk a NIC-ek PCI-azonosítóját, melyhez a virsh nodedev-list --tree parancsot ajánlom, melyben fastruktúrába rendezve kereshetjük meg a megfelelő részt. Példa:

computer
|
+- net_lo_00_00_00_00_00_00
+- net_vnet0_fe_54_00_77_ee_63
+- pci_0000_00_00_0
+- pci_0000_00_01_0
| |
| +- pci_0000_01_00_0
|
+- pci_0000_00_02_0
| |
| +- drm_card0
| +- drm_renderD128
|
+- pci_0000_00_14_0
| |
| +- usb_usb2
| | |
| | +- usb_2_0_1_0
| |
| +- usb_usb4
| |
| +- usb_4_0_1_0
|
+- pci_0000_00_16_0
+- pci_0000_00_19_0
| |
| +- net_lan0_90_b1_1c_72_c2_98
|
+- pci_0000_00_1a_0
...

Itt a lan0 nevű interfész PCI-azonosítója pci_0000_00_19_0, értelemszerűen ezeket kell behelyettesítenünk az előző init scriptbe.

Init előtt érdemes leválasztani a NIC-eket: virsh nodedev-dettach <pci_azonosító>

Végül futtathatjuk az init scriptet, amely, ha minden jól megy, ki fogja írni, hogy várakozik az install befejezésére:

[root@homesever kvm]# ./pfsense.sh
WARNING Graphics requested but DISPLAY is not set. Not running virt-viewer.
WARNING No console to launch for the guest, defaulting to --wait -1

Starting install...
Allocating 'pfsense.qcow2' | 10 GB 00:00:01 Domain installation still in progress.
Waiting for installation to complete.

A cikk még nem ért véget, kérlek, lapozz!

Előzmények