Laboratorijska vežba – Modul 18 – Statička konfiguracija, SSH sa ključem i UFW na Ubuntu Server-u
Cilj vežbe
Konfigurisati statičku IP adresu na Ubuntu Server VM preko Netplan-a, instalirati i bezbedno podesiti SSH server sa autentifikacijom preko ključa, preneti fajl preko SCP-a, postaviti UFW pravila bez prekidanja sopstvene sesije, i dijagnostikovati problem sa nedostupnim servisom koristeći sistematski redosled iz Teme 16.
Napomena: Ova vežba se izvodi u VirtualBox-u (ili VMware Workstation Player-u), nastavljajući format Modula 17 — ovog puta sa Ubuntu Server-om umesto Windows-a.
Potrebno predznanje
- Kompletna teorija ovog modula (Teme 1–16).
- IPv4 adresiranje (Modul 4), DHCP/DNS koncepti (Modul 13), osnove SSH-a (Modul 7), osnove firewall-a i ACL-a (Modul 16).
Potrebni programi
- VirtualBox (ili VMware Workstation Player).
- Ubuntu Server (najnovija LTS verzija, ISO).
Potrebni virtuelni uređaji
| Uređaj | Uloga |
|---|---|
| LINUX1 | Ubuntu Server VM |
| Host računar | Koristi se kao SSH/SCP klijent ka LINUX1 |
Topologija
graph LR
Host["Host računar<br/>(SSH/SCP klijent)"] ---|"VirtualBox mrežni adapter<br/>(Bridged ili Host-only)"| LINUX1["LINUX1 (Ubuntu Server)<br/>192.168.56.20/24 (statička)"]
Napomena o mrežnom podešavanju: Za ovu vežbu, koristite adapter tipa Bridged Adapter ili Host-only Adapter (ne Internal Network kao u Modulu 17), tako da host računar može direktno da se poveže na LINUX1 preko SSH-a bez potrebe za trećom, posredničkom mašinom.
Plan adresiranja
| Uređaj | IP adresa | Maska | Gateway | DNS |
|---|---|---|---|---|
| LINUX1 | 192.168.56.20 (statička, prilagodite vašoj mreži) | 255.255.255.0 | prema vašoj mreži | 8.8.8.8 |
Koraci vežbe
Korak 1 – Kreiranje virtuelne mašine
Kreirajte LINUX1 (najmanje 1 GB RAM, 20 GB disk) u VirtualBox-u, montirajte Ubuntu Server ISO, i instalirajte sistem sa podrazumevanim podešavanjima (uključujući instalaciju OpenSSH servera ako instalacioni čarobnjak to ponudi kao opciju — u suprotnom, instaliraćete ga ručno u Koraku 6).
Korak 2 – Provera mrežnih interfejsa
$ ip link show
$ ip addr show
Identifikujte tačno ime primarnog interfejsa (Tema 1), npr. enp0s3, i zabeležite trenutnu (verovatno DHCP dodeljenu) adresu.
Korak 3 – Statička IP konfiguracija preko Netplan-a
$ sudo nano /etc/netplan/00-installer-config.yaml
Unesite (prilagodite ime interfejsa i adrese vašoj stvarnoj mreži):
network:
version: 2
ethernets:
enp0s3:
dhcp4: false
addresses:
- 192.168.56.20/24
routes:
- to: default
via: 192.168.56.1
nameservers:
addresses: [8.8.8.8]
Testirajte pre trajne primene (Tema 9):
$ sudo netplan try
Kada se prikaže poruka o potvrdi, pritisnite Enter da prihvatite novu konfiguraciju (ili sačekajte tajmer da se automatski vrati stara konfiguracija ako nešto ne radi).
Korak 4 – Provera povezanosti
$ ip addr show
$ ip route show
$ ping -c 4 <gateway-adresa>
$ ping -c 4 8.8.8.8
Korak 5 – Provera DNS-a
$ dig google.com
$ nslookup google.com
Uporedite obim informacija koje svaki alat prikazuje (Tema 6).
Korak 6 – Instalacija i osnovna provera SSH servera
$ sudo apt update
$ sudo apt install openssh-server -y
$ sudo systemctl status sshd
$ ss -tulpn | grep :22
Korak 7 – Konfiguracija SSH autentifikacije preko ključa
Na host računaru (ne na LINUX1):
$ ssh-keygen -t ed25519
$ ssh-copy-id <korisnik>@192.168.56.20
Testirajte da prijava preko ključa radi pre nastavka:
$ ssh <korisnik>@192.168.56.20
Tek nakon potvrde da prijava preko ključa uspeva, na LINUX1:
$ sudo nano /etc/ssh/sshd_config
Postavite:
PasswordAuthentication no
PermitRootLogin no
$ sudo systemctl restart sshd
Objašnjenje: Redosled je namerno takav (Primer 2, Tema 10) — onemogućavanje lozinke pre potvrde da ključ radi rizikuje potpuno onemogućavanje pristupa.
Korak 8 – Provera preko SCP-a
Na host računaru, kreirajte test fajl i prenesite ga:
$ echo "Test fajl" > test.txt
$ scp test.txt <korisnik>@192.168.56.20:/home/<korisnik>/
Proverite na LINUX1 da je fajl stigao:
$ ls -la ~/test.txt
Korak 9 – Konfiguracija UFW-a (ispravnim redosledom)
Na LINUX1:
$ sudo ufw allow OpenSSH
$ sudo ufw enable
$ sudo ufw status verbose
Objašnjenje: SSH pravilo je dodato pre ufw enable (Primer 3, Tema 12) — obrnut redosled bi odmah prekinuo aktivnu SSH sesiju.
Korak 10 – Instalacija jednostavnog veb servera radi testa
$ sudo apt install nginx -y
$ ss -tulpn | grep :80
Sa host računara, pokušajte pristup pre dodavanja UFW pravila:
$ curl http://192.168.56.20
(ili otvorite tu adresu u pretraživaču) — očekujte da ne uspe, jer port 80 još nije dozvoljen u UFW-u.
Korak 11 – Dijagnostička vežba: servis radi, ali nije dostupan spolja
- Na LINUX1, potvrdite da nginx zaista sluša:
ss -tulpn | grep :80(treba da pokažeLISTEN). - Sa host računara,
curl http://192.168.56.20i dalje ne uspeva (Connection refused/timeout). - Proverite
sudo ufw status verbosena LINUX1 — port 80 nije na listi dozvoljenih. - Objasnite svojim rečima, na osnovu Teme 14, zašto lokalna potvrda da servis „sluša" nije dovoljna da se zaključi da je servis dostupan korisnicima na mreži.
- Ispravite:
sudo ufw allow 80/tcp, zatim ponovitecurlsa host računara — sada uspeva.
Korak 12 – Pregled log zapisa
$ journalctl -u sshd -n 20
$ journalctl -u nginx -n 20
Identifikujte red koji potvrđuje uspešnu SSH prijavu preko ključa iz Koraka 7 (Accepted publickey).
Korak 13 – Snimak stanja (snapshot)
U VirtualBox-u, napravite snapshot LINUX1 VM sada kada je konfiguracija potvrđeno funkcionalna.
Komande za proveru
ip addr show
ip link show
ip route show
ping -c 4 <adresa>
dig <ime>
ss -tulpn
sudo ufw status verbose
journalctl -u <servis> -n 20
Najčešće greške
| Greška | Uzrok | Rešenje |
|---|---|---|
netplan try/apply vraća grešku | Neispravna YAML sintaksa (pogrešno uvlačenje) | Proveriti Korak 3, YAML je osetljiv na razmake |
| SSH konekcija sa ključem ne uspeva | Javni ključ nije ispravno kopiran, ili dozvole na ~/.ssh folderu su previše otvorene | Ponovo pokrenuti ssh-copy-id, proveriti dozvole (chmod 700 ~/.ssh) |
| SSH pristup potpuno onemogućen nakon Koraka 7 | PasswordAuthentication no postavljeno pre potvrde da ključ radi | Pristupiti preko VirtualBox konzole (ne SSH-a) i vratiti PasswordAuthentication yes privremeno |
Aktivna SSH sesija prekinuta nakon ufw enable | SSH pravilo nije dodato pre uključivanja UFW-a | Pristupiti preko VirtualBox konzole i dodati sudo ufw allow OpenSSH |
curl sa host računara ne uspeva iako nginx radi | UFW ne dozvoljava port 80 | Proveriti Korak 11 |
Postupak rešavanja problema (troubleshooting)
ip link show/ip addr show— proveriti status i adresu interfejsa.ip route show— proveriti default rutu.pingka gateway-u i spoljnoj adresi — izolovati lokalni naspram udaljenog problema.dig/nslookup— proveriti DNS odvojeno od IP povezanosti.ss -tulpnna samom serveru — proveriti da servis sluša.- Test sa drugog uređaja (host računar) — proveriti stvarnu dostupnost preko mreže.
sudo ufw status verbose— proveriti firewall pravila ako lokalna provera prođe, a spoljna ne.journalctl -u <servis>— pregledati detaljne log zapise ako uzrok i dalje nije jasan.
Završna provera
Vežba je uspešno završena kada:
- LINUX1 ima ispravno konfigurisanu statičku IP adresu, potvrđenu preko
ip addr show. - SSH prijava sa host računara radi isključivo preko ključa, bez lozinke.
- SCP prenos fajla je uspešan.
- UFW dozvoljava SSH i HTTP saobraćaj, potvrđeno i lokalno (
ss) i spolja (curlsa host računara). - Objašnjen je uzrok nedostupnosti nginx servisa spolja pre dodavanja UFW pravila (Korak 11).
Dodatni izazov
Instalirajte fail2ban (sudo apt install fail2ban) i konfigurišite ga da privremeno blokira IP adrese sa previše neuspešnih SSH pokušaja prijave. Testirajte namerno pogrešnim pokušajima prijave (sa lozinkom, koja je već onemogućena — očekujte da fail2ban prepozna ponovljene neuspešne pokušaje) i proverite sudo fail2ban-client status sshd da potvrdite da je vaša test adresa privremeno blokirana. Objasnite kako fail2ban dopunjuje UFW i SSH autentifikaciju preko ključa kao dodatni sloj odbrane (princip slojevite odbrane, Modul 16).
Rešenje
Kompletno rešenje ove vežbe nalazi se u /resenja/modul-18/04-laboratorijska-vezba-resenje.md.
📖 Prikaži rešenje
Rešenje laboratorijske vežbe – Modul 18
Korak 2-3 – Interfejs i statička konfiguracija
$ ip link show
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
$ sudo netplan try
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 120 seconds
Nakon pritiska Enter i potvrde:
$ ip addr show enp0s3
inet 192.168.56.20/24 brd 192.168.56.255 scope global enp0s3
Korak 4-5 – Povezanost i DNS
$ ping -c 4 192.168.56.1
4 packets transmitted, 4 received, 0% packet loss
$ dig google.com
;; ANSWER SECTION:
google.com. ... IN A 142.250.x.x
;; Query time: 18 msec
Korak 6 – SSH server
$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Active: active (running)
$ ss -tulpn | grep :22
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=890,fd=3))
Korak 7 – SSH ključ
(host)
$ ssh-keygen -t ed25519
$ ssh-copy-id student@192.168.56.20
Number of key(s) added: 1
$ ssh student@192.168.56.20
Welcome to Ubuntu 24.04 LTS
student@LINUX1:~$
(uspešna prijava BEZ unosa lozinke, potvrđuje da ključ radi pre nastavka)
Nakon toga, na LINUX1:
$ sudo systemctl restart sshd
Korak 8 – SCP
(host)
$ scp test.txt student@192.168.56.20:/home/student/
test.txt 100% 10 0.5KB/s 00:00
(na LINUX1)
$ ls -la ~/test.txt
-rw-r--r-- 1 student student 10 ... test.txt
Korak 9 – UFW
$ sudo ufw allow OpenSSH
Rules updated
$ sudo ufw enable
Firewall is active and enabled on system startup
$ sudo ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
SSH sesija ostaje aktivna tokom celog procesa, potvrđujući ispravan redosled.
Korak 10-11 – Dijagnostička vežba
(na LINUX1)
$ sudo apt install nginx -y
$ ss -tulpn | grep :80
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1500,fd=6))
(host, pre UFW izmene)
$ curl http://192.168.56.20
curl: (7) Failed to connect to 192.168.56.20 port 80: Connection timed out
$ sudo ufw status verbose
22/tcp (OpenSSH) ALLOW IN Anywhere
(port 80 nije naveden — potvrđuje uzrok)
Objašnjenje: ss -tulpn potvrđuje da nginx lokalno sluša na portu 80 na svim interfejsima (0.0.0.0), ali ovo govori samo da je aplikacija spremna da odgovori — ne govori ništa o tome da li mrežni saobraćaj sa spolja uopšte sme da stigne do tog porta. UFW, koji podrazumevano odbija sav dolazni saobraćaj bez eksplicitnog pravila, blokira taj saobraćaj pre nego što uopšte stigne do nginx-a, potpuno nezavisno od toga koliko je sama aplikacija ispravno konfigurisana.
Ispravka:
$ sudo ufw allow 80/tcp
$ curl http://192.168.56.20
<!DOCTYPE html><html>...Welcome to nginx!...
Korak 12 – Log zapisi
$ journalctl -u sshd -n 20
sshd[2001]: Accepted publickey for student from 192.168.56.1 port 51234 ssh2: ED25519 SHA256:...
$ journalctl -u nginx -n 20
nginx[1500]: Starting nginx service...
Rešenje dodatnog izazova
$ sudo apt install fail2ban -y
$ sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Active: active (running)
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 6
|- Actions
|- Currently banned: 1
|- Banned IP list: 192.168.56.1
Objašnjenje: fail2ban prati log zapise (preko journalctl/log fajlova) i automatski dodaje privremeno UFW/iptables pravilo koje blokira izvorišnu adresu nakon definisanog broja neuspešnih pokušaja u kratkom vremenskom periodu. Ovo je dodatni, treći sloj odbrane (Modul 16, princip slojevite odbrane) — UFW kontroliše koji portovi su uopšte dostupni, SSH autentifikacija preko ključa eliminiše mogućnost pogađanja lozinke, a fail2ban dodatno automatski reaguje na sumnjive, ponovljene pokušaje pristupa, čak i ako bi neko pokušao da zaobiđe prva dva sloja (npr. probajući nasumične korisničke nalog).