[[oktatas:linux:tuzfal:netfilter|< Netfilter]]
====== Netfilter jegyzet ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2011, 2015, 2018
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Csomagszűrők =====
A csomagszűrés tulajdonképpen a TCP/IP
protokoll rétegein végrehajtott korlátozások,
szabálylisták meghatározása. Szabályokat állíthatunk fel
cél és forrás IP cím alapján, cél és forrás port alapján,
megnézhetjük milyen jelzők vannak beállítva egy érkező
csomagban (például SYN jelző, stb.). Szűrhetünk protokollokra,
de megjelölhetünk egyes csomagokat, stb.
A csomagokat elfogadhatjuk, eldobhatjuk, elutasíthatjuk,
naplózhatjuk, stb.
===== A Netfilterről =====
A Netfilter a Linux csomagszűrő rendszere, amelyet az iptables, ip6tables, ebtables és arptables paranccsal irányíthatunk.
A Netfilter a hálózatba érkező csomagokat láncokon keresztül vezeti. A láncok kapcsolatban vannak néhány netfilter
táblával, amelyen keresztül elérhetjük a láncon mozgó csomagokat.
Az alábbi ábra ezt szemlélteti:
--->PRE------>[ROUTE]--->FWD---------->POST------>
Conntrack | Mangle ^ Mangle
Mangle | Filter | NAT (Src)
NAT (Dst) | | Conntrack
(QDisc) | [ROUTE]
v |
IN Filter OUT Conntrack
| Conntrack ^ Mangle
| Mangle | NAT (Dst)
v | Filter
Baloldalról jönnek a csomagok befele, és először elérik a PREROUTING láncot (röviden PRE).
Tulajdonképpen megnézzük kell-e valamit tennünk a csomagokkal routolás előtt.
A PRE felirat alatt látjuk, hogy mi az ami a csomagok továbbjutásába beleszólhat.
- beleszólhat a csomagok conntrack rendszer
- beleszólhatunk a Mangle táblát kezelve
- beleszólhatunk a NAT táblát kezelve
- beleszólhat a forgalomszabályzó rendszer
Ha keresztül jutott a PREROUTING láncon, jöhet a routolás, azaz az útválasztás.
El kell döntenie az útválasztó algoritmusoknak, hogy a csomag nekünk szól vagy
más gépnek kell továbbítani. Ha nekünk szól, akkor a helyi folyamatok felé irányítjuk
az INPUT láncon keresztül (az ábrán IN), ha nem, akkor a FORWARD láncon (az ábrán FDW)
keresztül mehet az interfész felé. Persze itt érinteni fogja még a POSTROUTING láncot
(ábrán POST).
Ha a csomag az INPUT láncon jön befele a helyi folyamatok felé akkor három dolog szólhat
bele a csomag útjába.
- beleszólhat a conntrack rendszer
- a filter táblán keresztül szabályozhatjuk
- a mangle táblán keresztül szabályozhatjuk
Ha a FORWARD láncon megy kifele, akkor két dolog szólhat bele a csomag útjába:
- a filter táblán keresztül szabályozhatjuk
- a mangle táblán keresztül szabályozhatjuk
Ez után persze még át kell jutnia a POSTROUTING láncon is, ahol újabb szabályok jöhetnek:
- a mangle táblán keresztül szabályozhatjuk
- a NAT táblán keresztül szabályozhatjuk
- beleszólhat a conntrack rendszer
Ezek után még egy eset lehetséges. A csomag nem kintről jön, hanem a helyi folyamatok felől megy
kifele. Ekkor két láncot érint. Elsőként az OUTPUT láncot, majd routing után a POSTROUTING láncot.
Az OUTPUT láncon beleszólhat:
- a Conntrack rendszer
- a mangle táblán keresztül szabályozhatjuk
- a NAT táblán keresztül szabályozhatjuk
- a filter táblán keresztül szabályozhatjuk
A POSTROUTING láncon beleszólhat:
- a mangle táblán keresztül szabályozhatjuk
- a NAT táblán keresztül szabályozhatjuk
- a Conntrack rendszer
Láthatjuk, hogy mi három táblán keresztül szólhatunk bele a csomagok útjába:
* filter
* mangle
* nat
* raw
A listában szerepel még egy negyedik tábla is, a raw, ezt kivételek kezeléséhez szoktuk használni.
A táblák kezelését az iptables parancssori programmal fogjuk szabályozni.
=== Működés ===
* szabálylistákat állítunk fel
* a kernel minden beérkező csomagot végig futtat a listákon
* az első egyező szabálynál végrehajtja az ott beállított tevékenységet
* tevékenységek lehetnek:
* elfogadás
* eldobás
* naplózás
=== Használt parancs ===
Fentebb már említettük, hogy az iptables parancsot fogjuk használni. A korábbi kernel verzióknál nem ez volt a program neve:
* 1.3 kernel pf
* 2.0 kernel ipfwadm
* 2.2 kernel ipchains
* 2.4 kernel iptables
* 2.6 kernel iptables
=== Egyéb netfilter programok ===
Az iptables parancs mellett van még néhány parancs amelyet használhatunk. A Netfilter szabályozásához használható parancsok listája:
* ebtables (Bridge)
* arptables (ARP)
* iptables (IPv4)
* ip6tables (IPv6)
===== Fogalmak =====
==== Láncok ====
A fentiekből kiderült, hogy van öt darab láncunk. Foglaljuk össze ezeket:
* PREROUTING
* interfészről jön a csomag, még routing előtt
* FORWARD
* routing után, ha a csomag nem lokális folyamatnak szól
* POSTROUTING
* routing után miután egy csomag elhagyja a vermet
* INPUT
* routing után, ha a csomag lokális folyamatnak szól
* OUTPUT
* routing előtt, egy lokális folyamatól megkapja a verem a csomagot
A szabályokat tehát ezekre a láncokra kell beállítani.
Az iptables parancsnak meg fogjuk mondani, hogy melyik láncra szeretnénk
szabályt felállítani.
==== Illeszkedés ====
Az iptables parancsnak meg kell mondanunk, hogy milyen csomagokra illeszkedjen egy szabály.
Megmondhatjuk, hogy csak TCP, UDP vagy ICMP protokollokra illeszkedjen. A protokollt konkrétan a -p kapcsolóval adjuk meg. Például:
-p tcp
-p udp
-p icmp
Ha nem használjuk a -p kapcsolót, akkor illeszkedik a tcp, udp, icmp és más csomagokra is.
-p all
Megadhatunk IP címeket és/vagy tartományneveket.
A -s kapcsolóval, mi volt a forrás IP címe.
A -d kapcsolóval, mi volt a cél IP cím.
Példa:
-s 192.168.5.1 -d 192.168.5.2
Portot adhatunk meg:
A --dport kapcsoló cél oldali portot jelent
A --sport kapcsoló forrás oldali portot jelent.
--dport 80 --sport 1025
Láthatjuk, hogy az illeszkedés segítségével határozzuk meg, hogy milyen típusú
csomagra akarunk szabályt létrehozni.
==== Csomagok sorsai ====
Ha egy csomag illeszkedik egy szabályra, akkor dönthetünk a sorsáról. Elfogadjuk, eldobjuk,
visszautasítjuk, naplózzuk, egy felhasználói folyamat felé irányítjuk.
Ennek megfelelően a következő célpontokat használhatjuk:
* ACCEPT a csomag folytatja útját
* DROP a csomag eldobása
* REJECT mint a DROP csak visszajelez
* LOG a csomagról naplóbejegyzés készül
* RETURN beépített láncnál alapirányelv, saját láncnál az előző láncra ugrás, köv. szab.
* QUEUE a csomag a felhasználói tér felé
* STOLEN egy alrendszer kezeli tovább a csomagot
==== A szabályokról ====
* Minden lánc rendelkezik egy alapszabállyal (más néven irányelvvel). Az alapszabály külön kapcsolóval állítható (-P).
* Az alapszabályra újabb szabályok építhetők, ezekből fog összeállni a szabálylista.
Egy láncra érkező csomag először végigjárja a szabályokat,
ha egyikre sem illeszkedett, akkor az alapszabály fog
érvénybe lépni.
===== Az iptables kapcsolói =====
==== Aktuális szabályok listázása? ====
Rövid kapcsolóval:
iptables -L
Hosszú kapcsolóval:
iptables --list
Az INPUT láncra illeszkedő szabályokat szeretnénk látni:
iptables -L INPUT
A "nat" táblára illeszkedő szabályokat szeretnénk látni:
iptables -t nat -L
A "mangle" táblára illeszkedő szabályokat szeretnénk látni:
iptables -t mangle -L
A "filter" táblára illeszkedő szabályokat szeretnénk látni:
iptables -t filter -L
Persze a filter tábla használata az alapértelmezett, így azt meg sem
kell adni, mint fentebb.
==== Láncok ürítése ====
Láncok szabályainak törlése:
iptables -F
Az alapértelmezett szabály megmarad.
Ha voltak, saját láncok törlése:
iptables -X
Alapértelmezett irányelv beállítása, persze alapértelmezetten ACCEPT.
iptables -P INPUT ACCEPT
Ugyanez az OUTPUT láncon:
iptables -P OUTPUT ACCEPT
A FORWARD láncon:
iptables -P FORWARD ACCEPT
==== Láncok alapszabályai ====
iptables -P INPUT ACCEPT
iptables -P INPUT DROP
iptables -L INPUT
===== Szabályok =====
* Szokásos helyzet, hogy az alapértelmezett szabályt DROP-ra állítom, és mindent egyenként engedélyezek.
* Ha távolról dolgozunk (ssh), akkor első dolgunk legyen a 53 port mellett a 22 port engedélyezése mielőtt beállítom az alapértelmezett DROP-ot! (Különben kitiltjuk magunkat!)
==== Szabályok kezelése ====
Három szabályt alkotunk meg. Egy hozzáfűzéssel, kettő beszúrással.
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
iptables -I INPUT 2 -p TCP --dport 80 -j ACCEPT
Ez utóbbi szabály lesz a második, az eredeti a harmadik lesz.
A következő utasítás a 2-s szabályt cseréli le:
iptables -R INPUT 2 -p TCP --dport 80 -j DROP
A második szabály törlése:
iptables -D INPUT 2
Ha nem tudjuk mi a száma a törlendő szabálynak az iptalbes -L után
használjuk a --line-numbers kapcsolót:
iptables -L --line-numbers
Így minden sor kap egy sorszámot.
==== Példák hálózat/IP megadására ====
iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 80 -j ACCEPT
iptables -A INPUT -p tcp -d 192.168.3.0/24 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 80 -d 192.168.4.0/24 -j ACCEPT
iptables -A INPUT -p tcp -d 192.168.1.5 --dport 80 -j ACCEPT
Az összes forrás megadása:
-s 0/0
De ez olyan mintha semmit nem írtunk volna.
==== OUTPUT és FORWARD lánc példa ====
iptables -A FORWARD -p tcp -s $BELSOHALO -i eth1 -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
==== Loopback interface ====
iptables -A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
Erre mindig szükség van, mert néhány dolog e nélkül nem működik.
==== Portok, átviteli protokoll ====
* DNS UDP 53 (Zóna transfer tcp!)
* SSH TCP 22
* HTTP TCP 80
* https TCP 443
* smtp TCP 25
* pop3 TCP 110
* pop3s TCP 995
* proxy TCP 8080 vagy 3128
* ftp TCP 21 [ és 20 ]
* samba UDP 137,138, TCP 139, 445
* dhcp UDP 67,68
* icmp ICMP (nincs portja)
==== ICMP ====
iptables -A INPUT -p ICMP -d 192.168.1.1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echoreply -j DROP
Biztonság miatt ilyen szabályokat szoktak még megadni, de ez csak önmagunk életének megkeserítése!
==== Naplózás ====
-j LOG
--log-level
Egy szám vagy név követi. "debug", "info", "notice", "warning",
"err", "crit", "alert" és "emerg" (kis- vagy nagybetűsek egyaránt):
a számok a felsorolás számai 7-0. A naplózási szintek részletei
man syslog.conf
--log-prefix
Egy maximum 29 karakter hosszú szöveg, amely a log
üzenetek elejére kerül (egyedi azonosítás lehetősége)
iptables -N log-drop
iptables -j LOG --log-prefix "DROP "
iptables -j DROP
Használjuk a -m limit kapcsolót, mert teleszemetelhetik a naplófájlt:
iptables -j LOG --log-prefix "DROP " -m limit
=== Naplózás beállítása ===
Állítsuk be azt a szabályt amit naplózni
szeretnénk, majd a cél legyen LOG. A naplózó
szabály előbb legyen mint maga a szabály!!!
iptables -A INPUT -t icmp -j LOG --log-prefix „ICMP bárhonnan”
iptables -A INPUT -t icmp -j ACCEPT
tail /var/log/syslog
===== Állapotfigyelés =====
A csomagok állapotára is beállíthatunk illeszkedést.
Ezzel fejlettebb, állapotfigyelő csomagszűrő tűzfalat
készíthetünk. Az állapotfigyeléshez szükség van a state
modulra, és a --state kapcsolóra, hogy
megadjuk, melyik állapotot szeretnénk figyelni.
-m state --state
==== Állapotok ====
* NEW - új kapcsolat
* ESTABLISED - létező kapcsolathoz tartozik (válasz)
* RELATED - létező kapcsolathoz tartozik, de nem része
* INVALID - nem azonosítható
=== NEW ===
* Új kapcsolatot létesítő csomag.
=== ESTABLISHED ===
* Egy csomag, mely létező kapcsolatot jelez (egy visszajelző csomag, vagy egy visszajelzett kapcsolaton kimenő csomag).
=== RELATED ===
* Egy létező kapcsolathoz tartozó, de annak részét nem képező csomag, mint például egy ICMP hibaüzenet, vagy (beépített FTP modullal) egy ftp adatkapcsolatot létesítő csomag.
=== INVALID ===
* Egy valamilyen okból nem azonosítható csomag: ez magában foglalja a memória túlcsordulásokat és az ICMP hibaüzeneteket, melyek nem felelnek meg egyetlen ismert kapcsolatnak sem. Általában ezek a csomagok eldobandók.
=== Állapotfigyelés példa ===
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
A webszerverhez bejövő új csomagokat elfogadjuk.
===== Tartós tárolás =====
==== A Netfilter beállítások tárolása ====
Telepítsük az iptables-persistent csomagot:
# apt install iptables-persistent
Ha nem mentettük még a tűzfalszabályokat:
# iptables-save > /etc/iptables/rules.v4
# ip6tables-save > /etc/iptables/rules.v6
A telepítő egyébként rákérdez, hogy mentsük-e a szabályokat.
Ha az iptables-persistent telepítésekor mentettük az iptables szabályokat nincs teendőnk.
Viszont minden iptables változtatás esetén mentsük a szabályokat, az iptables-save és
ip6tables-save paranccsal a fentieknek megfelelően.
Ellenőrzés:
# systemctl status netfilter-persistent
Az ellenőrzéshez persze, úgy a legtisztább, ha újraindítjuk a gépet:
# reboot
==== A kernel beállítások tárolása ====
NAT Engedélyezése a kernelben:
Szerkesszük a sysctl.conf állományt:
# nano /etc/sysctl.conf:
Tartalma ez legyen:
net.ipv4.ip_forward = 1
Változások betöltése:
# sysctl -p /etc/sysctl.conf
Indítsuk újra a procfs újragenerálása:
# systemctl restart procps
Ellenőrzés:
# sysctl net.ipv4.ip_forward
vagy:
# cat /proc/sys/net/ipv4/ip_forward
===== Fontos szempontok =====
* Az ICMP-ét globálisan engedni kell
* broadcast ICMP tiltása
* ne jöjjön kívülről, ha bent van
* ki se engedjünk olyat, ami azt állítja forrás IP-je nem helyi, de kifele megy
* Ne az alapszabály legyen a DROP. Helyette az engedő szabályok végén egy DROP naplózással
* Az rp_filter-t kapcsoljuk be ( echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter)
===== Függelék =====
==== Samba portok ====
* netbios-ns 137/udp # NetBIOS Name Service
* netbios-dgm 138/udp # NetBIOS Datagram Service
* netbios-ssn 139/tcp # NetBIOS Session Service
* microsoft-ds 445/tcp # Microsoft Directory Service
iptables -A INPUT -p udp --dport 137 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 138 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
==== FTP kapcsolatkövető modul ====
modprobe ip_conntrack_ftp
Nem töltödik be magától.
Vegyük fel a következő állományba:
/etc/modules
Alapból szükséges:
iptables -A INPUT -p TCP --dport 21 -j ACCEPT
=== Aktív mód ===
iptables -A INPUT -p TCP --dport 20 -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED -j ACCEPT
=== Passzív mód ===
iptables -A INPUT -p TCP --sport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
Mindkét esetben legyen engedélyezve a DNS lekérés, mert lassú lesz a FTP kapcsolódás:
iptables -A INPUT -p UDP --sport 53 -j ACCEPT
Ha az OUTPUT lánc is szűrve van (passzív módnál csak 21 port):
iptables -A OUTPUT -p tcp -s "szerver_ip_cím" --sport 20:21 -j ACCEPT
==== NAT ====
=== A NAT ===
A NAT a ciscos világban többféle NAT áll rendelkezésre, ők ezt nem is NAT-nak hívják hanem
PAT-nak. De szoktunk néha szimplán maszkolásról beszélni.
=== IP továbbítás engedélyezése ===
A sysctl paranccsal ellenőrizzük be van-e állítva:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
vagy a /proc rendszeren keresztül:
cat /proc/sys/net/ipv4/ip_forward
0
Engedélyezés menet közben:
sysctl -w net.ipv4.ip_forward=1
vagy
echo 1 > /proc/sys/net/ipv4/ip_forward
Végleges beállítás a /etc/sysctl.conf fájlban:
net.ipv4.ip_forward = 1
Ha nincs ilyen beállítás akkor elkészítjük, ha van ilyen 1-re állítjuk, ha értéke nem 1 lenne.
Ha készen van a beállítás, azok aktualizálásához futtasd a következő parancsot:
sysctl -p /etc/sysctl.conf
RedHat alapú rendszereken lehet a következő is:
service network restart
Debian alapú rendszereken procps szolgáltatás újraindítása:
/etc/init.d/procps.sh restart
A fentiek mellett beállítható még a következő két kernelparaméter:
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
Esetleg a broadcast ping tiltása:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Esetleg a hamis csomagok szűrése:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
Ha egy csomag nem a mi tartományunkból van, akkor azt dobjuk el.
Például 192.168.1.0/24 tartományban vagyunk és ilyen címre érkezik
csomag a külső interfészre.
Esetleg az ICMP csomagok elfogadása:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
=== Network-address-translation (NAT) ===
Emlékeztetőül, erre mindenképpen szükség van:
echo 1 > /proc/sys/net/ipv4/ip_forward
Példa:
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
Rövidebben ugyanaz:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Újabb példa
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
(A 192.168.1.0/24 a maszkolandó hálózat. Az eth0 az Inernet felőli interface)
Maszkolás beállításának ellenőrzése:
iptables -t nat -L
PPP kapcsolat esetén:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
=== FORWARD lánc ===
Ha maszkolást állítottunk be, akkor a csomagok a FORWARD láncon mennek át a Netfilteren.
Ha ennek a láncnak az alapértelmezett szabálya a DROP, akkor engednünk kell a maszkolt
csomagokat:
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
A példában feltételezzük, hogy a belső hálózat (LAN) az eth1 hálózati kártyán van,
az Internet pedig az eth0-án.
==== Klasszikus támadások védése ====
#Block DDOS - SYN-flood blokkolása:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT
vagy:
iptables -A INPUT -p tcp --syn -m iplimit --iplimit-above 9 -j DROP
* --limit 1/s: 1 másodperc alatt átlagosan maximálisan elfogadott csomagok
* --limit-burst 4 Induláskor ennyi csomag megengedett
Esetleg lehet így kombinálni:
# Beenged két szolgáltatást:
iptables -A INPUT -p tcp --syn --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
# Limitet ha nem lépi túl jöhet:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT
# Minden más kapcsolatkezdeményezőt tiltunk:
iptables -A INPUT -p tcp --syn -j DROP
Alattomos portscan:
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#DOS - Ping of Death blokkolása A halál pingje:
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
vagy:
iptables -A INPUT -p ICMP --icmp-type echo-request -m length --length 60:65535 -j ACCEPT
Letapogatás ellen:
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Új kapcsolat a kapcsolat, de nem SYN csomag.
Egyéb minták:
#TCP-CONNECT scan blokkolás (SYN csomagok; stealth scan vagy half-open scan; be nem fejezett TCP kapcsolódás)
iptables -A INPUT -p tcp --syn -j DROP
#TCP-SYN scan blokkolás (csak SYN csomagok)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j DROP
#TCP-FIN scan blokkolása (csak FIN csomagok)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP
#TCP-ACK scan blokkolása (csak ACK csomagok)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP
#TCP-NULL scan blokkolás (csomag jelzők nélkül)
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp --tcp-flags ! SYN,RST,ACK,FIN,URG,PSH SYN,RST,ACK,FIN,URG,PSH -j DROP
#Block "Karácsonyfa" TCP-XMAS scan blokkoása (csomagok FIN, URG, PSH jelzővel)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP
#DOS - Teardrop blokkolása
iptables -A INPUT -p UDP -f -j DROP
#DDOS - Smurf blokkolása
iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -p ICMP --icmp-type echo-request -m pkttype --pkttype broadcast -j DROP
iptables -A INPUT -p ICMP --icmp-type echo-request -m limit --limit 3/s -j ACCEPT
#Block DDOS - Fraggle blokkolás
iptables -A INPUT -p UDP -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -p UDP -m limit --limit 3/s -j ACCEPT
#DDOS - UDP-flood (Pepsi) blokkolás
iptables -A INPUT -p UDP --dport 7 -j DROP
iptables -A INPUT -p UDP --dport 19 -j DROP
#DDOS - SMBnuke blokkolás
iptables -A INPUT -p UDP --dport 135:139 -j DROP
iptables -A INPUT -p TCP --dport 135:139 -j DROP
#DDOS - Connection-flood blokkolás
iptables -A INPUT -p TCP --syn -m iplimit --iplimit-above 3 -j DROP
#DDOS - Jolt blokkolás
iptables -A INPUT -p ICMP -f -j DROP
==== Transzparens proxy ====
Látszólag nincs proxy. A kérések a 80-as portra érkeznek, amelyek szimpla
NAT-al mennének át a tűzfalon, de ezeket a csomagokat átirányítjuk a
proxy szerver számára.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.2:3128
A fenti példában feltételezzük, hogy a proxy szerver a 3128-as címen figyel.
squid.conf (Squid 2.4-hez):
http_port 3128
httpd_accel_host virtual
httpd_accel_port 80 httpd_accel_with_proxy
on httpd_accel_uses_host_header on
httpd_accel_single_host off
==== Egyszerű script ====
Egy egyszerű script egy szerver esetén mejnek IP címe 195.199.8.20
#!/bin/sh
iptables -F
iptables -X
# Alapértelmezett irányelvek megadása
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# Helyben mindent engedünk
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p udp -d 195.199.8.20 --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -d 195.199.8.20 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -d 195.199.8.20 --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -d 195.199.8.20 --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -d 195.199.8.20 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -d 195.199.8.20 --dport 22 -j ACCEPT
==== Naplózásos példa ====
Ami nincs engedélyezve itt sem mehet át:
#!/bin/sh
# Ürítjük a láncokat
iptables -F
# Helyben mindent engedünk
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Szeretnénk kifele látni DNS-t:
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Szeretnénk kifele látni Webet:
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
# Ami eddig nem ment át azt naplózzuk:
iptables -A INPUT -j LOG --log-prefix "DROP "
# Minden mást eldobunk:
iptables -A INPUT -j DROP
Itt azonban, ami nem ment át egy engedő szabályon sem, azt naplózzuk, utána eldobjuk.
==== Állapotkövető ====
#!/bin/bash
# Először töröljük a szabályokat
iptables --flush INPUT
iptables --flush OUTPUT
iptables --flush FORWARD
iptables --policy INPUT DROP
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD DROP
# INPUT lánc
iptables --append INPUT --in-interface lo --jump ACCEPT
iptables --append INPUT --protocol icmp --jump ACCEPT
# A kiépített kapcsolatok csomagjai jöhetnek
iptables --append INPUT --match state --state ESTABLISHED --jump ACCEPT
iptables --append INPUT --match state --state RELATED --jump ACCEPT
# Szolgáltatások mehetnek
iptables --append INPUT --protocol tcp --destination-port 80 --match state --state NEW --jump ACCEPT
# OUTPUT lánc
iptables --append INPUT --out-interface lo --jump ACCEPT
# Rejtőzködési céllal:
iptables --append OUTPUT --protocol icmp --icmp-type echo-reply --jump DROP
iptables --append OUTPUT --protocol icmp --icmp-type timestamp-reply --jump DROP
# FORWARD lánc
iptables --append FORWARD --jump REJECT --reject-width icmp-net-unreachable
==== Burkolóprogramok ====
* ufw (konzolra)
* gufw (grafikus felületre)
==== Modulok ====
iptables modulok Debian GNU/Linux 6.x alatt:
ls /lib/xtables
iptables modulok még több:
apt-get install xtables-addons-common
Több info:
man xtables-addons
==== IP limit ====
Az iplimit nem szerepel a Debian GNU/Linux 6.x verziójában.
IP,TCP limit. Egy helyről max 5 SYN csomag
iptables -A INPUT -p tcp --syn -m iplimit --iplimit-above 5 -j REJECT
==== A mangle tábla használata ====
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 1
==== Terheléselosztás ====
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW \
-m statistic --mode nth --every 3 -j DNAT --to-destination 192.168.1.1:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW \
-m statistic --mode nth --every 2 -j DNAT --to-destination 192.168.1.2:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW \
-m statistic --mode nth --every 1 -j DNAT --to-destination 192.168.1.3:80
Minden harmadik csomag (33%) illeszkedik az elsőre.
A fennmaradó 66%, 50%-a második szabályra illeszkedik.
A fennmaradó csomagok az utolsóra illeszkednek.
A szabály célja DNAT lesz. A bejövő webforgalom három szerver között oszlik meg.
man iptables
Keressünk rá a statistic szóra.
==== Portátirnyítás ====
iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j REDIRECT --to-port 3180
==== Praktikák ====
Kifele DNS lekérdezés, ha vissza jön:
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
Kifele webszerverek elérhetők, például hálózati telepítéshez:
iptables -A INPUT -p tcp --sport 80 --dport 1024:65536 -m state ESTABLISHED -j ACCEPT
Távolról ping-el tesztelhetik a szerverünk:
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
Távoli gépeket ping-el tesztelhetünk:
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
==== Netfilter képekben ====
{{:oktatas:linux:tűzfal:netfilter_csomagok_utja_v2.png|}}
===== Irodalom =====
==== Könyvek ====
* Pere László: GNU/Linux rendszerek üzemeltetése II.
* Gregor N. Purdy: Linux iptables zsebkönyv (Tűzfalak, címfordítás, forgalomszámlálás)
==== Linkek ====
* http://www.netfilter.org (2018)
* http://www.netfilter.org/projects/conntrack-tools/ (2018)
* http://conntrack-tools.netfilter.org (2018)
* http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html (2018)
* http://www.szabilinux.hu/iptables (2018)
* http://troy.jdmz.net/samba/fw/ (2018)
* http://www.thegeekstuff.com/2011/01/iptables-fundamentals/ (2018)
* http://linux-ip.net/nf/nfk-traversal.png (2018)
* http://unixlinux.tmit.bme.hu/T%C5%B1zfalak (2018)
* http://lok.hu/egyeb/2006mentes/eloadasok/lok-2006-netfilter.pdf (2018)
* http://www.pantz.org/software/iptables/laptopiptables.html (2018)
* http://cipherdyne.org/psad/ (2018)
* http://serverfault.com/questions/245711/iptables-tips-tricks
* http://www.cyberciti.biz/faq/linux-detect-port-scan-attacks/ (2018)
* http://www.cyberciti.biz/tips/howto-limit-linux-syn-attacks.html (2018)
* http://www.webhostingtalk.com/archive/index.php/t-355411.html (2018)
* http://hu.wikipedia.org/wiki/SYN_flood (2018)
* http://wiki.debian.org/DebianFirewall (2018)
* http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html (2018)
* http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-4.html#ss4.2 (2018)
* http://linux-ip.net/nf/nfk-traversal.png (2018)
* https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture (2018)
Példák:
* http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
Netfilter illesztések:
* http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html
Forgalomirányítás:
* http://unixlinux.tmit.bme.hu/Tc
* http://tldp.org/HOWTO/Traffic-Control-HOWTO/index.html
* http://linux-ip.net/articles/Traffic-Control-HOWTO/index.html
Egyéb:
* http://en.wikipedia.org/wiki/Port_scanner