## Important! iptables rules only apply to ipv4. If you want to set up a firewall for the ipv6 protocol, you will need to use ip6tables instead

## levely obtiznosti v nastaveni FW

1 Netfilter (Nightmare - Damn I'm Good)
2 Iptables (Hard - Come Get Some)
3 UFW (Normal - Let's Rock)
4 Some 1-clicks or predefined setups (Easy - Piece of Cake)
#<------------------------------------ ------------------------------------>#
-OPTIONS[chain]
A append
D delete
I insert
R replace
Z zero couters
L list
P policy
E rename
F flush
N new user defined Chain
X delete chain
#<------------------------------------ ------------------------------------>#
-MATCHING COMPONENT
p protocol
s source IP
d destination IP
i IN interface
o OUT interface
#<------------------------------------ ------------------------------------>#
j (jump) ACCEPT | DROP | REJECT | RETURN
#<------------------------------------ ------------------------------------>#

iptables -A INPUT -p udp --dport 111 -j DROP <===> Tímto pravidlem zakážete veškerou UDP komunikaci na port 111

iptables -A INPUT -s 123.221.1.1 -j DROP <===> prida IP 123.221.1.1 mezi blokovane ipadresy
iptables -L <===> vypise aktualni nastaveni IPTABLES/FW
iptables -L -n -v <===> vypise aktualni nastaveni IPTABLES/FW kde IP jsou v ciselnem formatu
#iptables -t mangle -L -N -v <===> vypise aktualni nastaveni IPTABLES/FW --tabulka muze byt Filter|Nat|Mangle|Raw|Security

#iptables -P INPUT DROP <===> zakaze VSECHNY IP adresy.. tj. nenacte se ani jedna webovka
#iptables -P INPUT ACCEPT <===> povoli VSECHNY IP adresy.. tj. nacte se jakokoli webovka
#iptables-save > /tmp/iptables-default <===> ulozi nastaveni iptables

#<------------------------------- ipset ------------------------------->#

ipset <===> programek diky nemuz muzeme zadava vicero ipadress k blokovani tj. nemusime zadavat vse rucne ale vytvorime urcity BLACKLIST (apt-get install ipset)
#ipset create CernaListina hash:ip
ipset add CernaListina 51.45.122.1 <===> prida adresu 51.45.122.1 do CernaListina
ipset del CernaListina 51.45.122.1 <===> smaze pouze adresu 51.45.122.1 z CernaListina
ipset list <===> vypise aktualni nastaveni CernaListina
ipset test CernaListina 51.45.122.1 <===> otestuje zda ip adresa 51.45.122.1 JE v CernaListina
#iptables -I INPUT -m set --match-set CernaListina src -j DROP <===> prida CELOU CernaListina do FW


ufw deny from 192.168.1.50 to any port 22 proto tcp <===> This firewall rule will block the ssh port 22 to from IP ADDRESS 192.168.1.50.

sudo ufw deny 111 <===> Zablokovani veskere komunikace na portu 111
sudo ufw allow from 192.168.0.33 to any port 111 proto tcp <===> V případě že potřebujete komunikaci využít, můžete postupně přidat výjimky. Např. TCP komunikace pro IP 192.168.0.33

sudo ufw status numbered <===> zjisti status ufw
sudo ufw status verbose <===> vypise co je FW povoleno/zakazano

sudo ufw allow ssh <===> If you are using UFW as a default firewall on your Debian 10 system, it is likely that you need to allow SSH connections on your host.

#<------------------------------- CESKY ------------------------------->#


#<------------------------------- ipfwadm ------------------------------->#
V letech 1995 – 1999 v jádře verze 1.2.1 – 2.2.0 byl firewall řešen technologií jménem ipfwadm Jednalo se o bezstavový filtr, byl IPv4 only. Neřešil NAT - ten se musel řešit stranou. Každý paket se posuzoval zvlášť. Firewall se musel nastavit tak, že se buď otevřel všem nebo nikomu, což je méně bezpečné.

#<------------------------------- ipchains ------------------------------->#
Mezi lety 1999 – 2001 v jádře verze 2.2.0 – 2.4.0 se používal ipchains. Do dneška na tuto technologii na internetu najdete návody. Měl podporu IPv6., více protokolů Stále bezestavový filtr a tedy stejné nevýhody.

#<------------------------------- iptables ------------------------------->#
Od roku 2001 je v jádře verze 2.4.0 technologie iptables/netfilter. Zatím je stále možno na něj přepnout Plně stavový firewall. Umí fungovat i bezstavově univerzální netfilter (hooky), conntrack a NAT + iptables implementující obecné tabulky s pravidly. Díky tomu je možno nastavit a používat plně stavový filtr. (umí i bezestavový).

#<------------------------------- nftables ------------------------------->#
Od leden 2014 je k dispozici nftables . V jádře je dostupný od verze 3.13 Nenahrazuje netfilter, jen iptables.
V letech 2022 je nftables běžně k dispozici v serverových linuxových distribucí. Například Debian 10 Buster ho má nastaven jako výchozí.

 

#<------------------------------------ ------------------------------------>#


Syntaxe příkazu Iptables: iptables [tabulka] [akce] [řetězec] [pravidla] [cíl].
Nadále budou popsány jednotlivé běžně užívané parametry parametry Iptables.

## Tabulka:
filter: jen tato tabulka se používá k filtrování paketů. Pokud v iptables je hodnota tabulka vynechána tak se automaticky bere, že je tam právě filter.
nat: tuto tabulku použijeme pokud chceme používat přepis adres
mangle: zpracovává hlavičky paketů, dále nebude rozebírána – používá se např. při nastavování QoS)

## Akce (nejčastěji používané jsou následující čtyři, ostatní méně používané jsou odděleny čarou):
-A: nakonec řetězce se přidá nové pravidlo
-P: zadání hlavního pravidla (politika)
-L: slouží k vypsání pravidel
-F: slouží k vymazání pravidel
#<------------------------------------ ------------------------------------>#
-I: nové pravidlo se přidá na začátek řetězce
-D: slouží k smazání pravidla
Pomocí následujících akcí můžeme zakládat vlastní řetězce
-N: založení nového řetězce
-X: smazání námi vytvořeného řetězce
-E: přejmenování řetězce

## Řetězce (pro tabulku filter):
INPUT: vstupní řetězec do kterého vstupují všechny pakety, které vstupují do počítače.
OUTPUT: výstupní řetězec, do něhož vstupují všechny pakety, které z počítače odcházejí.
FORWARD: určuje co bude s daty která nejsou určena pro tento PC. Tato data prochází pouze FORWARDem (nikoliv INPUTem nebo OUTPUTem). Forwarding je nejprve nutno v povolit v jádře příkazem: echo „1“ > proc/sys/net/ipv4/ip_forward.

## Řetězce(pro tabulku nat)
PREROUTING: používá se pro port forwarding (DNAT) změna cílové adresy
POSTROUTING: používá se pro SNAT(MASQUERADE) změna zdrojové adresy
Ohledně NATu se jistě bude hodit routovací tabulka. Ta se vypíše buď:ip route a nebo netstat -r.

## Pravidla(budou popsána ta nejběžnější):
-s: zdrojová IP paketu, popřípadě rozsah adres, adresa může být doplněna maskou
-d: cílová IP paketu a nebo rozsah adres
-i: vstupní zařízení, kterým paket přijde do PC např. eth0
-o: výstupní zařízení, kterým odejde paket z PC
--sport: zdrojový port paketu
--dport: port na který paket putuje

## Cíl(určuje co se s paketem stane):
K určení cíle používáme parametr -j za kterým následuje konkrétní akce a ty jsou následující.
ACCEPT: akceptuje paket, nechá ho projít filtrem
REJECT: paket bude zahozen a zdrojový PC o tom bude informován
DROP: paket bude také zahozen, ale zdrojový PC nebude informován

#<------------------------------- Praktická část ------------------------------->#


Nyní přejdeme od teorie k praxi a ukážeme si praktickou konfiguraci Iptables na domácím PC. Nejprve zjistíme jak jsou Iptables nastaveny, to provedeme příkazem: iptables -L. Pokud jste je nikdy nekofigurovali tak pravděpodobně nalezneme, že všechny řetězce(INPUT, FORWARD, OUTPUT) budou mít politiku nastavenu na accept. To znamená, že náš FW je otevřený a vše povoluje(nic neblokuje). Pravidla budeme psát do textového souboru, který pak použijeme jako skript. Jako první nastavíme politiky tak aby FW blokoval příchozí pakety. Pakety odcházející z našeho PC povolíme. A povolíme také pakety procházející. Dále budeme nastavovat jednotlivá pravidla. Ta jsou vyhodnocována od shora dolů tak jak bývá u FW zvykem. Ješte dodám, že PC má dvě rozhraní a to eth0 a eth1. Eth0 je LAN rozhraní, eth1 je WAN rozhraní.

#<------------------------------- politiky FW ------------------------------->#

/sbin/iptables -P INPUT DROP # vše co jde na vstup PC zahoď
/sbin/iptables -P FORWARD DROP # vše co chce jen projít počítačem zahoď
/sbin/iptables -P OUTPUT ACCEPT # vše co odchází z PC nech odejít

#<------------------------------- NAT ------------------------------->#

echo "1" > /proc/sys/net/ipv4/ip_forward # povolení forwardingu v jádře
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # změna zdrojové LAN adresy na zdrojovou WAN adresu
/sbin/iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT #povolí vše z eth0 směřující na eth1
/sbin/iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT #povolí přeposílání z rozhraní WAN na rozhraní LAN u existujících a nebo souvisejících spojení

#<------------------------------- FW pravidla ------------------------------->#

/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # propust spojeni která byla inicializovaná zevnitř
/sbin/iptables -A INPUT -i lo -j ACCEPT #propust na vstup vše pokud je vstupní rozhraní loopback
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT #HTTP server, propustí vstupní data na port 80
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSH server, propustí vstupní data na port 22
/sbin/iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT # FTP server, povolen rozsah portů 20-21
/sbin/iptables -A INPUT -p udp --dport 4672 -j # aMule , povolen UDP port 4672
/sbin/iptables -A INPUT -p tcp --dport 4662 -j # aMule , povolen TCP port 4662
/sbin/iptables -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT

## Sekce politiky: první pravidlo politiky říká, že všechny pakety určené pro náš PC budou zahozeny s výjimkou těch, které jsou povoleny v části FW pravidla a s výjimkou těch spojení která byla inicializována naším PC. Druhé pravidlo politiky přikazuje zahodit každý paket, který by chtěl naším PC jen projít. Třetí pravidlo politiky říká, že všechna odchozí spojení jsou povolena.

## Sekce NAT: povoluje prvním příkazem podporu předávání paketů jádrem, druhým realizuje přepis zdrojových adres tak všem paketům vystupujícím z rozhraní eth1 bude změněna zdrojová adresa z LAN IP na WAN IP. Takové pakety pak mohou putovat do internetu a mohou být dále směrovány. Třetím a čtvrtým příkazem povoluje předávání paketů mezi síťovými rozhraními.

## Sekce FW pravidla: první příkaz říká: propust z venku všechny pakety těch spojení jež byly inicializovány z vnitřní sítě LAN. Ostatní příkazy povolují vstoupit datům jež mají jako cílový port jeden z uvedených. Povoluje tak služby FTP, SSH, HTTP, aMule.

Jak můžete vidět jednotlivá pravidla se skládají poměrně jednoduše. Na běžnou konfiguraci PC si vystačíme bohatě s tím co jsme uvedl v teoretické části. Ještě bych dodal, že v jednotlivých pravidlech mám někdy uveden typ transportního protokolu např. -p tcp. Toto není vysvětleno v teoretické části, ale každý si asi domyslí co to je a z uvedených příkladů pochopí jak to použít. Další část toho článku se bude věnovat samotnému uložení a spuštění firewallu.

#<------------------------------- Zprovoznění konfigurace Iptables ------------------------------->#

## Zprovoznění na systému CentOS(Red Hat, Fedora):
1)zastavíme službu iptables příkazem: „service iptables stop“
2)smažeme vše co je v iptables příkazem „iptables -F“
3)spustíme skript do kterého jsme napsali jednotlivá pravidla příkazem sh ./cesta/soubor. Pravidla se načtou do paměti.
4)Pravidla z paměti uložíme příkazem „service iptables save“ (uloží se do /etc/sysconfig/iptables)
5)Restartujeme iptables příkazem „service iptables restart“

## Zprovoznění na systému Debian(pravděpodobně i Ubuntu):
1)spustíme skript ve kterém máme uloženy pravidla
2)příkazem iptables-save > /cesta/k/novemu/souboru/s/pravidly/pro/iptables uložíme pravidla do souboru ze kterého je bude iptables načítat. Ten má trochu jinou syntaxi než náš skript s pravidly.
3)například do souboru /etc/network/interfaces umístíme pre-up /sbin/iptables-restore < /cesta/k/novemu/souboru/s/pravidly/pro/iptables. Tím zajistíme, že při každém spuštění budou pravidla načtena. >

## Logování:
Na logování se používá samostatný daemon(není nutné ale je doporučeno výrobcem), který se musí doinstalovat. Daemon se jmenuje ULOGD a je dostupný ve většině distribucí jako balíček. Instalace u distribuce CentOS se provede příkazem: „yum install ulogd“, u Debianu by to bylo „aptitude install ulogd“. Konfigurace tohoto daemona se provádí v souboru /etc/ulogd.conf. Dále nebudu rozepisovat všechny direktivy tohoto konfiguračního souboru, ale uvedu 2 nejdůležitější:
1)logfile – určuje kde se budou logy ukládat
2)loglevel – určuje jak „podrobné“ logy budou

## Diagnostické nástroje:
Jako diagnostické síťové nástroje jsem zvolil NMAP a TCPDUMP (můžete však použít i jiné dle uvážení).Kompletní soupis diagnostických a bezpečnostních nástrojů je na stránkách http://insecure.org/.V případě NMAPu odkazuji na manuálové stránky případně na jejich překlad do slovenštiny na http://nmap.org/man/sk/. V případě použití TCPDUMP odkazuji na manuálové stránky. Pro vypsání aktuálního obsahu iptables použijeme příkaz: iptables -L.


#<------------------------------- UFW Basics ------------------------------->#
sudo ufw status
sudo ufw status numbered
sudo ufw delete 5
sudo ufw enable
sudo ufw disable
sudo ufw limit 22
sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow http
sudo ufw allow 60000:65000/tcp comment "Port Range"
sudo ufw deny 80
sudo ufw delete deny 80
#<------------------------------- UFW Expressions ------------------------------->#

sudo ufw allow from 10.10.10.1 to any port 80
sudo ufw allow proto tcp from any to any port 80,443
sudo ufw deny out 21
sudo ufw deny out from 10.10.10.1
sudo ufw deny out from 10.10.10.1 to any port 21
sudo ufw deny in on eth0 from 10.10.10.1
sudo ufw deny in on eth0 from 10.10.10.0/24