veldi

Byggjum virki: Homelab v1.0

Í langan tíma hef ég sætt mig við að nota á heimanetinu mínu netbeina sem ég hef leigt af fjarskiptafyrirtækjum eða sem fylgt hafa þeim íbúðunum sem ég hef haldið mig til í. Slíkir beinar nota venjulega lokaðann hugbúnað með óþörfu flækjustigi, skorti á öryggisuppfærslum, takmörkuðum stillingum og svo má lengi telja. Þessir eiginleikar draga mjög úr öryggi heimanetsins sem og stjórn okkar á netumferð á milli tækja á innra netinu og á milli beinisins og internetsins. Þannig fyrirkomulag væri allt í lagi ef öryggi og stjórn á stakri tölvu væri það eina sem skipti mig máli, en nú er ég líka með raspberry pi 5 netþjón, konu mína sem ég vil vernda með VPN og öðrum aðferðum, auk fleiri netþjóna sem ég hef auga á að setja upp, eins og:

Svo þessi netuppsetning er í raun upphafið að því sem við getum kallað „homelab“. Það er fyrsta útgáfa þess sem ég lýsi í þessari grein og það er því frekar einfalt eins og sést á myndinni hér að neðan, en því er ætlað að vera stækkanlegt með stýrðum annars-netlags netskipti sem ég mun skoða síðar:

uppsetning nets

Hér á eftir mun ég tala um mikilvæga þætti í netuppsetningunni. Ég hef breytt og sleppt nokkrum óþörfum atriðum í uppsetningunni minni hér, en annars er hún mjög lík þeirri sem ég nota. Til að hafa þetta í styttri kantinum sleppi ég öllum skipunum sem raunverulega virkja stillingarnar sem ég sýni. Ég geri ráð fyrir að lesandinn skoði leiðbeiningar OpenBSD og OpenWRT til að fá frekari upplýsingar ef þess þarf. Með tækin fullstillt ætti að vera nóg að endurræsa þau til að allar stillingarnar taki gildi í einu. Það hefur alltaf hjálpað mér að skoða dæmi um uppsetningar á meðan ég læri svo ég vona að þessi grein geti komið einhverjum að gagni.

Netbeinir

Ég setti eftirfarandi kröfur fyrir netbeininn:

Augljósi kosturinn eftir smá leit var einn af þessum Protectli Vault Pro netbeinum og ég náði mér í VP2440 án þráðlausra parta og með Dasharo Coreboot sem slekkur á IME). Ég hafði reyndar mikinn áhuga á einum af þessum PC Engines APUs, en PC Engines hafa ekki verið í viðskiptum síðastliðin þrjú ár eða svo. APUs eru ódýrari, hafa minna af óþarfa vélbúnaði sem ég þarf í raun ekki og enga IME. Þeir hafa svipaðan hlut og IME sem ég ætla að kalla verkvangsöryggisörgjörva (PSP), en það er ekki eins alvarlegt, en samt slæmt. Hei, ég vildi að vélbúnaðarframleiðendur hættu þessum bakdyrahneigðum, en allt sem ég get gert er að minnsta kosti að slökkva á því sem ég get af því. Það sem VP2440 hefur líka yfir APUin eru tvö SFP+ tengi sem leyfa 10Gb tengingu. Þó að ég þurfi aðeins 1Gb tengingu í bili fannst mér gott að hafa þann möguleika upp á framtíðina að gera.

Ég setti upp OpenBSD á netbeininum án neinna X skráasetta, en hélt þýðendakráarsettinu ef skyldi vera að ég þyrfti á henni að halda á meðan ég er enn að venjast OpenBSD. Þegar ég er orðinn reyndari í þessu gæti ég mögulega sleppt því skráarsetti líka til að auka öryggi. Ég valdi hýsisnafnið steelix. Já, ég valdi pokémon þema fyrir hýsisnöfnin mín til að bæta smá fjöri og nostalgíu í blönduna. Ég átti einu sinni Steelix sem ég gerði nánast óstöðvandi með því að dæla í hann járni og HP ups hvenær sem ég gat. Mér finnst sú lýsing passa ágætlega við ætlun mína með þennan netbeini.

Fjarskiptafyrirtæki og WAN tengi

Með SFP+ tengi gat ég stungið ljósleiðaranum frá ljósleiðafyrirtæki beint í netbeininn með 1Gb SFP ONTu og ég gæti farið upp í 10Gb SFP ONTu í framtíðinni ef þörf krefur. Ég þarf þessvegna ekki að hafa venjulegt ONT box lengur og netbeinirinn fær WAN IP tölu frá beint frá fjarskiptafyrirtækinu, sem einfaldar alla uppsetninguna. Hér á Íslandi fann ég bara einn ljósleiðaraheildsala sem studdi tengingu með SFP ONTu og það er Míla. Ég þurfti líka að finna fjarskiptafyrirtæki sem gefur út fasta IP-tölu og styður ljósleiðara Mílu og það sem ég fann var Hringiðan. IP-talan er bundin við PPPoE notandanafn og lykilorð sem manni er gefið. Síðan til að tengjast internetinu á netbeininum, setti ég eftirfarandi inn í /etc/hostname.pppoe0 og skipti authname og authkey út fyrir notandanafnið og lykilorð:

inet 0.0.0.0 255.255.255.255 NONE \
    pppoedev ixl0 authproto chap \
    authname 'authname' authkey 'authkey' up
dest 0.0.0.1
inet6 eui64
!/sbin/route add default -ifp pppoe0 0.0.0.1
!/sbin/route add -inet6 default -ifp pppoe0 fe80::%pppoe0

Ég setti líka einfaldlega up í /etc/hostname.ixl0 til að virkja innstunguna sem ljósleiðarinn og SFP ONTan eru tengd í.

Þráðlaus aðgangsstaður

Að hafa ekki neina þráðlausa nettengingu á netbeininum var gert vísvitandi til að auka öryggi þessa hjarta netsins. Þráðlaus nettenging eykur flækjustig og hver sem er sem er nógu nálægt netbeininum getur reynt að tengjast honum, þannig það býr til fleiri hugsanlegar leiðir til að brjótast inn á netið. Við viljum samt þráðlausa nettengingu á heimilinu í bili þannig að hugmyndin er að hafa sérstakan þráðlausan aðgangsstað (WAP) sem auðvelt er að einangra. Af því sem ég hef lært af OpenBSD er að það á það til að hafa ekki góðan stuðning fyrir þráðlausar tengingar yfir höfuð, sem er skiljanlegt þar sem það er flókið að innleiða og krefst oft meiri mannafla en tiltækur er fyrir stýrikerfi eins og þetta, og kannski er það ekki í hæsta forgangi heldur vegna öryggisáherslu þess. Þannig ég takmarkaði leitina við netbeina sem keyra OpenWRT þar sem OpenWRT og Linux almennt hafa meiri þráðlausan stuðning. OpenWRT er frekar mögur útgáfa af Linux án systemd og öðru slíku flækjustigi, svo ég lít á það sem plús varðandi öryggi.

Fyrst rak ég augun í start9 netbeininn, aðallega vegna þess að hann keyrir á RISC-V tölvuarkitektúr sem gerir það að verkum að vélbúnaðarframleiðendur þurfi ekki að borga gjöld fyrir að nota hann eins og annars tíðkast. Í raun dreifir notkun RISC-V framleiðslu vélbúnaðar meira, eykur stuðning við smærri framleiðendur og gefur okkur fleiri valmöguleika fyrir aðfangakeðju vélbúnaðar okkar, sem vonandi skilar sér í áreiðanlegri vélbúnaði án bakdyra. Mig vantaði hins vegar nothæfan WAP sem fyrst, svo ég ákvað að bíða með þennan netbeini. Á endanum ákvað ég að ná mér í OpenWRT One netbeininn til að setja í hlutverk einfalds WAP. Þegar ég tala um netbeini hérna framvegis er ég að tala um VP2440.

Eitt flott sem hægt er að gera með OpenWRT er að hafa mörg þráðlaus net sem þú getur tengst á einu WAP og þú getur haft hvert net á sérstöku VLAN, sem er það sem ég gerði. Þessi VLAN geta hvert og eitt haft sín eigin aðgangsréttindi sem stillt eru á netbeininum, t.d. mismunandi aðgangsréttindi fyrir gesti, fjölskylduna og svo framvegis. Ég gæti prófað að setja upp Tollgate pakka á WAPnum á sérstöku VLAN á einhverjum tímapunkti líka, því það væri gaman að vita að ég gæti rukkað einhverja ókunnuga fyrir að tengjast ef ég vildi.

OpenWRT stillingin mín á WAPnum er svipuð eftirfarandi, til að byrja með /etc/config/network:

config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fdab:853:1fb8::/48'

config interface 'privileged'
        option type 'bridge'
        option stp '1'
        option ifname 'eth0.3'
        option proto 'none'
        option auto '1'
        option delegate '0'

config interface 'family'
        option type 'bridge'
        option stp '1'
        option ifname 'eth0.4'
        option proto 'none'
        option auto '1'
        option delegate '0'

config interface 'br-lan'
        option type 'bridge'
        option stp '1'
        list ifname 'eth0.5'
        list ifname 'eth1'
        option proto 'none'
        option auto '1'
        option delegate '0'

config interface 'guest'
        option type 'bridge'
        option stp '1'
        option ifname 'eth0.6'
        option proto 'none'
        option auto '1'
        option delegate '0'

Allar nema fjórar síðustu „interface“ skilgreiningarnar voru til fyrir í stillingunum. Hver þessarra fjögurra skilgreininga er með list ifname 'eth0.N' sem þýðir að það brúar eth0 ethernet tengið (sem tengist andstreymis við netbeininn) með netumferðina merkta sem VLAN N. br-lan skilgreiningin brúar líka hitt ethernet tengið á WAPnum og hinar þrjár skilgreiningarnar eru notaðar fyrir viðkomandi þráðlaus net í /etc/config/wireless:

config wifi-device 'radio0'
        option type 'mac80211'
        option path 'platform/soc/18000000.wifi'
        option band '2g'
        option channel '1'
        option htmode 'HE20'
        option num_global_macaddr '7'
        option disabled '0'
        option country 'IS'

config wifi-iface 'privileged_radio0'
        option device 'radio0'
        option network 'privileged'
        option mode 'ap'
        option ssid 'Eagle'
        option encryption 'psk2'
        option key 'some-password'

config wifi-iface 'family_radio0'
        option device 'radio0'
        option network 'family'
        option mode 'ap'
        option ssid 'Shrimp'
        option encryption 'psk2'
        option key 'some-password'

config wifi-iface 'guest_radio0'
        option device 'radio0'
        option network 'guest'
        option mode 'ap'
        option ssid 'Magpie'
        option encryption 'psk2'
        option key 'some-password'

config wifi-device 'radio1'
        option type 'mac80211'
        option path 'platform/soc/18000000.wifi+1'
        option band '5g'
        option channel '36'
        option htmode 'HE80'
        option num_global_macaddr '7'
        option disabled '0'
        option country 'IS'

config wifi-iface 'privileged_radio1'
        option device 'radio1'
        option network 'privileged'
        option mode 'ap'
        option ssid 'Eagle'
        option encryption 'psk2'
        option key 'some-password'

config wifi-iface 'family_radio1'
        option device 'radio1'
        option network 'family'
        option mode 'ap'
        option ssid 'Shrimp'
        option encryption 'psk2'
        option key 'some-password'

config wifi-iface 'guest_radio1'
        option device 'radio1'
        option network 'guest'
        option mode 'ap'
        option ssid 'Magpie'
        option encryption 'psk2'
        option key 'some-password'

Hvert „wifi-iface“ er skilgreint einu sinni fyrir hvert tíðnisvið sem hægt er að nota. Þá er allt komið sem þarf til að virkja WAPinn.

VPN með Wireguard og Rdomains

Ég vildi að sumar vélar myndu nota VPN og aðrar ekki, þannig að í stað þess að bjagast við það að setja upp VPN á hverju tæki bætti ég bara við nýju rdomain á netbeininum, en það er sérstakur netstafli sem vísar umferð út á internetið í gegnum wireguard útgang. Þannig kemst ég líka frá því takast á við vesenið við að fá tækin mín til að tala saman í gegnum innra netið ef sum þeirra eru VPN tengd. Til að setja þetta upp þannig bjó ég til /etc/hostname.wg0:

rdomain 1
wgkey <private-key>
wgpeer <public-key> wgendpoint <ip-address-1> <port> wgaip 0.0.0.0/0
inet <ip-address-2> 255.255.255.255
!route -T1 add default -net <ip-address-2>

Síðan fyllti ég út upplýsingarnar í svigunum í samræmi við VPN veituna mína.

LAN tengi

Ég tengdi SFP-ethernet millistykki í SFP+ tengið sem eftir var og þá var ég kominn með 3 ethernet tengi fyrir LANið. Ég vildi að einn þeirra væri á VPN og annar þeirra þar sem WAP tengist. Eagle þráðlausa netið átti líka að vera undir VPN svo ég varð að ganga úr skugga um að VLAN 3 væri stillt þannig. Til að stilla þetta setti ég VPN LAN stillingarnar í /etc/hostname.ixl1:

rdomain 1
inet 192.168.10.1 255.255.255.0 192.168.10.255

Ég setti venjulega LAN tengið í /etc/hostname.igc0:

inet 192.168.20.1 255.255.255.0 192.168.20.255

Fyrir WAP LAN tengið skrifaði ég einfaldlega ‘up’ í ‘/etc/hostname.igc1’ og bjó til VLAN netin líka, og byrjaði á VPN netinu í ‘/etc/hostname.vlan0’:

create
parent igc1 vnetid 3
rdomain 1
inet 192.168.3.1 255.255.255.0 192.168.3.255 description "AP Privileged"

Síðan kemur restin af VLAN netunum, og byrjum á /etc/hostname.vlan1:

create
parent igc1 vnetid 4
inet 192.168.4.1 255.255.255.0 192.168.4.255 description "AP Family"

Síðan /etc/hostname.vlan2:

create
parent igc1 vnetid 5
inet 192.168.5.1 255.255.255.0 192.168.5.255 description "AP LAN port"

Og að lokum etc/hostname.vlan3:

create
parent igc1 vnetid 6
inet 192.168.6.1 255.255.255.0 192.168.6.255 description "AP Guest"

DHCP og DNS

Á netbeininum nota ég dhcpd til að útdeila IP-tölum, sjálfgefnum leiðum og DNS-þjónum í öll tæki og unbound sem DNS-þjón. Ég setti þetta inn í /etc/dhcpd.conf:

subnet 192.168.20.0 netmask 255.255.255.0 {
        option domain-name-servers 192.168.20.1;
        option routers 192.168.20.1;
        range 192.168.20.2 192.168.20.254;
}

# Family
subnet 192.168.4.0 netmask 255.255.255.0 {
        option domain-name-servers 192.168.4.1;
        option routers 192.168.4.1;
        range 192.168.4.2 192.168.4.254;
}

# AP LAN
subnet 192.168.5.0 netmask 255.255.255.0 {
        option domain-name-servers 192.168.5.1;
        option routers 192.168.5.1;
        range 192.168.5.2 192.168.5.254;
}

# Guest
subnet 192.168.6.0 netmask 255.255.255.0 {
        option domain-name-servers 192.168.6.1;
        option routers 192.168.6.1;
        range 192.168.6.2 192.168.6.254;
}

og inn í „server“ hlutann í /var/unbound/etc/unbound.conf:

server:
	interface: 192.168.20.1
	interface: 192.168.4.1
	interface: 192.168.5.1
	interface: 192.168.6.1
	interface: 127.0.0.1
	#interface: 127.0.0.1@5353	# listen on alternative port
	interface: ::1
	#do-ip6: no

	# override the default "any" address to send queries; if multiple
	# addresses are available, they are used randomly to counter spoofing
	#outgoing-interface: 192.0.2.1
	#outgoing-interface: 2001:db8::53

	access-control: 0.0.0.0/0 refuse
	access-control: 127.0.0.0/8 allow
	access-control: ::0/0 refuse
	access-control: ::1 allow
	access-control: 192.168.20.0/24 allow
	access-control: 192.168.4.0/24 allow
	access-control: 192.168.5.0/24 allow
	access-control: 192.168.6.0/24 allow
  ...

Ég passaði upp á að virkja þjónusturnar:

rcctl enable dhcpd unbound

Ofangreindar stillingar virka aðeins fyrir rdomain 0 þar sem dhcpd og unbound nota aðeins netstafla sem tengist einu rdomain í einu. Þess vegna þurfti ég að búa til annað dhcpd config /etc/dhcpd1.conf:

subnet 192.168.10.0 netmask 255.255.255.0 {
        option domain-name-servers <ip-address>;
        option routers 192.168.10.1;
        range 192.168.10.2 192.168.10.254;
}

# Privileged
subnet 192.168.3.0 netmask 255.255.255.0 {
        option domain-name-servers <ip-address>;
        option routers 192.168.3.1;
        range 192.168.3.2 192.168.3.254;
}

Ég lét IP-tölu domain-name-servers vera sú sem VPN-veitan gaf upp. Allt sem var eftir var svo að búa til annað tilvik af dhcpd sem notar þessa stillingu og rdomain 1:

ln -s /etc/rc.d/dhcpd /etc/rc.d/dhcpd1
rcctl set dhcpd1 flags -c /etc/dhcpd1.conf -l /var/db/dhcpd1.leases
rcctl set dhcpd1 rdomain 1
rcctl enable dhcpd1

Eldveggur og NAT

Til að halda góðri stjórn á netumferðinni stillti ég PF á netbeininum. Ég byggði á nokkrum dæmum um stillingar og gerði nokkrar tilraunir þar til ég sættist á eftirfarandi stillingar í /etc/pf.conf:

int_if_1 = "ixl1"
int_if_2 = "igc0"
wap = "igc1"
int_ifs = "{" $int_if_1 $int_if_2 vlan "}"
table <int_networks> const { $int_if_1:network $int_if_2:network vlan:network }
table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
	 	   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
	 	   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
	 	   203.0.113.0/24 }

set skip on lo
match in all scrub (no-df random-id max-mss 1440)
match out on egress inet from ! (egress:network) to ! <int_networks> nat-to (egress:0)
match out on wg0 inet from ! (wg0:network) to ! <int_networks> nat-to (wg0:0)
antispoof quick for { egress $int_if_1 $int_if_2 vlan }
block in quick on egress from <martians> to any
#block return out quick on egress from any to <martians>
block all
pass out on { egress wg0 } inet
pass out on $int_if_1 proto tcp from $int_if_2:network to port { ssh }
pass out on vlan0 proto tcp from $int_if_2:network to vlan0:network port http
pass in on $int_ifs inet
pass in on $int_if_2 proto tcp to $int_if_1:network port { ssh } rtable 1
pass in on $int_if_2 proto tcp to vlan0:network port http rtable 1

Í stuttu máli er lokað fyrir alla umferð sem á upptök sín frá internetinu inn á netbeininn en öll umferð sem á upptök sín frá innra netinu er leyfð út á internetið. Tækin á innra netinu geta ekki átt samskipti sín á milli fyrir utan það að ég get tengst með ssh frá fartölvunni minni yfir í raspberry piið raichu og fengið aðgang að sumum vefviðmótum í gegnum http á Eagle þráðlausa netinu / VLAN 3. Ég keyri líka alla netumferð út á internetið í gegnum NAT.

Með allar þessar stillingar á sínum stað og netbeininn og WAP endurræst og tengd eins og sýnt er á myndinni í upphafi greinarinnar, þá er „homelab“ v1.0 tilbúið!

Niðurstaða

Þessi grunnuppsetning hefur reynst okkur mjög vel og ég mun framlengja hana smám saman og breyta eftir því sem á líður. Það að fara í gegnum þetta ferli hefur kennt mér mikið og er ég þakklátur fyrir það sem OpenBSD og OpenWRT gera okkur kleyft til að taka stjórn á netkerfum okkar. Ein áhrif þess að hafa svona mikla stjórn á netinu með öryggismiðuðu stýrikerfi eins og OpenBSD er að ég er miklu minna hikandi við að keyra hvers kyns tæki með útblásnum, blakkbox, öryggismartraðar stýrikerfum og öppum þess, vá, ég gæti jafnvel höndlað Windows box. Svo lengi sem netkerfi tækisins er undir minni stjórn, get ég höndlað það af öryggi.

Ég vona að þessi grein hafi verið gagnleg eða að minnsta kosti hvetjandi og ég þakka allar athugasemdir eða spekúleringar. Sjáumst síðar!


Komment

Farðu á kommentasvæði færslunnar á Nostr með appi eða vefappi.