Debian - uniwersalna instalacja/Konfigurowanie iptables

Iptables to program sterujący filtrem pakietów (głównie używanym jako zapora sieciowa bądź NAT) opracowany dla systemu operacyjnego Linux. Program może być używany jako filtr pakietów, bądź tzw. stanowa zapora dla systemów Linux z jądrem począwszy od serii 2.4.x, kontrolujący połączenia wchodzące i wychodzące do sieci komputerowej lub stacji roboczej. Wymaga jądra skompilowanego z modułem ip_tables. Iptables wymaga uprawnień roota do uruchomienia. W większości dystrybucji Linuksowych iptables jest instalowane w katalogu /usr/sbin/iptables, jednakże w niektórych z nich można go znaleźć w /sbin/iptables.

Niestety tuż po zainstalowaniu naszego Debiana nasz firewall - którym jest iptables jest nie skonfigurowany i cały ruch przychodzący i wychodzący jest otwarty. Możemy to sprawdzić.


Uruchamiamy Terminal z prawami roota lub uruchamiamy terminal i wpisujemy komendę

 su

Zostaniemy poproszeni o hasło. Wpisując hasło roota, nie będziemy widzieli wpisywanych znaków. Wciskamy klawisz Enter.

Następnie w terminalu wpisujemy

  sudo iptables -L

Powinniśmy zobaczyć

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Opis funkcji

edytuj
  • INPUT – to pakiety odbierane, wchodzące do naszego komputera
  • OUTPUT– to pakiety wygenerowane, wychodzące z naszego komputera
  • FORWARD – to pakiety przekazywane, przechodzące przez nasz komputer


  • ACCEPT - akceptuje pakiet, wpuszcza pakiet do komputera
  • DROP - odrzuca pakiet, nie wpuszcza pakietu do komputera.
  • REJECT - odrzuca pakiet i odsyła z powrotem do źródła, powiadamiając o tym nadawcę


System V czy SystemD - określenie programu inicjalizującego

edytuj

Aby sprawdzić czy nasz Debian używa Systemd wpisz w terminalu

 systemd --version

Jeśli tak powinniśmy otrzymać wynik

 systemd 215
 +PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR

Oznacza to,że mamy zainstalowany Systemd w wersji 215. W takim wypadku tworzymy skrypt dla Systemd (patrz poniżej - Tworzenie skryptu firewalla dla Systemd)

Również możemy użyć polecenia

 dpkg -S /sbin/init

Jeśli otrzymamy wynik

 systemd-sysv: /sbin/init

Oznacza to, że nasz Debian startuje używając Systemd, jeśli

 sysvinit: /sbin/init

Oznacza , że nasz Debian startuje używając System V

Tworzenie skryptu firewalla dla System V

edytuj

Tworzymy skrypt firewalla, który będzie się uruchamiał wraz ze startem naszego komputera.

Uruchamiamy edytor tekstu Gedit(może to być dowolny edytor jak: nano,leafpad,mousepad), wpisując w terminalu

 gedit

Tam wklejamy przykładowy skrypt firewalla - możesz użyć innego lecz pamiętaj do niego dołączyć na początku ten kod

#!/bin/bash

  ### BEGIN INIT INFO
# Provides:          firewall.sh
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Przykładowa konfiguracja iptables blokująca połączenia przychodzące

 
#!/bin/bash

### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

# Czyszczenie reguł

iptables -F

iptables -X

# Polityka bezpieczeństwa

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

# Reguły dla pętli zwrotnej

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -o lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

# Reguły dla łańcucha wejściowego

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Reguły dla łańcucha wyjściowego

iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Następnie zapisujemy nasz plik nadając mu nazwę firewall w katalogu Dokumenty

Teraz uruchamiamy Terminal z prawami roota - zostaniemy poproszeni o hasło

 root@debian-linux:/home/linux#

W terminalu musimy przejść do katalogu Dokumenty

wpisujemy

 ls

Teraz widzimy nasze katalogi

 root@debian-linux:/home/linux# ls
 Dokumenty  Muzyka  Obrazy  Pobrane  Publiczny  Pulpit  Szablony  Wideo

Wpisujemy

 cd Dokumenty

Widzimy że jesteśmy w katalogu Dokumenty

 root@debian-linux:/home/linux/Dokumenty# 

Wpisujemy ponownie ls by zobaczyć czy tam jest nasz plik firewall

 ls

Jeśli widzimy plik firewall to przystępujemy do następnej czynności.Kopiujemy nasz plik firewall do katalogu init.d. W katalogu tym znajdują się skrypty startowe uruchamiane podczas ładowania systemu. W terminalu wpisujemy

  cp firewall /etc/init.d/

Następnie jeśli nie ma błędów nadajemy naszemu plikowi firewall prawa uruchamiania

 chmod +x /etc/init.d/firewall

Tworzymy dowiązanie do uruchomienia serwisu w trybach pracy 2345 oraz zatrzymania serwisu w trybach pracy 016 - wpisując

 update-rc.d firewall defaults 90

Zamykamy terminal i uruchamiamy ponownie komputer. Wraz ze startem nasz zestaw reguł filtrujących powinien wystartować. Po ponownym uruchomieniu aby to sprawdzić ponownie uruchamiamy Terminal użytkownika i wpisujemy

  sudo iptables -L

Powinniśmy zobaczyć nasze reguły

Możemy użyć również komendy do zatrzymania firewalla

  /etc/init.d/firewall stop


lub do jego uruchomienia

  /etc/init.d/firewall start

Usuwanie skryptu

edytuj

Aby usunąć skrypt musimy wejść do katalogu init.d wpisując w terminalu

 cd /etc/init.d/

Następnie musimy usunąć plik firewall wpisując

 rm firewall

Następnie musimy usunąć dowiązanie do skryptu

 update-rc.d firewall remove


Błędy skryptu

edytuj

Aby to sprawdzić wpisujemy w terminalu komendę

  sudo service firewall status

lub

  systemctl status firewall

Otrzymamy wynik w terminalu

  firewall.service - LSB: Start daemon at boot time
  Loaded: loaded (/etc/init.d/firewall)
  Active: active (exited) since nie 2016-11-06 09:13:49 CET; 1h 5min ago
  Process: 462 ExecStart=/etc/init.d/firewall start (code=exited, status=0/SUCCESS)
  lis 06 09:13:44 debian systemd[1]: Starting LSB: Start daemon at boot time...
  lis 06 09:13:49 debian systemd[1]: Started LSB: Start daemon at boot time.
  lis 06 10:17:18 debian systemd[1]: Started LSB: Start daemon at boot time.

Active: active (exited) - oznacza że skrypt działa, ale nie wie gdzie jest jego daemon by go monitorować. Jeśli istnieje musimy go zdefiniować w pliku unita, konfigurując opcje Type i ExecStart, zgodnie z dokumentacją systemd.


Skrypt zaawansowany

edytuj
#!/bin/bash
 
  ### BEGIN INIT INFO
# Provides:          firewall.sh
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO


# CZYSZCZENIE STARYCH REGUŁ
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat
iptables -F -t filter
iptables -X -t filter

# USTAWIENIE POLITYKI DZIAŁANIA
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable

# OCHRONA PRZED SKANOWANIEM ACK SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j LOG --log-prefix "ACK scan: "
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP # Metoda ACK (nmap -sA)

#OCHRONA PRZED SKANOWANIEM FIN SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j LOG --log-prefix "FIN scan: "
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP # Skanowanie FIN (nmap -sF)

#OCHRONA PRZED SKANOWANIEM XMAS TREE SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH PSH -j LOG --log-prefix "Xmas scan: "
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP # Metoda Xmas Tree (nmap -sX)

#OCHRONA PRZED SKANOWANIEM NULL SCAN
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j LOG --log-prefix "Null scan: "

#OCHRONA PRZED ATAKIEM Dos
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-prefix "SYN-flood: "
iptables -A syn-flood -j DROP

# OCHRONA PRZED ATAKIEM PING OF DEATH 
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG --log-prefix "Ping: "
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Ping of death

# ZABLOKOWANIE PINGOWANIA
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable

# BLOKOWANIE TELNETU
iptables -A OUTPUT -p tcp --dport telnet -j REJECT
iptables -A INPUT -p tcp --dport telnet -j REJECT

#ZAPIS DO LOGA ODRZUCONYCH PAKIETÓW PRZYCHODZĄCYCH W KATALOGU var/log/messages
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

Tworzenie skryptu firewalla dla Systemd

edytuj

Możemy utworzyć skrypt firewalla dla systemd wykorzystując tym razem sam systemd.

Tworzymy skrypt firewalla, który będzie się uruchamiał wraz ze startem naszego komputera.

Uruchamiamy edytor tekstu Gedit, wpisując w terminalu

 gedit

Tam wklejamy przykładowy skrypt firewalla - możesz użyć innego lecz pamiętaj do niego dołączyć na początku ten kod

#!/bin/bash

  ### BEGIN INIT INFO
# Provides:          firewall.sh
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Przykładowa konfiguracja iptables blokująca połączenia przychodzące

 
#!/bin/bash

### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

# Czyszczenie reguł

iptables -F

iptables -X

# Polityka bezpieczeństwa

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

# Reguły dla pętli zwrotnej

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -o lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

# Reguły dla łańcucha wejściowego

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Reguły dla łańcucha wyjściowego

iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Następnie zapisujemy nasz plik nadając mu nazwę firewall w katalogu Dokumenty

Teraz uruchamiamy Terminal z prawami roota - zostaniemy poproszeni o hasło

 root@debian-linux:/home/linux#

W terminalu musimy przejść do katalogu Dokumenty

wpisujemy

 ls

Teraz widzimy nasze katalogi

 root@debian-linux:/home/linux# ls
 Dokumenty  Muzyka  Obrazy  Pobrane  Publiczny  Pulpit  Szablony  Wideo

Wpisujemy

 cd Dokumenty

Widzimy że jesteśmy w katalogu Dokumenty

 root@debian-linux:/home/linux/Dokumenty# 

Wpisujemy ponownie ls by zobaczyć czy tam jest nasz plik firewall

 ls

Jeśli widzimy plik firewall to przystępujemy do następnej czynności.Kopiujemy nasz plik firewall do katalogu /etc/'.

W terminalu wpisujemy

  cp firewall /etc/

Następnie jeśli nie ma błędów nadajemy naszemu plikowi firewall prawa uruchamiania

 chmod 755 /etc/firewall

Następnie tworzy usługę firewall.service w terminalu wpisujemy

gedit /etc/systemd/system/firewall.service

W edytorze Gedit wyświetli nam się pusty dokument tam wklejamy skrypt usługi dla systemud.

[Unit]
Description=firewall
After=network.target

[Service]
RemainAfterExit=yes
ExecStart=/etc/firewall start
ExecStop=/etc/firewall stop 

[Install]
WantedBy=multi-user.target

Następnie zapisujemy plik. Jesteśmy znów w terminalu i uruchamiamy usługę firewall.service wpisując

 systemctl enable firewall.service

Następnie uruchomiamy firewalla wpisując

 systemctl start firewall.service

Następnie sprawdzamy czy działają nasze reguły w iptables wpisując

 sudo iptables -L

Powinny wyświetlić się nam nasze reguły. Ponadto możemy sprawdzić status firewalla wpisując

 systemctl status firewall.service

Powinniśmy otrzymać mniej więcej komunikat

firewall.service - firewall
   Loaded: loaded (/etc/systemd/system/firewall.service; enabled; vendor preset:
   '''Active: active (exited)''' since Thu 2017-03-16 16:24:03 CET; 1min 44s ago
 Main PID: 525 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/firewall.service

'''mar 16 16:24:03 debian systemd[1]: Started firewall.'''

Komunikaty Active: active (exited) i mar 16 16:24:03 debian systemd[1]: Started firewall. oznaczają że usługa firewall.service działa prawidłowo.

Ufw - frontend dla iptables

edytuj

UFW jest nakładką dla IPtables, jego zaletą jest to że jest bardzo prosty w obsłudze i jest mniej plików do konfiguracji. Aby go zainstalować, wpisujemy komendę:

apt-get install ufw

po instalacji możemy ustawić jego autostart w pliku konfiguracyjnym:

nano /etc/ufw/ufw.conf

zmieniamy wartość z:

ENABLED=no

na

ENABLED=yes

możemy także dodać osbługę protokołu IPv6:

IPV6=yes