Guide: Hemrouter med Enterprise Linux
Guide? Jag funderar på om det är rätt ord, "fumped tänker högt" kanske passar bättre. Förbered er på en TLDR om hur jag försökte få ur mer prestanda ur min router. Ni kommer troligtvis inte att kunna följa denna helt steg-för-steg. Kanske glömt något.
Lets go!
Bakgrund och problemställning:
Jag köpte en miniPC av märket Qotom på aliexpress för en massa år sedan för att använda som router. Den körde då ren Openbsd med pf och dhcpd och livet var bra fram till jag fick gigabitlina i nya lägenheten.
Den klarade att routa 100Mbit/s utan problem men när linan uppgraderades till Gbit så fick jag ut runt 400-500 Mbit/s som mest. Samma sak med pfsense som byggs på Freebsd, när man tankade något tungt gick CPU användning upp till max 20-30%, samma sak med rena iperf3-mätningar utan SNAT eller routing mot interfacen.
Har PCn för dålig CPU? Det är ~6W CPU med fyra trötta cores. Är Realteks drivrutiner i BSD varianterna dåliga? Låt oss testa med en Linuxkärna!
Kravställning:
pf i Openbsd är en fröjd att använda, konfigurationen är simpel och enkel att förstå. Pfsense har ett fint GUI som är specifikt designat att använda som router/brandvägg. Ren enterprise Linux, not so much. Det finns projekt som OpenWRT som baseras på Linux som troligtvis fungerat fint men jag väljer att göra det svårt för mig och eventuellt lära mig något på vägen.
Vad krävs av min router?
Routing (duh) i 1Gbit/s
DHCP-server
SNAT
En metod att managera brandväggsregler
Wireguard VPN-endpoint till en server som står remote.
snmp-demon för övervakning
Metod:
Som titeln nämner ska vi använda en variant av Enterprise Linux (RHEL) som är en produkt från Red Hat och är i princip branschstandard på servrar. Red Hat-distar är det jag har mest erfarenhet av i jobbet och en av få distar jag anser kommer med defaultinställningar som inte är helt idiotiska.
https://www.redhat.com/
RHEL är en stabil* Linuxdistribution för enteprisemiljöer, finns i både workstation och en mängd serverversioner.
Red Hats komponenter är för det mesta open source men kräver en licens för att använda, antingen en gratis utvecklarlicens eller ett enteprisekontrakt. Det skippar jag helst :). Det fina med open source är att det finns mängder av kloner som är fullt kompatibla med RHEL. Centos, Rocky Linux, Alma Linux, Oracle linux, Scientific Linux etc. De siktar på att vara 100% kompatibla med RHEL-mjukvara utan att kosta en krona.
Jag har valt att använda Centos Stream 9. Centos stream 9 är en rullande dist som är API/ABI kompatibel med RHEL 9 som fungerar som upstream till nästa punktrelease av RHEL. Dvs, ist för att köra Centos 9.0, 9.1, 9.2 etc så kommer OSet bara vara Stream 9.
*stabil som i "ändras inte". Inte den felaktiga redditdefinitionen "kraschar inte" som man hör om och om igen :).
Läs mer här: https://bitdepth.thomasrutter.com/2010/04/02/stable-vs-stable...
Hårdvaran vi har att jobba med:
Qotom Mini PC. Jag tror att det är en variant av denna jag köpte: https://www.aliexpress.com/item/32863982193.html
Intel Celeron N3160, 4C 4T. Passivt kyld.
https://www.intel.com/content/www/us/en/products/sku/91831/in...
4GB DDR3 RAM 1600Mhz
32GB msata SSD
RTL8111E PCI Express Gigabit Ethernet Controller
Mitt LAN befinner sig på nät 192.168.3.0/24. Wireguard peers på 192.168.5.0/24
Zonbaserade brandväggar och firewalld:
Jag ska försöka att använda Centos som all-mighty Red hat anser att OSet ska användas utan att försöka röja runt för mycket med externa paket och fulhack. Så, vi ska använda oss av en zonbaserad brandvägg - firewalld. Firewalld är ett frontend till linuxkernels nftables.
https://firewalld.org/
https://wiki.nftables.org/wiki-nftables/index.php/What_is_nft...
Kort summerat, i en zonbaserad brandvägg så definerar man regelverk i zoner som ligger som ett overlay över hårdvara så man slipper tänka på saker som IP adresser, fysiska NICs etc, samma regelverk kan appliceras överallt.
Okej, nu skriver jag för mycket om saker som går att googla. Ska hålla käft.
Fysisk topologi:
Logisk topologi
Tanken här är att remote-servern ska använda sig av samma regelverk som mitt LAN hemma och bete sig som en lokal maskin.
Mini PC på lite större PC
Välbehövd BIOS uppgradering:
Jag använder mig av centos streams minimala installationsfil. CentOS-Stream-9-latest-x86_64-boot.iso
Fyra pingviner = fyra kärnor!
Jag kommer inte att följa Red hats partitioneringsguide slaviskt.
https://access.redhat.com/documentation/en-us/red_hat_enterpr...
Det blir en standard xfs med LVM, enda ändringen från default är en egen partition till /var/log.
Installerar bara development tools, annars helt standard.
Wan interfacet är DHCP klient
Statisk IP på LANet.
Satte statisk IP på min PC och i har SSH grabbar! Tillbaka till skåpet med dig. Inga fler mobilbilder på min skärm.
Installerar EPEL för att få tillgång till mer paket. Osäker på om jag ens behöver göra detta men whatever.
https://docs.fedoraproject.org/en-US/epel/#_el9
dnf config-manager --set-enabled crb
dnf install epel-release epel-next-release
Installerar wireguard-tools, iperf3, en fungerande texteditor, htop, snmp-demonen, lm_sensors för att se temps och en dhcp-server.
dnf install iperf3 vim wireguard-tools dhcp-server net-snmp lm_sensors
Kan vi köra Gigabit mot interfacen ens?
[root@ertr ~]# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.3.39, port 42240
[ 5] local 192.168.3.1 port 5201 connected to 192.168.3.39 port 42256
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 110 MBytes 923 Mbits/sec
[ 5] 1.00-2.00 sec 112 MBytes 941 Mbits/sec
[ 5] 2.00-3.00 sec 112 MBytes 941 Mbits/sec
[ 5] 3.00-4.00 sec 112 MBytes 941 Mbits/sec
[ 5] 4.00-5.00 sec 112 MBytes 941 Mbits/sec
[ 5] 5.00-6.00 sec 112 MBytes 941 Mbits/sec
[ 5] 6.00-7.00 sec 112 MBytes 941 Mbits/sec
[ 5] 7.00-8.00 sec 112 MBytes 941 Mbits/sec
[ 5] 8.00-9.00 sec 112 MBytes 941 Mbits/sec
[ 5] 9.00-10.00 sec 112 MBytes 941 Mbits/sec
[ 5] 10.00-10.00 sec 62.2 KBytes 857 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 1.09 GBytes 940 Mbits/sec receiver
Eeeey, close enough. verkar lovande.
Skapa en ny fil under /etc/sysctl.d/ för att overrida värdet net.ipv4.ip_forward = 1. Linuxkärnan är ingen router utan den raden.
vim /etc/sysctl.d/99-router.conf
cat /etc/sysctl.d/99-router.conf
net.ipv4.ip_forward = 1
Starta routingen utan att boota om:
sysctl -p
Konfigurerar dhcp servern för mitt subnät. Samma conf som min tidigare openbsd installation. Statisk Ip för min raspberry pi och cloudflares DNS servrar.
vim /etc/dhcp/dhcpd.conf
authoritative;
subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.20 192.168.3.200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.3.255;
option routers 192.168.3.1;
option domain-name-servers 1.1.1.1, 1.0.0.1;
default-lease-time 600;
max-lease-time 7200;
host rpi {
hardware ethernet b8:27:eb:c2:18:79;
fixed-address 192.168.3.46;
}
Starta dhcpd demonen:
systemctl start dhcpd
Starta dhcpd vid boot:
systemctl enable dhcpd
journalctl -u dhcpd
Jul 02 22:05:55 ertr dhcpd[894]: Server starting service.
Jul 02 22:05:56 ertr dhcpd[894]: DHCPDISCOVER from 78:45:58:60:6e:80 via enp2s0
Jul 02 22:05:57 ertr dhcpd[894]: DHCPOFFER on 192.168.3.112 to 78:45:58:60:6e:80 (ewifi) via enp2s0
Jul 02 22:05:57 ertr dhcpd[894]: DHCPREQUEST for 192.168.3.112 (192.168.3.1) from 78:45:58:60:6e:80 (ewifi) via enp2s0
Jul 02 22:05:57 ertr dhcpd[894]: DHCPACK on 192.168.3.112 to 78:45:58:60:6e:80 (ewifi) via enp2s0
Jul 02 22:06:11 ertr dhcpd[894]: DHCPDISCOVER from b0:4a:39:06:22:c3 via enp2s0
Jul 02 22:06:12 ertr dhcpd[894]: DHCPOFFER on 192.168.3.20 to b0:4a:39:06:22:c3 via enp2s0
Jul 02 22:06:12 ertr dhcpd[894]: DHCPREQUEST for 192.168.3.20 (192.168.3.1) from b0:4a:39:06:22:c3 via enp2s0
Jul 02 22:06:13 ertr dhcpd[894]: DHCPACK on 192.168.3.20 to b0:4a:39:06:22:c3 via enp2s0
Jul 02 22:06:32 ertr dhcpd[894]: DHCPDISCOVER from b8:27:eb:c2:18:79 via enp2s
It wörks
Firewalld har flera fördefinerade zoner. Zonen external passar bra att lägga in WAN-interfacet i. Jag öppnar för SSH och Wireguard.
Notera linjen "masquerade: yes" Det är denna som gör att vi får trafik Source-NATad ut på internet från andra zoner.
firewall-cmd --zone=external --change-interface=enp1s0
firewall-cmd --add-service=wireguard --zone=external
firewall-cmd --add-service=ssh --zone=external
[root@ertr ~]# firewall-cmd --zone=external --list-all
external (active)
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: ssh wireguard
ports:
protocols:
forward: yes
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Skapar upp wireguard-interfacet så länge så jag kan lägga in denna i firewalld:
ip link add dev wg0 type wireguard
LAN och wireguard interfacen ska in i zonen Home. Home har massa skräp tillåtet så de måste också bort:
firewall-cmd --zone=home --change-interface=enp2s0
firewall-cmd --zone=home --change-interface=wg0
firewall-cmd --remove-service=cockpit --zone=home
firewall-cmd --remove-service=dhcpv6-client --zone=home
firewall-cmd --remove-service=mdns --zone=home
firewall-cmd --remove-service=samba-client --zone=home
Tillåta snmp för monitorering:
firewall-cmd --add-service=snmp --zone=home
[root@ertr ~]# firewall-cmd --zone=home --list-all
home (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: enp2s0 wg0
sources:
services: snmp ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ertr ~]# firewall-cmd --get-active-zones
external
interfaces: enp1s0
home
interfaces: wg0 enp2s0
Tillåt forwarding inom samma zon så LAN och Wireguard kan nå varandra:
firewall-cmd --zone=home --add-forward
Spara ner runtime confen till startup:
[root@ertr ~]# firewall-cmd --runtime-to-permanent
success
[root@ertr ~]# firewall-cmd --reload
success
Kopierar in min gamla wireguardconf och startar upp:
mv wg0.confg /etc/wireguard/wg0.conf
[root@ertr ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.5.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[root@ertr ~]# wg show
interface: wg0
public key: oN2dd3yhemUBu7mRUVgb5fjyt8+RH+mBDyJhkzZjrjc=
private key: (hidden)
listening port: 51820
peer: 6Fv56PgiT9KwL1b5icBJlG8s6m3zENlF966MjDya+AA=
endpoint: CENSUR:47688
allowed ips: 192.168.5.2/32
latest handshake: 2 minutes, 10 seconds ago
transfer: 1.55 KiB received, 1.65 KiB sent
persistent keepalive: every 25 seconds
Når vi remote-servern?
[root@ertr ~]# ping 192.168.5.2
PING 192.168.5.2 (192.168.5.2) 56(84) bytes of data.
64 bytes from 192.168.5.2: icmp_seq=1 ttl=64 time=12.5 ms
64 bytes from 192.168.5.2: icmp_seq=2 ttl=64 time=12.6 ms
Klart vi gör
Fixar så wireguard startar vid varje boot:
systemctl enable wg-quick@wg0.service
Vi skulle ha snmp för monitorering av interface också. Inget speciellt här, väldigt default
vim /etc/snmp/snmpd.conf
[root@ertr ~]# cat /etc/snmp/snmpd.conf
# Change RANDOMSTRINGGOESHERE to your preferred SNMP community string
com2sec readonly default roevballe
group MyROGroup v2c readonly
view all included .1 80
access MyROGroup "" any noauth exact all none none
syslocation Rack, Room, Building, City, Country [Lat, Lon]
syscontact Your Name <your@email.address>
#OS Distribution Detection
extend distro /usr/bin/distro
#Hardware Detection
# (uncomment for x86 platforms)
extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor'
extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name'
extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial'
# (uncomment for ARM platforms)
#extend hardware '/bin/cat /sys/firmware/devicetree/base/model'
#extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number'
systemctl start snmpd
systemctl enable snmpd
Har vi gigabit?
Jorå!
Och min monitoreringsserver "haru" kan nå remote-servern "fuyu" via tunneln på ertr!
CPUn ser ut att utnyttjas ordentligt med Linux. Inte illa för en 6W CPU från 2016?
Min Qotom får leva i några år till.