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
-
Hálózati bootolás "PXE nélkül" - iPXE
TFTP szerverről, SAN-ról, iSCSI-ról, NFS megosztásról, és sok egyébről is tudunk vele rendszert indítani.
-
DIY x86 router – szabadulj fel!
A routerem története: mikor jutott először eszembe, miért, hogy és miből, hogyan valósítottam meg.
-
Mobil adatátvitel - WAP (Múlt és jelen)
Mi a WAP? Mire használható? A WAP (Wireless Application Protocol) operációs rendszertől...