Iptables kasutamine Debianiga

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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

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

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

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

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

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

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