Progmar Marcin Załęczny

Język:

Iptables

Listuje zawartość tablic iptables. Domyślne tabele (łańcuchy chains) - INPUT, FORWARD, OUTPUT (Przełącznik -v dodaje dodatkowe pola - interfejsy): iptables -L -v

Dodaje regułę do łańcucha iptables -A INPUT

Czyści cały łańcuch iptables -F INPUT

Usuwa regułę z łańcucha iptables -D INPUT

Ustawia domyślną politykę łańcucha: ACCEPT, REJECT, DROP iptables -P INPUT DROP

Opcja pozwalająca na dopasowania reguł bazując na stanie połączenia. Udostępnia opcję --ctstate -m conntrack

Definiuje listę stanów porównywanych przez regułę firewalla. --ctstate Poprawne stany, to:

  • NEW - połączenie jest napotkane pierwszy raz,
  • RELATED - połączenie jest nowe, ale jest powiązane z innym już dozwolonym połączeniem,
  • ESTABLISHED - połączenie jest już nawiązane,
  • INVALID - połączenie nie może być z jakiegoś powodu określone,

Ograniczenie dozwolonych pakietów do podanej liczby w jednostce czasu: -m limit Pozwala używać opcję --limit.
--limit - maksymalna liczba pakietów w jednostce czasu. Dostępne jednostki: "/second", "/minute", "/hour", or "/day" Jeśli opcja ta nie została użyta a zastosowano przełącznik -m limit, to domyślną wartością jest "3/hour".

  • -p - opcja ustawiająca protokół połączenia,
  • --dport - Docelowy port połączenia. Można podać pojedyńczy port lub też przedział portów w postaci start:end. Reguła będzie pasowała do wszystkich portów między start a end włącznie z tymi portami,
  • -j - skok do podanej reguły. Domyślnie iptables udostępnia następujące łańcuchy: ACCEPT - zaakceptuj pakiet i zakończ porównywania reguł w łańcuchu,
    REJECT - odrzuć pakiet, powiadom nadawcę o odrzuceniu pakietu i zakończ porównywania reguł w łańcuchu,
    DROP - zignoruj po cichu pakiet i zakończ porównywania reguł w łańcuchu,
    LOG - zaloguj pakiet i kontynuuj porównywania reguł w łańcuchu. Pozwala na następujące opcje --log-prefix i --log-level.
    --log-prefix - prefiks logowanej wiadomości. Podany prefiks obejmij w znaki cudzysłowia,
    --log-level - zaloguj informację o pkaiecie używając podanego poziomu sysloga,
  • -i - opcja ustawiająca interfejs wejściowy pakietu,
  • -o - opcja ustawiająca interfejs wyjściowy pakietu,
  • -v - Wyświetl więcej informacji na standardowym wyjściu. Przydatna gdy ma się kilka podobnych reguł i nie da się ich odróżnić bez tego przełącznika,
  • -s --source - adres[/maska] źródła pakietu,
  • -d --destination - adres[/maska] miejsca docelowego pakietu,
  • -I - wstawia regułę. Pobiera dwie opcje: łańcuch do którego należy wstawić tę regułę i jej numer porządkowy. np.: -I INPUT 5 wstawi regułę do łańcucha INPUT na 5 pozycji.

Kilka przykładów: iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT // Old deprecated version of above
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT

Żeby karta pobierała adres przez DHCP wystarczy do pliku /etc/network/interfaces dodać linijki: auto eth0 iface eth0 inet dhcp

Pobiera nowy adres ip z serwera dhcp: dhclient eth0

Poniżej znajduje się przykładowy plik firewalla - iptables.sh:

#!/bin/sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe

LAN=192.168.0.0/24
LAN_IFACE=wlp3s0
WAN_IFACE=eth0
LOCAL=127.0.0.1
LOCAL_HTTP_SERVER=192.168.0.1:80
LOCAL_HTTPS_SERVER=192.168.0.1:443
LOCAL_DNS_SERVER=192.168.0.1:53

# Usuń istniejące reguły oraz ustaw domyślną politykę na DROP
echo "[+] Usuwanie istniejących reguł..."

$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -X

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Załaduj moduły śledzące połączenia
$MODPROBE ip_conntrack
$MODPROBE iptable_nat
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_nat_ftp



#################################################################################################################################################
### łańcuch INPUT ###
#################################################################################################################################################
echo "[+] Ustawianie reguł łańcuhca INPUT..."

#akceptuj połączenia loopback
$IPTABLES -A INPUT -i lo -s $LOCAL -m state --state NEW -j ACCEPT

# reguły śledzące stan połączeń
$IPTABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "[ipt]: DROP INVALID IN: " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# reguły anti-spoofing
$IPTABLES -A INPUT -i $LAN_IFACE ! -s $LAN -j LOG --log-prefix "[ipt]: SPOOFED IN: " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -i $LAN_IFACE ! -s $LAN -j DROP

# dozwolone reguły
#$IPTABLES -A INPUT -i $LAN_IFACE -p tcp -s $LAN --dport 22 --syn -m state --state NEW -j LOG --log-prefix "[ipt]: ACCEPTED SSH NEW: " --log-ip-options --log-tcp-options
#$IPTABLES -A INPUT -i $LAN_IFACE -p tcp -s $LAN --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# domyślna reguła logująca łańcucha INPUT
$IPTABLES -A INPUT ! -i lo -j LOG --log-prefix "[ipt]: DEF DROP INPUT: " --log-ip-options --log-tcp-options




#################################################################################################################################################
### łańcuch OUTPUT ###
#################################################################################################################################################
echo "[+] Ustawianie reguł łańcucha OUTPUT..."

#akceptuj połączenia loopback
$IPTABLES -A OUTPUT -o lo -d $LOCAL -m state --state NEW -j ACCEPT

# reguły śledzące stan połączeń
$IPTABLES -A OUTPUT -m state --state INVALID -j LOG --log-prefix "[ipt]: DROP INVALID OUT: " --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# dozwolone reguły
#ftp
$IPTABLES -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
#ssh
$IPTABLES -A OUTPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
#smtp
$IPTABLES -A OUTPUT -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 465 --syn -m state --state NEW -j ACCEPT
#imaps
$IPTABLES -A OUTPUT -p tcp --dport 993 --syn -m state --state NEW -j ACCEPT
#pop3s
$IPTABLES -A OUTPUT -p tcp --dport 995 --syn -m state --state NEW -j ACCEPT
#whois
$IPTABLES -A OUTPUT -p tcp --dport 43 --syn -m state --state NEW -j ACCEPT
#http
$IPTABLES -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
#https
$IPTABLES -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
#dns tcp
$IPTABLES -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
#dns udp
$IPTABLES -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
#echo
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

# domyślna reguła logująca łańcuch OUTPUT
$IPTABLES -A OUTPUT ! -o lo -j LOG --log-prefix "[ipt]: DEF DROP OUTPUT: " --log-ip-options --log-tcp-options

Poniżej znajduje się przykładowy plik firewalla IPv6 - ip6tables.sh. Domyślnie loguje on i blokuje pakiety we wszystkich łańcuchach: INPUT, OUTPUT, FORWARD:

#!/bin/bash

ip6tables -F INPUT
ip6tables -F OUTPUT
ip6tables -F FORWARD
ip6tables -X

ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP


# #############################################################################################################
# INPUT
# #############################################################################################################
ip6tables -A INPUT -j LOG --log-prefix "[ipt]: INPUT6 DROP: "
# #############################################################################################################
# #############################################################################################################




# #############################################################################################################
# OUTPUT
# #############################################################################################################
ip6tables -A OUTPUT -j LOG --log-prefix "[ipt]: OUTPUT6 DROP: "
# #############################################################################################################
# #############################################################################################################

# #############################################################################################################
# FORWARD
# #############################################################################################################
ip6tables -A FORWARD -j LOG --log-prefix "[ipt]: FORWARD6 DROP: "
# #############################################################################################################
# #############################################################################################################

Wypisuje na standardowe wyjście aktualny zestaw reguł firewalla: iptables-save

Ustawia zestaw reguł firewalla zapisanych wcześniej przez polecenie iptables-save w pliku firewall.ipt: iptables-restore firewall.ipt lub: cat firewall.ipt | iptables-restore