Permalänk
Inaktiv

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.

Tog bort wan ip från en screenshot...
Permalänk
Inaktiv

Jag plockar bort SSH från External zonen tills jag har fixat autentisering med SSH nyckel.

Last login: Sun Jul 3 20:09:30 CEST 2022 on pts/0
Last failed login: Sat Jul 9 15:35:04 CEST 2022 from 221.1.223.60 on ssh:notty
There were 936 failed login attempts since the last successful login.

firewall-cmd --permanent --remove-service=ssh --zone=external