- Uporabite omrežje in navidezne računalnike iz prejšnjih vaj.
- Omogočite dostop drugega navideznega računalnika do spleta preko prvega navideznega računalnika.
- Na prvem navideznem računalniku preprečite drugemu navideznemu računalniku dostop do IP naslova
8.8.8.8
. - Na prvem navideznem računalniku preprečite dostop drugega navideznega računalnika do prvega navideznega računalnika preko varne lupine (SSH).
- Na prvem navideznem računalniku preprečite prenos paketkov preko protokola HTTP po tem, ko smo že prenesli 1 MB podatkov.
Netfilter je ogrodje, ki je del Linux jedra in nam omogoča upravljanje z omrežjem, na primer: filtriranje paketkov, preslikovanje IP naslovov in vrat za namen usmerjanja ter preprečevanja dostopa do delov omrežja.
iptables predstavljajo zastarelo orodje za filtriranje paketov na osnovi Netfilter sistema kavljev (angle. hook).
nftables novo orodje, ki nadomesti iptables
ter omogoča dodatne funkcionalnosti, kot je na primer preiskovanje paketov.
Če smo do sedaj uporabljali iptables
, potem izbrišemo vsa pravila.
iptables -t nat -L
iptables -t nat -F
Trenutne nastavitve nftables
lahko preverimo z ukazom nft
. Navodila za uporabo nft
.
nft list ruleset
Orodje nftables
uporablja tabele (tables
) in verige (chains
) za hierarhično hranjenje pravil (rules
). Vse tabele, verige in pravila imajo svoje identifikatorje (handles
), ki jih uporabljamo za brisanje. Na primer:
nft -a list table mytable
nft delete rule mytable mychain handle 10
Na prvem navideznem računalniku omogočimo delovanje prehoda, tako da ustvarimo novo tabelo table
, novo verigo chain
in novo pravilo rule
za preslikovanje IP naslovov paketov.
nft add table mytable
nft 'add chain mytable postroutingchain { type nat hook postrouting priority -100; }'
nft add rule mytable postroutingchain masquerade
Prav tako moramo omogočiti usmerjanje na prvem navideznem računalnik v datoteki /etc/sysctl.conf
.
nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Da se sprememba parametrov jedra Linux-a upošteva, uporabimo ukaz sysctl
.
sysctl -p
Na prvem navideznem računalniku dodamo brez stansko pravilo za filtriranje vseh paketov s ponornim IP naslovom 8.8.8.8
, ki izvirajo iz drugega navideznega računalnika.
nft 'add chain mytable forwardchain { type filter hook forward priority -100; }'
nft add rule mytable forwardchain ip daddr . ip saddr { 8.8.8.8 . SECOND_VM_IP } drop
Na prvem navideznem računalniku dodamo brez stansko pravilo za filtriranje vseh paketov s protokolom SSH
, ki izvirajo iz drugega navideznega računalnika.
nft 'add chain mytable inputchain { type filter hook input priority -100; }'
nft add rule mytable inputchain tcp dport . ip saddr { 22 . SECOND_VM_IP } drop
Na prvem navideznem računalniku dodamo stanjsko pravilo za filtriranje vseh paketov s protokolom HTTP
, ko presežemo 1MB prejetih paketov. Če nimamo še nameščenege HTTP
strežnika ga namestimo, ustvarimo poljubno datoteko z velikostjo manjšo od 1 MB, na primer z ukazom dd
, in jo prenesemo v mapo \var\www\html
.
apt update
apt install lighttpd
dd if=/dev/zero of=output.dat bs=400K count=1
1+0 records in
1+0 records out
409600 bytes (410 kB, 400 KiB) copied, 0.00104389 s, 392 MB/s
mv output.dat /var/www/html/
Sedaj dodamo pravila za hranjenje prenesene količine podatkov in vklopimo izpuščanje paketkov, ko presežemo izbrano mejo.
nft add table filter
nft add counter filter http-traffic
nft add quota filter http-quota over 1 mbytes
nft add chain filter output { type filter hook output priority 0 \; }
nft add rule filter output tcp sport http counter name http-traffic
nft add rule filter output tcp sport http quota name http-quota drop
Preverimo stanje trenutnih pravil.
nft list table filter
table ip filter {
counter http-traffic {
packets 0 bytes 0
}
quota http-quota {
over 1 mbytes
}
chain output {
type filter hook output priority filter; policy accept;
tcp sport 80 counter name "http-traffic"
tcp sport 80 quota name "http-quota" drop
}
}
Na drugem računalniku poženemo zahtevo za prenos datoteke in ponovno preverimo stanje pravil na prvem računalniku.
wget 10.0.0.1/output.dat
--2024-12-13 16:37:00-- http://10.0.0.1/output.dat
Connecting to 10.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 409600 (400K)
Saving to: ‘output.dat’
output.dat 100%[===================>] 400.00K --.-KB/s in 0.001s
2024-12-13 16:37:00 (306 MB/s) - ‘output.dat’ saved [409600/409600]
nft list table filter
table ip filter {
counter http-traffic {
packets 26 bytes 411225
}
quota http-quota {
over 1 mbytes used 411225 bytes
}
chain output {
type filter hook output priority filter; policy accept;
tcp sport 80 counter name "http-traffic"
tcp sport 80 quota name "http-quota" drop
}
}
Ponovno na drugem računalniku poženemo zahtevo za prenos datoteke in ponovno preverimo stanje pravil na prvem računalniku.
wget 10.0.0.1/output.dat
--2024-12-13 16:38:24-- http://10.0.0.1/output.dat
Connecting to 10.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 409600 (400K)
Saving to: ‘output.dat.1’
output.dat.1 100%[===================>] 400.00K --.-KB/s in 0.002s
2024-12-13 16:38:24 (220 MB/s) - ‘output.dat.1’ saved [409600/409600]
nft list table filter
table ip filter {
counter http-traffic {
packets 54 bytes 822554
}
quota http-quota {
over 1 mbytes used 822554 bytes
}
chain output {
type filter hook output priority filter; policy accept;
tcp sport 80 counter name "http-traffic"
tcp sport 80 quota name "http-quota" drop
}
}
Še enkrat na drugem računalniku poženemo zahtevo za prenos datoteke in ponovno preverimo stanje pravil na prvem računalniku.
wget 10.0.0.1/output.dat
--2024-12-13 16:39:28-- http://10.0.0.1/output.dat
Connecting to 10.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 409600 (400K)
Saving to: ‘output.dat.2’
output.dat.2 50%[=========> ] 200.54K --.-KB/s eta 6m 24s
nft list table filter
table ip filter {
counter http-traffic {
packets 85 bytes 1202102
}
quota http-quota {
over 1 mbytes used 1 mbytes
}
chain output {
type filter hook output priority filter; policy accept;
tcp sport 80 counter name "http-traffic"
tcp sport 80 quota name "http-quota" drop
}
}
Števec in kvoto lahko poenostavimo z naslednjima ukazoma in sedaj prenos preko HTTP ponovno deluje.
nft reset counters
nft reset quotas