Posted on ::

Dzisiaj będzie o architekturze sieci, jaką planuję uskutecznić na moim homelabie. Założenie cały czas jest takie samo - wszystko na jednej maszynie. Komputer ma dwa gniazda Ethernet. Do pierwszego wpinam kabel wystający ze ściany, od teraz serwer ma (będzie miał) dostęp do internetu. Do drugiego gniazda podłączam punkt dostępu Wi-Fi - tak naprawdę to router, który dostałem od dostawcy internetu, ale robi robotę, a ja oszczędzam pieniądze - i dalej każde inne urządzenie jakie mam, podłączam do tego AP. Temat sprzętu załatwiony. Teraz oprogramowanie.

Na serwerze uruchomione będzie wiele aplikacji na maszynach wirtualnych i w kontenerach, sam homelab będzie pełnił rolę routera, zarządzającego ruchem sieciowym pomiędzy urządzeniami. I teraz: niektóre z tych aplikacji i urządzeń powinny mieć dostęp do internetu, inne nie powinny, a jeszcze inne nie powinny w ogóle mieć dostępu do czegokolwiek. Trzeba ten piękny ustrój rozbić na dzielnice.

Dzielenie sieci na segmenty wymaga pewnego zrozumienia, jak sieci w ogóle działają, oraz znajomości nomenklatury. Na początek słowniczek. Interfejs sieciowy (network interface, network device) to w uproszczeniu "punkt wejścia" urządzenia do sieci - może to być gniazdo Ethernet w komputerze, moduł Wi-Fi w telefonie, albo wirtualny port w maszynie wirtualnej (ją też musimy jakoś do sieci podłączyć). Warto zwrócić uwagę, że jedno urządzenie (np. komputer) może mieć więcej niż jeden interfejs sieciowy. Mostek sieciowy to taki "łącznik", do którego podłączamy różne interfejsy, tworząc w ten sposób segment. Warto wspomnieć jeszcze o wirtualnej sieci lokalnej (VLAN), który pozwala na zgrupowanie wybranych interfejsów i logiczne wydzielenie ich z danego segmentu, nawet jeśli wszystkie są podłączone do tego samego mostka. Przyda się za chwilę.

Teraz kwestia ustalenia, jakie segmenty są mi potrzebne. Pierwsza kategoria to urządzenia fizyczne. Mam prywatny komputer oraz telefon, kilka urządzeń smart home, takich jak odkurzacz, żarówki czy odświeżacz powietrza, telewizor z webOS. Bardzo rzadko, ale czasami mam też gości, którzy przynoszą swoje własne telefony, i też chcą się podłączyć do internetu (właściwie to muszą - tłumienie sygnału komórkowego w moim mieszkaniu jest imponujące, bez Wi-Fi Calling się nie da). Ale mamy też urządzenia wirtualne, a raczej aplikacje i usługi na serwerze. Do obsługi urządzeń smart home planuję użyć Home Assistant, już teraz mam uruchomione wiele usług w kontenerach.

Segmenty, które wyłaniają się z tej listy pacjentów są następujące. Do obsługi wszystkich fizycznych urządzeń tworzę mostek LAN_BRIDGE, w ramach którego wydzielam sobie trzy VLAN-y. HOME_VLAN, do którego podłączam mój komputer oraz telefon, będzie miał dostęp do praktycznie wszystkiego w sieci. GUEST_VLAN będzie ograniczony jedynie do internetu - zakładam, że moim gościom niepotrzebny jest dostęp do mojego odkurzacza czy zdjęć na Immichu. IOT_VLAN, który będzie służył urządzeniom smart home, nie będzie miał dostępu nawet do internetu - za dużo razy czytałem w internecie o odkurzaczach wysyłających zdjęcia ich właścicieli na chińskie serwery, podziękuję. Do obsługi aplikacji serwerowych tworzę osobny mostek SERVER_BRIDGE. Nie hostuję co prawda żadnej strony internetowej z mojego homelaba - aktualnie używam do tego VPSa Mikrus, ale wspomnę, że istnieje coś takiego jak strefa zdemilitaryzowana (DMZ) - jaka piękna nazwa! - gdzie można wrzucić usługi dostępne publicznie, która jest całkowicie odseparowana od wszystkiego. Ostatnia rzecz to oczywiście mostek WAN_BRIDGE, żebyśmy w ogóle mieli możliwość połączenia się z internetem.

Do ogarnięcia jest kilka "pobocznych" tematów.

Pierwszy to przypisywanie adresów IP każdemu interfejsowi sieciowemu. W większości przypadków skorzystamy z protokołu dynamicznego konfigurowania hostów (DHCP), czyli protokołu, który automatycznie przypisuje urządzeniom w sieci adresy IP. Mostek WAN_BRIDGE możemy zignorować, bo tutaj adres IP dostaniemy od dostawcy internetu. Maszyny wpięte w mostek SERVER_BRIDGE będą miały statyczne adresy IP, dzięki temu cały system będzie deterministyczny, a musi tak być, żebym mógł go odtwarzać korzystając z OpenTofu (będzie o tym w przyszłości). W każdym VLAN-ie adresy również będą rozdawane przez DHCP. DMZ, jeśli powstanie, prawdopodobnie dostanie statyczny adres IP.

Kolejny etap to ustawienie zapory sieciowej, czyli w uproszczeniu reguł komunikacji pomiędzy różnymi sieciami i interfejsami. Dla przykładu: skoro sieć GUEST_VLAN ma mieć dostęp jedynie do internetu, to reguła będzie wyglądała mniej więcej jak Allow GUEST_VLAN → WAN_BRIDGE. I takie reguły trzeba stworzyć dla każdej pożądanej konfiguracji.

Jeszcze innym aspektem do zaopiekowania jest wirtualna sieć prywatna/VPN, czyli kolejny protokół, który umożliwi mi dostanie się do mojej sieci wewnętrznej z zewnątrz, ale bez konieczności otwierania dostępu komukolwiek innemu. Mój telefon czy komputer myśli wtedy, że jestem w moim mieszkaniu, podpięty do sieci HOME_VLAN, nawet jeśli jestem w takim na przykład Peru.

Kolejnym krokiem może być serwer nazw domen (DNS), którego zadaniem jest tłumaczenie adresów stron WWW na adresy IP. Oczywistą sprawą jest tłumaczenie adresów takich jak na przykład internet-czas-dzialac.pl na 51.68.137.154, ale w ramach DNS można też skonfigurować lokalne adresy, np. miniflux.lan, który załaduje najlepszy czytnik RSS serwowany prosto z lokalnego kontenera.

Wszystkie te rzeczy można z pomocą dokumentacji i różnych kursów internetowych bez problemu skonfigurować w OPNsense, które to oprogramowanie wybrałem do ogarniania mojej sieci. Po tym, jak postawiłem jakieś 80% wszystkiego, zdałem sobie sprawę z tego, że OPNsense jest bardziej problematyczny niż bym chciał. Jedną z tych wad jest fakt, że w samym interfejsie webowym w pakiecie dostajemy pełno usług, z których nie chcemy korzystać, i nie da się tego wyłączyć (albo mi się nie udało). Drugim, dużo poważniejszym problemem dla mnie jest brak prostego sposobu na automatyzację instalacji od nowa.

Pamiętacie wzmiankę o OpenTofu? W skrócie, jest to oprogramowanie, które potrafi "stawiać serwery" na podstawie konfiguracji zapisanej do pliku tekstowego. Piszesz sobie w terminalu tofu apply i homelab, wraz z maszynami wirtualnymi, mostkami, VPN-ami i wszystkimi innymi rzeczami pojawia się gotowe do użycia. OPNsense jest bardzo w tym temacie oporny i rozważam mocno przejście na VyOS, którego główną przewagą jest to, że można dosłownie całą sieć zdefiniować w jednym pliku config.boot. Potem wystarczy odpalić system w wersji live, załadować konfigurację - i sieć elegancko wstaje. Coś pięknego.

Oczywiście VyOS-a trzeba sobie samemu skompilować, szczególnie jeśli chce się mieć np. cloud-init, a jeszcze gdy robi się to na komputerze o innej architekturze, w dodatku w kontenerze, który próbuje uzyskać absurdalnie wysokie uprawnienia na hoście...

Będzie o czym pisać.