2016 m. gruodžio 5 d., pirmadienis

iptables

Viršutinė taisyklė laimi.





/etc/sysconfig/iptables - čia saugomos iptable taisyklės.
/etc/sysconfig/iptables-config - iptables konfigūracinis failas.

Paketas praeina pro vieną iš šių grandinių:

Chains:
  • INPUT - paketai skirti ugniasienei.
  • OUTPUT - paketai išsiunčiami iš ugniasienės.
  • FORWARD - maršrutizuojami paketai.
Tiesioginis iptables redagavimas:
# vi /etc/sysconfig/iptables
# iptables-restore /etc/sysconfig/iptables #Išsaugom pakeitimus

Naujos grandines kūrimas:
# iptables -N nauja-grandine

Naujos grandinės tinimas:
# iptables -X nauja-grandine

Permeta visus paketus į nauja-grandinę:
# iptables -t filter -A INPUT -j nauja-grandine

Ip tables atvaizdavimas
# iptables -L [CHAIN]

Iptables atvaizdavimas su eilės numeriais
# iptables -L --line-numbers

Rodo išsamią info kartu su paketų statistika
# iptables -L -n -v

Iptables įrašo trynimas:
# iptables -D [CHAIN] [skaicius]
Iptables gui interfeisas:
# system-config-firewall-tui

Iptables taisyklių išsaugojimas:
# service iptables save
# /sbin/service iptables save 

Tam, kad iptables veiktų po perkrovimo su CentOS:
# chkconfig iptables on
# chkconfig --list iptables
iptables 0:off  1:off   2:on   3:on   4:on   5:on   6:off

Su Ubuntu:
$ sudo invoke-rc.d iptables-persistent save


Iptables taisyklės:

Taisyklės įsigalioja iš karto!

Paketams gali būti taikomos šios taisyklės:

Rule Targets:

  • DROP – numeta paketą.
  • ACCEPT – priima paketą.
  • LOG – įrašo paketą naudojant syslog.
  • REJECT – su klaidos pranešimu atmeta paketą.
  • No target – gali būti naudojama statistikai.
Ryšių būsenos:

Connection Tracking
  • NEW - paketas prašantis užmegsti naują ryšį, pavyzdžiui, HTTP užklausa.
  • ESTABLISHED - užmegztas ryšys.
  • RELATED - kai vienas ryšys susijęs su kitu, pavyzdžiui FTP.
  • INVALID - neatpažintas paketas, kuris nepriklauso nei vienam užmestam ryšiui, ryšių sekimo lentelėje.

Nustatymai:
-A (Append) - Nauja taisyklė pridedama apačioje.
-I (Insert)  - Nauja taisyklė prideda viršuje.


Loginimas:
# iptables -N LOGGING
# iptables -A INPUT -j LOGGING
# iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# iptables -A LOGGING -j DROP

Taisyklės keitimas, pakeičiant paketų įrašimo greitį:
# iptables -L --line-numbers #Pasižiūrim eilės numerį
# iptables -R LOGGING 1 -m limit --limit 5/s -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

localhost praleidimas:
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT

IP adreso blokavimas:
# iptables -A INPUT -s 192.168.50.1 -j REJECT #Jungiantis rodys klaidos kodą

ssh praleidimas; shh prisijungimas iš tam tikro ip: -s 192.168.50.1
# iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

http praleidimas:
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

http ir https praleidimas:
# iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

mysql praleidimas:
#  iptables -A INPUT -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Serverio blokavimas per pietų pertrauką:
# iptables -A INPUT -p tcp -m time --timestamp 12:00 --timestop 13:00 -j DROP
# iptables -A INPUT -p udp -m time --timestamp 12:00 --timestop 13:00 -j DROP

Svetainių blokavimas tam tikru laiko intervalu:
# iptables -A OUTPUT -p tcp -m multiport -dport http,https -m time --timestart 12:00 --timestop 13:00 -d IP_adresas -j ACCEPT 

Apsauga nuo ddos atakų, tokių kaip hping:
# iptables -A INPUT -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
# iptables -A INPUT -j REJECT

Draudžia tam pačiam ip adresui jungtis daugiau nei 10 kartų:
# iptables -A INPUT -p tcp -m multiport --dport 80,443 -m state d-state NEW -m recent --set
# iptables -A INPUT -p tcp -m multiport --dport 80,443 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP


iptables bazinis šablonas:
# Praleidžiam betkokį susijusi ar jau užmegstą ryšį
-I INPUT 1 -m state --state RELATED, ESTABLISHED -j ACCEPT
-I OUTPUT 1 -m state --state RELATED, ESTABLISHED -j ACCEPT

# Praleidžiam loopbacj
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# Praleidžiam DHCP užklausas
-A OUTPUT -o eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# Praleidžiam SSH
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

# Praleidžiam/nepraleidžia pašto
-A INPUT -p tcp -m tcp --dport 25 -m state -state NEW -j ACCEPT

-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


# Išorinėms DNS užklausoms:
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT

# Išorinėms ping užklausoms:
-A OUTPUT -p icmp -j ACCEPT

# NPT - Tinklo laiko protokolui
-A OUTPUT -p udp --dport 123 --sport 123 -j ACCEPT

# HTTP serveriams
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

COMMIT


Naudingi patarimai dirbant su iptables

  • Pasidaryk iptables atsarginę kopiją.

/sbin/iptables-save > /root/iptables-backup-$(date +%F)
/root/iptables-backup-2016-12-06

/sbin/iptables-save > /root/iptables-backup-$(date +%F_%H:%M)
/root/iptables-backup-2016-12-06_11:48

Iškilus bėdai atstatom iptables, su komanda:
/sbin/iptables-restore /root/iptables-backup-`date +%F`
  • Bandymo metu, atstatyk iptables lenteles, numatytu laiko intervalu su cron.
$ ln -s /root/iptables-`date +%F` /root/iptables-veikianti-naujausia

crontab -e įrašas, atstatis iptables lenteles, kas 5 minutes.
*/5 * * * * /sbin/iptables-restore /root/iptables-backup-`date +\q%F` >/dev/null 2>&1

  • Pridėti  savo IP pirmoje taisyklėje, apsisaugant nuo užsiblokavimo 
# iptables -I INPUT -s <ip-adresas> -j ACCEPT

  • Naudokim system-config-firewall-tui programą su grafinių interfeisu
#CentOS 6.8
# yum install system-config-firewall-tui dbus dbus-python
# service messagebus start
# system-config-firewall-tui



Kiti


Porto nukreipimas į kitą portą, pvz tokiu atvėju, kaip prie opvenvpn norime prisijungti per kelis portus (1194, 1195) :

-A INPUT -i <inteface>-p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i <inteface>-p udp -m udp --dport 1195 -j ACCEPT
...
-A PREROUTING -i <inteface>-p udp --dport 1195 -j REDIRECT --to-port 1194


Kaip blokuoti svetaines per iptables?

$ host -t a facebook.com
facebook.com has address 31.13.93.36

$ whois  31.13.93.36
inetnum:        31.13.93.0 - 31.13.93.255

Sugeneravus CIDR:
 31.13.93.0/24 

Galutinis rezultatas:
$ iptables -A OUTPUT -p tcp -d  31.13.93.0/24 -j DROP