Kaip publikuoti namų serverį saugiai

Kodėl namų serveris be apsaugos – tai tarsi atviros durys į namus

Turbūt žinai tą jausmą, kai pagaliau sutvarkei savo namų serverį – gal tai Raspberry Pi su Nextcloud, gal senas kompiuteris su Plex ar Home Assistant – ir nori pasiekti jį iš bet kurios pasaulio vietos. Logika paprasta: atidarai portą maršrutizatoriuje, nukreipi srautą į serverį ir viskas veikia. Bet čia prasideda problema.

Internetas nėra draugiškas. Robotai, skeneriai ir automatizuoti įrankiai nuolat šukuoja visus galimus IP adresus ir bandys prisijungti prie bet kokio atviro porto. Jei turi atvirą 22 portą (SSH) be jokios papildomos apsaugos, garantuoju – per kelias valandas pamatysi šimtus nesėkmingų prisijungimo bandymų savo žurnaluose. Tai ne paranoja, tai realybė.

Šiame straipsnyje kalbėsime apie tai, kaip publikuoti namų serverį taip, kad galėtum juo naudotis iš bet kur, bet tuo pačiu nepaversti jo lengvu taikiniu. Čia nėra vieno universalaus sprendimo – viskas priklauso nuo to, ką nori pasiekti ir kiek esi pasiruošęs investuoti laiko.

Pirmiausia suprask, ką iš tikrųjų atidarai

Prieš darydamas bet ką, reikia suprasti pagrindinę koncepciją. Kai „publikuoji” serverį, iš esmės leidi išoriniam srautui pasiekti kažką tavo namų tinkle. Tai gali būti:

  • Tiesioginis porto atvėrimas (Port Forwarding) – paprasčiausias, bet ir pavojingiausias būdas
  • VPN tunelis – saugesnis, bet reikalauja kliento konfigūracijos
  • Reverse proxy per debesį – elegantiškas sprendimas, kurį naudoja daugelis
  • Tuneliavimo paslaugos – kaip Cloudflare Tunnel ar Ngrok

Kiekvienas iš šių metodų turi savo privalumų ir trūkumų. Svarbu suprasti, kad net ir „saugus” metodas gali tapti nesaugiu, jei neteisingai sukonfigūruosi pačią programą, kurią atidarai.

Vienas dažniausių klaidų – žmonės galvoja, kad jei naudoja nestandartinį portą (pvz., 8443 vietoj 443), tai juos apsaugos. Tai vadinamasis „security through obscurity” – apsauga per nežinomumą. Šiuolaikiniai skeneriai tikrina visus 65535 portus, taigi tai nepadeda beveik nieko.

Cloudflare Tunnel – geriausias pasirinkimas daugumai

Jei nori paprasčiausio ir kartu saugiausio sprendimo, Cloudflare Tunnel yra tai, ko ieškai. Principas paprastas: tavo serveris užmezga išeinantį ryšį su Cloudflare infrastruktūra, o Cloudflare perduoda srautą atgal. Tau nereikia atidaryti jokių portų maršrutizatoriuje.

Kaip tai veikia praktiškai:

  1. Užsiregistruoji Cloudflare (nemokama paskyra tinka)
  2. Perkeliame domeną į Cloudflare arba naudojame jų subdomeno paslaugą
  3. Serveryje instaliuojame cloudflared daemoną
  4. Sukonfigūruojame tunelį ir nukreipiame srautą

Instaliacija Ubuntu/Debian sistemoje atrodo taip:

curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
cloudflared tunnel login
cloudflared tunnel create mano-tunelis

Po to sukuri konfigūracijos failą ~/.cloudflared/config.yml:

tunnel: [tavo-tunelio-id]
credentials-file: /home/user/.cloudflared/[id].json

ingress:
  - hostname: serveris.manodomenas.lt
    service: http://localhost:8080
  - service: http_status:404

Didžiausias privalumas – Cloudflare automatiškai suteikia SSL sertifikatą, apsaugo nuo DDoS atakų ir gali filtruoti srautą pagal geografinę vietą ar kitus kriterijus. Nemokamame plane tai jau labai daug.

Tačiau yra ir minusas: tavo srautas eina per Cloudflare serverius. Jei nori visiško privatumo arba perduodi labai jautrią informaciją, tai gali būti problema. Bet namų Nextcloud ar Plex – visiškai tinka.

WireGuard VPN – kai nori visiško kontroliavimo

WireGuard yra šiuolaikinis VPN protokolas, kuris yra tiek paprastas, tiek greitas, tiek saugus. Jei nori, kad tik tu (ir gal šeimos nariai) galėtum pasiekti namų serverį, VPN yra idealiausias sprendimas.

Skirtingai nuo Cloudflare Tunnel, čia tau reikia atidaryti vieną portą – WireGuard naudoja UDP 51820. Bet tai yra vienas portas, o ne atviras HTTP/HTTPS srautas su visomis programomis.

Instaliacija serveryje:

sudo apt install wireguard
wg genkey | tee privatekey | wg pubkey > publickey

Konfigūracijos failas /etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = [serverio-privatus-raktas]

[Peer]
PublicKey = [kliento-viešas-raktas]
AllowedIPs = 10.0.0.2/32

WireGuard privalumas – jis yra kriptografiškai labai stiprus ir turi minimalų kodo bazę (apie 4000 eilučių, palyginti su OpenVPN tūkstančiais). Mažiau kodo – mažiau potencialių saugumo skylių.

Praktinis patarimas: jei tavo interneto tiekėjas suteikia dinaminį IP adresą (o taip dažniausiai ir yra), naudok dinaminio DNS paslaugą kaip DuckDNS ar No-IP. Tai nemokama ir leidžia turėti pastovų domeno vardą, net jei IP keičiasi.

Reverse Proxy su Nginx ir SSL – kai reikia publikuoti kelias paslaugas

Tarkime, turi kelis servisus: Nextcloud veikia ant 8080 porto, Home Assistant ant 8123, o Grafana ant 3000. Kaip juos visus publikuoti elegantiškai? Čia į pagalbą ateina reverse proxy.

Nginx veikia kaip tarpininkas – gauna visus užklausimus iš interneto ir nukreipia juos į atitinkamą vidinį servisą. Tai leidžia turėti vieną atvirą portą (443 HTTPS) ir per subdomenus pasiekti skirtingas paslaugas.

Pavyzdys su Nginx konfigūracija:

server {
    listen 443 ssl;
    server_name nextcloud.manodomenas.lt;
    
    ssl_certificate /etc/letsencrypt/live/manodomenas.lt/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/manodomenas.lt/privkey.pem;
    
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

SSL sertifikatui naudok Let’s Encrypt – tai nemokama ir automatiškai atsinaujinanti sertifikatų paslauga. Certbot įrankis tai padaro per kelias minutes:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d nextcloud.manodomenas.lt

Svarbus saugumo papildymas – Nginx galima sukonfigūruoti taip, kad blokuotų žinomus kenkėjiškus User-Agent’us, ribotų užklausų skaičių (rate limiting) ir filtruotų keistus URL šablonus. Tai papildomas apsaugos sluoksnis.

Jei nesinori pačiam konfigūruoti Nginx, pažvelk į Nginx Proxy Manager – tai grafinė sąsaja, kuri leidžia viską padaryti per naršyklę. Labai patogi namų naudojimui.

Autentifikacija – silpniausia grandis visoje grandinėje

Gali turėti geriausią infrastruktūrą pasaulyje, bet jei tavo slaptažodis yra „password123” arba naudoji tą patį slaptažodį visur – viskas beprasmiška. Autentifikacija yra ta vieta, kur dauguma namų serverių savininkų daro didžiausias klaidas.

SSH raktai vietoj slaptažodžių. Jei naudoji SSH, išjunk slaptažodžių autentifikaciją ir naudok tik raktus. Tai padaryti paprasta:

# Sugeneruok raktą savo kompiuteryje
ssh-keygen -t ed25519 -C "[email protected]"

# Nukopijuok viešą raktą į serverį
ssh-copy-id [email protected]

Po to faile /etc/ssh/sshd_config nustatyk:

PasswordAuthentication no
PubkeyAuthentication yes

Dviejų faktorių autentifikacija (2FA). Daugelis namų serverių programų (Nextcloud, Home Assistant) palaiko 2FA. Įjunk jį. Visada. Tai reiškia, kad net jei kas nors sužinos tavo slaptažodį, be telefono jis negalės prisijungti.

Fail2ban – tai programa, kuri automatiškai blokuoja IP adresus, kurie per daug kartų bandė prisijungti su neteisingais duomenimis. Instaliacija:

sudo apt install fail2ban
sudo systemctl enable fail2ban

Numatytoji konfigūracija jau apsaugo SSH. Galima pridėti papildomų taisyklių Nginx ar kitoms paslaugoms.

Authelia – jei nori centralizuotos autentifikacijos visiems savo servisams, pažvelk į Authelia. Tai open-source sprendimas, kuris prideda 2FA ir SSO (Single Sign-On) galimybes. Sudėtingiau sukonfigūruoti, bet labai galingas įrankis.

Tinklo segmentavimas ir ugniasienė – apsauga iš vidaus

Daugelis namų serverių savininkų galvoja tik apie apsaugą iš išorės, bet pamiršta, kad grėsmė gali ateiti ir iš vidaus – kompromituota programa, kenkėjiškas kodas ar tiesiog klaida konfigūracijoje.

Ugniasienė serveryje – būtinybė. ufw (Uncomplicated Firewall) yra paprastas ir efektyvus pasirinkimas:

sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw allow 51820/udp # WireGuard
sudo ufw enable

Principas paprastas: blokuok viską, kas nereikalinga, ir atidaryk tik tai, kas būtina.

Jei turi šiek tiek sudėtingesnę namų tinklo infrastruktūrą, apsvarstyk VLAN segmentavimą. Serveris turėtų būti atskirame tinklo segmente, atskirtame nuo pagrindinių namų įrenginių. Taip, jei serveris būtų kompromituotas, užpuolikas negalėtų lengvai pasiekti kitų tavo namų įrenginių.

Docker naudotojai turėtų atkreipti dėmesį į tai, kad Docker pagal nutylėjimą gali apeiti ufw taisykles. Tai žinoma problema – Docker tiesiogiai rašo į iptables. Sprendimas: naudoti DOCKER-USER chain arba specialų pluginą kaip ufw-docker.

Monitoringas ir atnaujinimai – saugumas nėra vienkartinis darbas

Pats pavojingiausias mitas apie namų serverio saugumą – kad galima viską sukonfigūruoti vieną kartą ir pamiršti. Saugumas yra procesas, ne būsena.

Atnaujinimai. Automatiniai saugumo atnaujinimai yra minimalus reikalavimas:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

Tai automatiškai instaliuos saugumo pataisas, bet nelieis kitų atnaujinimų (kurie gali sugadinti sistemą). Idealus kompromisas.

Žurnalų stebėjimas. Nereikia sėdėti ir žiūrėti į žurnalus visą dieną, bet verta turėti bent minimalų monitoringą. Grafana + Loki kombinacija leidžia vizualizuoti žurnalus ir gauti pranešimus, kai kažkas neįprasto nutinka. Arba paprasčiau – Uptime Kuma praneš, kai serveris nebus pasiekiamas.

Atsarginės kopijos. Tai ne tiesiogiai saugumo klausimas, bet labai susijęs. Jei serveris bus kompromituotas, turėsi galimybę atkurti duomenis. 3-2-1 taisyklė: 3 kopijos, 2 skirtingose laikmenose, 1 ne namie (pvz., šifruota kopija debesyje).

CrowdSec – modernesnis Fail2ban pakaitalas, kuris naudoja bendruomenės duomenis apie žinomus kenkėjiškus IP adresus. Veikia kaip kolektyvinis imunitetas – jei kažkas atakavo kitą CrowdSec naudotoją, tavo serveris jau žinos apie tą IP adresą.

Kai viskas suveikia kartu – realus namų serverio saugumo modelis

Leisk apibendrinti viską praktiškai. Štai kaip atrodo gerai apsaugotas namų serveris, kuris vis tiek yra pasiekiamas iš interneto:

Pirmasis lygis – tinklo lygis. Maršrutizatoriuje atidarytas minimalus portų skaičius (idealiu atveju – tik WireGuard UDP portas arba visai nieko, jei naudoji Cloudflare Tunnel). Serveris atskirame VLAN segmente.

Antrasis lygis – serverio lygis. ufw ugniasienė su griežtomis taisyklėmis. Fail2ban arba CrowdSec aktyvus. Visi atnaujinimai automatiškai diegiami.

Trečiasis lygis – programų lygis. Nginx reverse proxy su SSL. Authelia arba bent jau 2FA kiekvienoje programoje. Slaptažodžiai generuoti slaptažodžių tvarkyklėje (Bitwarden puikiai tinka).

Ketvirtasis lygis – stebėjimo lygis. Uptime Kuma stebi pasiekiamumą. Žurnalai kaupiami ir analizuojami. Atsarginės kopijos daromos reguliariai ir tikrinamos.

Ar tai skamba sudėtingai? Iš pradžių – taip. Bet kiekvienas iš šių elementų gali būti diegiamas palaipsniui. Pradėk nuo Cloudflare Tunnel ir Fail2ban – tai jau duos didžiulį saugumo prieaugį. Vėliau pridėk WireGuard, po to Authelia, ir taip toliau.

Svarbiausia suprasti: tobulas saugumas neegzistuoja, bet kiekvienas papildomas sluoksnis padidina užpuoliko pastangas ir mažina tikimybę, kad tavo serveris taps lengvu taikiniu. Dauguma atakų yra oportunistinės – automatizuoti skeneriai ieško lengvų aukų. Jei tavo serveris reikalauja per daug pastangų, skeneris tiesiog pereina prie kito IP adreso.

Namų serveris gali būti ir patogus, ir saugus – tiesiog reikia skirti tam šiek tiek laiko ir nesitenkinti „atidarysiu portą ir viskas”.

Daugiau

AI avatarai LinkedIn: ar verta kurti

Local LLM: Llama 3.3 paleidimas namų kompiuteryje