Iptables kasutamine Debianiga
Sissejuhatus
Iptables http://www.netfilter.org/ on Linuxi paketifilter.
Tööpõhimõte
Localhostile suunatud liiklus läbib sellised ahelad sellistes tabelites
- ahel PREROUTING - tabel raw
- ahel PREROUTING - tabel mangle
- ahel PREROUTING - tabel nat
- ahel INPUT - tabel mangle
- ahel INPUT - tabel filter
Localhostist välja suunatud liiklus läbib sellised ahelad sellistes tabelites
- ahel OUTPUT - tabel raw
- ahel OUTPUT - tabel mangle
- ahel OUTPUT - tabel nat
- ahel OUTPUT - tabel filter
- ahel POSTROUTING - tabel mangle
- ahel POSTROUTING - tabel nat
Forwarded paketid läbivad sellised ahelad sellistes tabelites
- ahel PREROUTING - tabel raw
- ahel PREROUTING - tabel mangle
- ahel PREROUTING - tabel nat
- ahel FORWARD - tabel mangle
- ahel FORWARD - tabel filter
- ahel POSTROUTING - tabel mangle
- ahel POSTROUTING - tabel nat
Tabelite ja nendes sisalduvate ahelate läbimisest annab ettekujutuse selline paketifiltri seadistus
*filter -A INPUT -j LOG --log-prefix "FILTER input logging: " --log-level 7 -A FORWARD -j LOG --log-prefix "FILTER forward logging: " --log-level 7 -A OUTPUT -j LOG --log-prefix "FILTER output logging: " --log-level 7 COMMIT *nat -A PREROUTING -j LOG --log-prefix "NAT prerouting logging: " --log-level 7 -A POSTROUTING -j LOG --log-prefix "NAT postrouting logging: " --log-level 7 -A OUTPUT -j LOG --log-prefix "NAT output logging: " --log-level 7 -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.10.114 COMMIT *mangle -A PREROUTING -j LOG --log-prefix "MANGE prerouting logging: " --log-level 7 -A INPUT -j LOG --log-prefix "MANGE input logging: " --log-level 7 -A FORWARD -j LOG --log-prefix "MANGE forward logging: " --log-level 7 -A OUTPUT -j LOG --log-prefix "MANGE output logging: " --log-level 7 -A POSTROUTING -j LOG --log-prefix "MANGE postrouting logging: " --log-level 7 -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 6000 COMMIT
Iptables kasutamine
DNAT väljast sisenevatele pakettidele localhost peale
Ubuntu 14.04 ja tuum 3.13
# sysctl -w net.ipv4.conf.all.route_localnet=1 # iptables -t nat -A PREROUTING -p tcp --dport 5901 -j DNAT --to 127.0.0.1:5901
Source NAT väljuvatele pakettidele
Nö kõige tavalisem SNAT läbi Linux ruuteri taga olevast privaatsete aadressidega võrgust internetti pääsemiseks
# sysctl -w net.ipv4.ip_forward=1 # iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to-source 172.16.1.100
kui interneti poolse võrguliidese aadress kipub muutuma ja seejuures paketifilter kohaneks muutusega automaatselt, siis sobib kasutada
# iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Source NAT, eth0 seadme kaudu väljuvatele pakettidele
# iptables -t nat -o eth1 -A POSTROUTING -s 192.168.2.38 -d 10.12.0.0/16 -j SNAT --to 10.100.9.104 # iptables -t nat -A POSTROUTING -m owner --uid-owner priit -j SNAT --to 192.168.10.11
Destination NAT lokaalselt genereeritud pakettidele
# iptables -t nat -A OUTPUT -d 10.10.10.10 -j DNAT --to 192.168.10.100
või protokolli ja pordi täpsusega
# iptables -t nat -A OUTPUT -p tcp -d 192.168.107.133 --dport 80 -j DNAT --to 10.12.7.12:15555
Pakettide peegeldamine
# iptables -t nat -A PREROUTING -p tcp -s 192.168.96.138 -d 10.12.7.11 --dport 4443 -j DNAT --to 10.12.7.31:443 # iptables -t nat -A POSTROUTING -p tcp -s 192.168.96.138 -d 10.12.7.31 --dport 443 -j SNAT --to 10.12.7.11 # sysctl -w net.ipv4.ip_forward=1
UDP pakettide peegeldamisel tuleb olla tähelepanelik conntrack sissekannetega. Tundub, et ka ilma paketifiltrita süsteemi puhul on need olemas ja kui tcp ühenduste puhul tekib uus sissekanne, siis olemasolevasse udp liiklusse sekkumisel iptables reeglid ei kehtestu. Kethtestamiseks tuleb vastav conntrack sissekanne kustutada. Vt conntrack punkti siit tekstist.
Mitme pordi kasutamine reeglis
# iptables -A INPUT -p tcp -m state --state NEW -s 10.100.4.0/24 -m multiport --dports 22,5901 -j ACCEPT
Protsessi omaniku kasutamine reeglis
# iptables -t nat -A OUTPUT -m owner --uid-owner priit -p tcp -d 192.168.32.82 --dport 22 -j DNAT --to 127.0.0.1:22
Seejuures tuleb arvestada, et teatud juhtudel, nt ICMP pakettide puhul ei saa nii omanikku kasutada (ping on setuid programm).
Destination NAT localhostile
Debian Squeeze (tuum 2.6.32) puhul väljast siseneva paketi nö localhostile ümbersuunamiseks sobib kasutada (suunatakse 192.168.35.128:1194 peale)
# iptables -t nat -A PREROUTING -p tcp -s 192.168.96.138 -d 192.168.35.128 --dport 443 -j REDIRECT --to-ports 1194 # iptables -A INPUT -p tcp -m state --state NEW --dport 1194 -j ACCEPT
Kui pakett on sees genereeritud ja tarvis suunata localhostile, siis
# iptables -t nat -A OUTPUT -p tcp -s 192.168.35.128 -d 10.80.123.132 --dport 5555 -j REDIRECT --to-ports 5555
Reeglite vahelekirjutamine
Reeglite esitamine koos reeglite numbritega toimub --line-numbers abil, nt
# iptables --line-numbers -L -n -v
Nt sedasi, asendame viienda reegli sellisega, olemasolev viies ja temast edasi reeglid nihkuvad edasi
# iptables -i eth0 -I FORWARD 5 -p tcp -m state --state NEW -d 192.168.21.22 --dport 3389 -j ACCEPT
FTP kasutamine
Idee poolest peaks passive ühendused ära teenindama nf_conntrac_ftp moodul eeldusel kui paketifiltris on olemas sobiv nn 'RELATED,ESTABLISHED' reegel
# modprobe nf_conntrack_ftp
Alternatiiv on vsftpd server sobivalt ettevalmistada ning passive ühenduste jaoks suunata portide vahemik edasi, nt
# iptables -t nat -A PREROUTING -p tcp -d 192.168.218.18 --dport 20000:50000 -j DNAT --to 10.47.218.18
Filtreerimine MAC aadressi alusel
MAC aadressi alusel saab filtreerida
- INPUT
- FORWARD
- PREROUTING
nt
# iptables -D INPUT -m mac --mac-source 00:1c:c0:38:89:07 -j REJECT
TFTP kasutamine
TODO
FORWARD JA NAT
Selleks, et NAT töötaks, peab olema vastav liiklus lubatud FORWARD ahelast.
Reeglite laadimine seadistusfailiga
Selleks, et alglaadimisel kehtestuksid reeglid sobib kasutada kahte faili
- if-pre-up.d skripti - /etc/network/if-pre-up.d/iptables skript, mis laadib iptables-restore programmiga reeglifailist reeglid
- /etc/iptables.rules - iptablesi reeglifail
Nt alustuseks võiks töötada selline komplekt
# cat /etc/iptables.rules *filter :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You could modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls (access via 'dmesg' command) -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy: -A INPUT -j DROP -A FORWARD -j DROP COMMIT *nat -A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 5432 -j DNAT --to-destination 127.0.0.1:5433 COMMIT
- filter sektsioonis on näidatud, milline liiklus sisse või välja käia võib
- nat sektsioonis on näidatud, milline liiklus ümber suunataks
ja
# cat /etc/network/if-pre-up.d/iptables #!/bin/bash /sbin/iptables-restore < /etc/iptables.rules
kusjuures skript /etc/network/if-pre-up.d/iptables peab olema käivitatav
# chmod 0755 /etc/network/if-pre-up.d/iptables
Logimine paketifiltriga
LOG logimine
Ülaltoodud näites logitakse kerneli abil
# log iptables denied calls (access via 'dmesg' command) -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
Kusjuures iptables logi paistab selline /var/log/syslog failis ja dmesg väljundis
Sep 30 14:38:26 arvuti kernel: iptables denied: IN=eth0 OUT= \ MAC=00:1c:c0:e3:b3:90:00:17:42:02:0b:8a:08:00 SRC=192.168.0.1 DST=192.168.0.70 LEN=60 \ TOS=0x10 PREC=0x00 TTL=64 ID=49175 DF PROTO=TCP SPT=54942 DPT=111 WINDOW=5840 RES=0x00 SYN URGP=0
Kuna LOG risutab dmesg väljundit ei ole ta kuigi hea lahendus.
ULOG logimine
ULOG logib kasutajamaale, reeglina on vaja selliselt logitud andmete salvetamiseks kasutada eraldi programmi, nt ulogd
# apt-get install ulogd
Sarnase tulemuse saab reaga
-A INPUT -m limit --limit 5/min -j ULOG --ulog-prefix "iptables denied: "
ulogd tööd juhib seadistusfail /etc/ulogd.conf kusjuures vaikimisi salvestatakse logi faili /var/log/ulog/syslogemu.log.
ipset
ipset abil saab efektiivsemalt kui nö niisama pakette kontrollida suure hulga sarnast tüüpi tunnuste osas, nt src ip aadressid. Tarkvara paigaldamine ja kasutamine toimub mõnevõrra erinevalt Debian v. 6 ja v. 7 tingimustes.
ipset paigaldamine Debian v. 6 Squeeze keskkonnas
Debian v. 6 Squeeze keskkonnas toimub 2010 aastal ipset kastuamine nt selliselt
# apt-get install ipset # apt-get install ipset-source # cd /usr/src # m-a a-i ipset
Selle käigus lisanduvad failisüsteemi muu hulgas kompileeritud tuuma moodulid
/lib/modules/2.6.32-5-amd64/extra/ipset/ipt_set.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_ipportiphash.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_ipmap.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_portmap.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_nethash.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_setlist.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_ipportnethash.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_iptreemap.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ipt_SET.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_ipporthash.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_macipmap.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_iphash.ko /lib/modules/2.6.32-5-amd64/extra/ipset/ip_set_iptree.k
ipset kasutamine Debian v. 6 Squeeze keskkonnas
Iseenesest tekitatakse settisid selliselt mällu, nethash tüüp sobib kasutamiseks ip aadresside subnettide jaoks
# ipset --create setinimi nethash
ning täidetakse andmetega
# ipset --add setinimi 10.0.0.0/8
Mällu tekitatud setile vastava seadistusfaili moodustamiseks sobib öelda
# ipset -S setinimi > /etc/ipset.rules
tulemusena moodustatakse sarnase sisuga fail
# cat /etc/ipset.rules # Generated by ipset 2.5.0 on Fri Jun 21 06:57:40 2013 -N cn nethash --hashsize 5184 --probes 4 --resize 50 COMMIT # Completed on Fri Jun 21 06:57:40 2013
Sellise faili laadimiseks sobib öelda
# ipset -R < /etc/ipset.rules
Mällu laaditud settide sisu esitamiseks sobib öelda
# ipset -L
ipset kustutamiseks sobib öelda
# ipset -X setinimi
ipset paigaldamine Debian v. 7 Wheezy keskkonnas
Debian v. 7 Wheezy keskkonnas toimub 2013 aastal ipset kastuamine nt selliselt
# apt-get install ipset
ipset kasutamine Debian v. 7 Wheezy keskkonnas
Iseenesest tekitatakse settisid selliselt mällu, nethash tüüp sobib kasutamiseks ip aadresside subnettide jaoks
# ipset --create setinimi nethash
ning täidetakse andmetega
# ipset --add setinimi 10.0.0.0/8
Mällu tekitatud setile vastava seadistusfaili moodustamiseks sobib öelda
# ipset save setinimi > /etc/ipset.rules
tulemusena moodustatakse sarnase sisuga fail
# cat /etc/ipset.rules create setinimi hash:net family inet hashsize 1024 maxelem 65536 add setinimi 10.0.0.0/8
Sellise faili laadimiseks sobib öelda
# ipset restore < /etc/ipset.rules
Mällu laaditud settide sisu esitamiseks sobib öelda
# ipset list
set kasutamine paketifiltrist
set kasutamiseks paketifiltrist sobib muu hulgas kasutada nt selliseid reegleid kui eesmärk on logida ja blokeerida seti aadressidelt ssh serveri poole pöördumisi
-A INPUT -p tcp -m state --state NEW --dport 22 -m set --match-set setinimi src \ -m limit --limit 5/min -j ULOG --ulog-prefix "iptables denied: " -A INPUT -p tcp -m state --state NEW --dport 22 -m set --match-set setinimi src -j DROP
set mällu laadimine arvuti alglaadimise käigus
set mällu laadimine arvuti alglaadimise käigus võiks toimuda nt samast paketifiltriga skriptist
# cat /etc/network/if-pre-up.d/iptables (sh) #!/bin/bash /sbin/ipset restore < /etc/ipset.rules /sbin/iptables-restore < /etc/iptables.rules
Kasulikud lisamaterjalid
- http://blather.michaelwlucas.com/archives/1679
- http://www.auul.pri.ee/wiki/Python#netaddr_teegi_kasutamine
IPv6 liikluse kontrollimine
IPv6 liikluse kontrollimine toimub sarnaselt IPv4 liikluse kontrollimisele kasutades vastavaid ip6tables-* utiliite. Paketifiltri seadistusfaili on samuti sarnane, nt kõik IPv6 mitte-lokaalne liiklus on blokeeritud
*filter :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT # lasta sisse olemasolevate yhendustega seotud paketid -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # blokeerida koik liiklus -A INPUT -j DROP -A OUTPUT -j DROP -A FORWARD -j DROP COMMIT
Reeglite kehtestamiseks sobib öelda
# ip6tables-restore < /etc/ip6tables.rules
Selleks, et arvuti alglaadimisel IPv6 reeglid kehtestuksid sobib kasutada faili
# cat /etc/network/if-pre-up.d/ip6tables #!/bin/bash /sbin/ip6tables-restore < /etc/ip6tables.rules
mis peab olema käivitatav skript
# chmod 0755 /etc/network/if-pre-up.d/ip6tables
DST NAT
# ip6tables -t nat -p tcp -A PREROUTING -d 2001:1530:90:11:192:168:10:151 --dport 22151 \ -i ens18 -j DNAT --to-destination [2001:1530:90:11:192:168:200:151]:22
arptables
# apt-get install arptables
arp päringute blokeerimiseks sobib öelda nt
# arptables -A INPUT --source-mac 70:01:68:01:01:10 -j DROP # arptables -A OUTPUT --destination-mac 70:01:68:01:01:10 -j DROP
Seejuures peab arvestama, et reegel kehtib vaid arp päringute kohta, kui lisada mõlema hosti arp tabelisse staatiline sissekanne vastava ip aadressi ja mac aadressi kohta, andmevahetus töötab.
ebtables
TODO
SSH brute force ründe tõrjumine
Debian Squeeze operatsioonisüsteemi koosseisu kuuluv iptables sisaldab ipt_recent moodulit, mille abil saab tõrjude SSH brute force rünnet.
# cat /etc/iptables.rules *filter -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set --name SSH -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 3 --name SSH -j ULOG \ --ulog-prefix SSH_brute_force -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 3 --name SSH -j DROP COMMIT
kus
- tegu on tehnilises mõttes tervikliku reeglistikuga, mida saab laadida ja mis töötab
- esimene reegel ei luba ega keela liiklust, nõuetele vastav pakett lisatakse recent listi nimega SSH
- teine reegel ei luba ega keela liiklust, ainult logib
- kolmas reegel keelab reegliga klappivad paketid, antud juhul sellised mis ületavad nõude kolm tükki 30 sekundi kohta kasutades recent tabelit SSH
Reeglite kehtestamiseks sobib öelda (kuigi toodud reeglite tõenäolisem kasutus on mingi suurema reeglistiku koosseisus)
# iptables-restore < /etc/iptables.rules
/proc alt saab jälgida parasjagu toimiva recent listi sisu, nb! aadressi esinemine ei tähenda veel, et ta on blokeeritud
# cat /proc/net/xt_recent/SSH
Kasulikud lisamaterjalid
- http://www.debian-administration.org/articles/187
- http://snowman.net/projects/ipt_recent/
- http://blog.andrew.net.au/2005/02/16#ipt_recent_and_ssh_attacks
Simpleproxy programmi kasutamine
Tarkvara paigaldamiseks sobib öelda
# apt-get install simpleproxy
ja kasutamiseks nö käsurealt
$ simpleproxy -v -L 192.168.10.207:5432 -R localhost:5432
või inetd.conf kaudu
# cat /etc/inetd.conf ... 5432 stream tcp nowait nobody /usr/bin/simpleproxy simpleproxy -i -R 127.0.0.1:5432
Tulemusena paistavad eemalt andmebaasi poole pöördumised pöördumistena localhostilt. Samaväärse tulemuse saab saavutada selliste iptables reeglitega
TODO
rinetd programmi kasutamine
rinetd http://www.boutell.com/rinetd/ tarkvara abil saab suunata eemalt arvuti poole tehtud tcp ühendusi edasi, kas samasse arvutisse või mujale võrku. Oluline on seejuures, et ühenduse sihtpunkt näeb, et ühenduse algatatakse sellest arvutist, kus rinetd protsess töötab. Tarkvara paigaldamiseks sobib öelda
# apt-get install rinetd
rinetd tööd kontrollib seadistusfail /etc/rinetd.conf. rinetd on olemas ka Windows operatsioonisüsteemi jaoks.
FTP filtreerimine
Tundub, et kui reeglistikus kasutatakse sarnast rida
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
siis piisab passiivse ftp puhul (st andmeühendusest teeb klient suvalistele serveri portidele pöördudes) sellisest reeglist
-A INPUT -p tcp -m state --state NEW -s 10.184.32.0/19 --dport 21 -j ACCEPT
kusjuures lisaks tuleb laadida ip_conntrack_ftp moodul, nt /etc/network/if-pre-up.d/iptables skriptist
modprobe ip_conntrack_ftp
TFTP filtreerimine
-A INPUT -s 10.184.32.0/19 -p udp -m udp --dport 69 -j ACCEPT
Network namespaces
- http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/
- http://lwn.net/Articles/580893/
MacVTap
MacVTap virtuaalne võrguliides on mõeldud virtuaalsete arvutite võrku ühendamiseks. Kui nö klassikaliselt kasutades tap seadmeid tuleb lisaks kasutada mingit bridge lahendust (nt brctl, Open vSwitch), siis MacVTap puhuul piisab ainult seadmest endast.
Kasulikud lisamaterjalid
- http://virt.kernelnewbies.org/MacVTap
- http://backreference.org/2014/03/20/some-notes-on-macvlanmacvtap/
route cache
Kuidas konkreetset dst ip aadressi ruuditakse küsimiseks
# ip route get 192.168.1.4 192.168.1.4 via 192.168.10.254 dev eth0 src 192.168.10.10 cache <redirected>
ja ruutingu kustutamiseks
# ip route flush 192.168.1.4
Kogu cache sisu esitamiseks
# ip -s route show cache
iptables-persistent
iptables-persistent abil toimub paketifiltri reeglite laadimine arvuti algkäivitamise käigus, tarkvara paigaldamiseks sobib öelda
# apt-get install iptables-persistent
Seadistused asuvad failides
/etc/iptables/rules.v4 /etc/iptables/rules.v6
Kasutamiseks systemd keskkonnas
# systemctl status netfilter-persistent ● netfilter-persistent.service - netfilter persistent configuration Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled) Active: active (exited) since Tue 2015-10-06 12:06:28 EEST; 1s ago Process: 23689 ExecStop=/usr/sbin/netfilter-persistent stop (code=exited, status=1/FAILURE) Process: 23696 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS) Main PID: 23696 (code=exited, status=0/SUCCESS)
Systemd puhul tundub, et praktiliselt on mõistlik kasutada selliselt
- käsitsi redigeerida faili /etc/iptables/rules.v4
- laadida süsteemi töötamise ajal muudatused öeldes
# iptables-restore < /etc/iptables/rules.v4
- systemd netfilter-persistent kasutatakse arvuti käivitamisel
- hinnata olukorda, kas on vaja ka ipv6 reeglistikuga tegeleda
- systemd puhul on oluline vaheldumisi start ja stop öelda, muidu ei kehtestu (ja vaikimisi on probleemid seiskamisega kuna failis /etc/default/netfilter-persistent on rida
# cat /etc/default/netfilter-persistent FLUSH_ON_STOP=0
src address
Eemaldamiseks
# ip route del default # ip route del 192.168.2.0/24 src 192.168.2.197
Lisamiseks
# ip route add default via 192.168.2.254 dev eth0 src 192.168.2.196 # ip route add 192.168.2.0/24 dev eth0 src 192.168.2.196
Tulemus
# ip route show default via 192.168.2.254 dev eth0 src 192.168.2.196 192.168.2.0/24 dev eth0 scope link src 192.168.2.196
Mitu default gateway'd
TODO
Kasulikud materjalid
conntrack
Paigaldamiseks sobib öelda
# apt-get install conntrack
sissekannete esitamiseks
# conntrack -L
Sissekande kustutamiseks, nt kõik mis on seotud src aadressiga 10.0.5.115
# conntrack -D -s 10.0.5.115 udp 17 29 src=10.0.5.115 dst=10.0.9.52 sport=3375 dport=9995 packets=28948 bytes=38027756 \ [UNREPLIED] src=10.0.9.52 dst=10.0.5.115 sport=9995 dport=3375 packets=0 bytes=0 mark=0 secmark=0 use=2 conntrack v0.9.14 (conntrack-tools): 1 flow entries have been deleted.
Kui nf conntrack sissekandeid on liiga palju, siis kernel hakkab pakette droppima ja logisse kirjutatakse
# dmesg -T ... [Sat Aug 5 19:54:03 2017] nf_conntrack: table full, dropping packet
Seda saab reguleerida tuuma parameetriga
# sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_max = 262144
Käesolevat arvu saab küsida
# sysctl net.netfilter.nf_conntrack_count 660
Kui conntrack ei näita midagi ja ilmselt ühendused toimuvad, st
# conntrack -L conntrack v1.4.3 (conntrack-tools): 0 flow entries have been shown.
siis võib olla laadimata tuuma moodul
# modprobe nf_conntrack_ipv4
Selleks, et conntrack täiesti välja lülitada ja selliselt, et seda sisse lülitada ei saa sobib kasutada sellist modprobe seadistust (sel juhul põhimõtteliselt ei sa tekkida nn '... nf_conntrack: table full, dropping packet' olukorda)
# cat /etc/modprobe.d/blacklist-moraal.conf install nf_conntrack /bin/false # modprobe nf_conntrack_ipv4 modprobe: ERROR: ../libkmod/libkmod-module.c:977 command_do() Error running install command for nf_conntrack modprobe: ERROR: could not insert 'nf_conntrack_ipv4': Operation not permitted
tulemusena kernelis puuduvad sellised parameetrid
net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_count
Võib olla võiks seejärel mõelda, et kui nüüd peaks saabuma tohutu hulk üle võrgu pöördumisi ja eelnevalt püüdis nad kinni net.netfilter.nf_conntrack_max ja sel viisil kaitses ülejäänud süsteemi uputuse ees, siis nüüd langeb mingi muu kerneli osa koormuse alla. Tõenäoliselt ei pea sellepärast muretsema.
IPSec pakettide haldamine
Nt sellised reeglid lubavad
-A INPUT -m policy --pol ipsec --dir in -p tcp -j ACCEPT -A INPUT -m policy --pol ipsec --dir in -p udp -j ACCEPT -A INPUT -m policy --pol ipsec --dir in -p icmp -j ACCEPT
IPSec debugimine
TODO
Kasulikud lisamaterjalid
ip utiliidi kasutamine
bridge tekitamine
# ip link add name br0 type bridge
bridgele füüsilise liidese lisamine
# ip link set enp3s0 master br0 # ip link set dev br0 up # ip link set enp3s0 up
ip aadressi omistamine bridgele
# ip addr add 192.168.10.129/24 dev br0
vaikelüüsi sättimine
# ip route add default via 192.168.10.254
ip utiliidi kasutamine - bonding
# modprobe bonding mmiimon=100 mode=802.3ad lacp_rate=slow # ip link add dev bond0 type bond # ip link set dev eth0 master bond0 # ip link set dev eth1 master bond0 # ip link set dev eth0 up # ip link set dev eth1 up # ip link set dev bond0 up
Kasulikud lisamaterjalid
ip utiliidi kasutamine - vlan
# ip link add link bond0 name bond.84 type vlan id 84
ip utiliidi kasutamine - mtu
# ip link set dev bond.84 mtu 9000
tcp-mss muutmine
Muutmine
# ip route change default via 10.172.24.106 advmss 1436 dev eth0
Kontroll
# ip -s route get 8.8.8.8 8.8.8.8 dev eth0 src 185.172.24.106 cache users 1 advmss 1436
SNAT ja SPAT
Nt selleks, et arvutist läbi minevad dns päringud paistaksid edasi src port 53 pealt
# sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=1 # iptables -t nat -A POSTROUTING -p tcp -d 10.80.96.217 -j SNAT --to 192.168.10.219:53
Seejuures saab nii esitada üks päring sekundis. Tundub, et niisama lihtne ei ole arvutis endas genereeritud dns päringuid hoida nähtavana src port 53 pealt.
Muud huvitavad parameetrid
# sysctl -a --pattern '^net.netfilter.nf_conntrack' net.netfilter.nf_conntrack_acct = 0 net.netfilter.nf_conntrack_buckets = 65536 net.netfilter.nf_conntrack_checksum = 1 net.netfilter.nf_conntrack_count = 6 net.netfilter.nf_conntrack_events = 1 net.netfilter.nf_conntrack_expect_max = 1024 net.netfilter.nf_conntrack_generic_timeout = 600 net.netfilter.nf_conntrack_helper = 1 net.netfilter.nf_conntrack_icmp_timeout = 30 net.netfilter.nf_conntrack_log_invalid = 0 net.netfilter.nf_conntrack_max = 262144 net.netfilter.nf_conntrack_tcp_be_liberal = 0 net.netfilter.nf_conntrack_tcp_loose = 1 net.netfilter.nf_conntrack_tcp_max_retrans = 3 net.netfilter.nf_conntrack_tcp_timeout_close = 10 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_established = 432000 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30 net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60 net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300 net.netfilter.nf_conntrack_timestamp = 0 net.netfilter.nf_conntrack_udp_timeout = 30 net.netfilter.nf_conntrack_udp_timeout_stream = 180
Policy routing
Policy routing ehk erijuhul source routing võimaldab nö kallutada pakette kõrvale default routing'ust. Seejuures ei tehta seda paketifiltriga. Nt võiks see leida kasutust juhtumil kui server S peab pakkuma teenust kahes isp võrgus
- isp 1 ruuteriga R1, tavaline default route
- isp 2 ruuteriga R2, eriline policy route
Ja lahendada on vaja probleem, et kuidas R2 kaudu arvutisse saabunud ip pakettide vastused lähevad tagasi internetti läbi sama isp2 ruuter R2.
internet | | __|__ __|__ | | | | | R1 | | R2 | |_____| |_____| | eth1 10.1.1.254 | eth1 10.2.2.254 | mac 70:01:02:03:04:11 | mac 70:01:02:03:04:22 | | ----|----------------------|--------------------|------- | 10.1.1.10 __|__ 10.2.2.20 default route - 10.1.1.254 | | policy route - 10.2.2.254 | S | |_____|
kus
- S - server, mille ühele võrguseadmele eth0 on seadistaud kaks ip aadressi, 10.1.1.10 ja 10.2.2.20
- R1 - isp 1 ruuter (tavaline default gw)
- R2 - isp 2 ruuter
Olukorra tekitamiseks tuleb esmalt lisaks tavalisele ruutingule seadistada üks source based policy routing
# cat /etc/iproute2/rt_tables .. 2 rt2
ja muudatuse kehtestamiseks arvuti rebootida. Seejärel eth0 võrguliidesele lisada juurde ip aadress
# ip addr add 10.2.2.20/24 dev eth0
ning kirjeldada 'rule' mis ütleb millistel tingimustel millist ruutingu tabelit kasutada, nt öelda, et arvutist src aadressiga 10.2.2.20 väljuvate pakettide ruutimiseks tuleb kaustada ruutingu tabelit 'rt2'
# ip rule add from 10.2.2.20 lookup rt2
Lisada ruutingu tabelisse rt2 default route, et oleks teada mis teha sinna suunatud pakettidega edasi
# ip route add default via 10.2.2.254 dev eth0 table rt2
Tulemus paistab selline
# ip rule list 0: from all lookup local 32765: from 10.2.2.20 lookup rt2 32766: from all lookup main 32767: from all lookup default
# ip route show table rt2 default via 10.2.2.254 dev eth0
Samaväärne käskude andmisele on kasutada nt sellist /etc/network/interfaces sektsiooni (advmss demonstreerib tcp-mss muutmise võimalust)
# cat /etc/network/interfaces ... auto eth0 iface eth0 inet static address 10.1.1.10 netmask 255.255.255.0 gateway 10.1.1.254 dns-nameservers 8.8.8.8 dns-search moraal.ee post-up ip addr add 10.2.2.20/24 dev eth0 post-up ip rule add from 10.2.2.20 lookup isp2 post-up ip route add default via 10.2.2.254 advmss 1436 dev eth0 table isp2
Testimiseks sobib öelda nt
$ ping -I 10.2.2.20 8.8.8.8
ning jälgida tcpdump abil liiklust ruuteri mac aadressi alusel
# tcpdump ether host 70:01:02:03:04:22
Analoogilise seadistuse võib teha ka kahe võrgukaardiga arvutile, kus kumbki kaart kasutab ühte ip aadressi.
Kasulikud lisamaterjalid
Stateless paketifilter
Reeglina on eelistatud kasutada stateful paketifiltrit, kuid teatud juhtudel vastupidi, eelis on stateless paketifiltril, õieti mõnel asjasse puutuval reeglil. Nt pädeva dns nimeserveri puhul sobib selline paketifilter
# cat /etc/iptables/rules.v4 *raw # Don't do connection tracking for DNS -A PREROUTING -p tcp --dport 53 -j NOTRACK -A PREROUTING -p udp --dport 53 -j NOTRACK -A PREROUTING -p tcp --sport 53 -j NOTRACK -A PREROUTING -p udp --sport 53 -j NOTRACK -A OUTPUT -p tcp --sport 53 -j NOTRACK -A OUTPUT -p udp --sport 53 -j NOTRACK -A OUTPUT -p tcp --dport 53 -j NOTRACK -A OUTPUT -p udp --dport 53 -j NOTRACK COMMIT *filter :INPUT ACCEPT [187:24923] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [160:51112] # Allow stateless UDP serving -A INPUT -p udp --dport 53 -j ACCEPT -A OUTPUT -p udp --sport 53 -j ACCEPT # Allow stateless UDP backending -A OUTPUT -p udp --dport 53 -j ACCEPT -A INPUT -p udp --sport 53 -j ACCEPT # Allow stateless TCP serving -A INPUT -p tcp --dport 53 -j ACCEPT -A OUTPUT -p tcp --sport 53 -j ACCEPT # Allow stateless TCP backending -A OUTPUT -p tcp --dport 53 -j ACCEPT -A INPUT -p tcp --sport 53 -j ACCEPT # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic -A OUTPUT -j ACCEPT -A INPUT -p tcp -m state --state NEW -s 10.20.15.53 --dport 22 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls (access via 'dmesg' command) -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy: -A INPUT -j DROP -A FORWARD -j DROP COMMIT
Kasulikud lisamaterjalid
- https://strongarm.io/blog/linux-stateless-firewall/
- http://distracted-it.blogspot.com.ee/2015/05/iptables-firewall-rules-for-busy.html
TPROXY ja -m socket kasutamine
TPROXY ja -m socket kasutamist kirjeldatakse Squid abil aadressil https://www.auul.pri.ee/wiki/Squid#Squid_v._3.5_ja_TPROXY_kasutamine
Kasulikud lisamaterjalid
- https://jimmysong.io/en/blog/understanding-iptables/
- http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
- http://www.tummy.com/journals/entries/jafo_20050717_164535
- http://wiki.debian.org/iptables
- http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
- http://en.wikibooks.org/wiki/Communication_Networks/IP_Tables
- http://www.linuxtopia.org/Linux_Firewall_iptables/index.html
- http://serverfault.com/questions/514116/how-to-set-mark-on-packet-when-forwarding-it-in-nat-prerouting-table