Debian - uniwersalna instalacja/Konfigurowanie iptables
UWAGA! Autor nie bierze odpowiedzialności za wszelkie szkody wynikłe po skorzystaniu z niżej wymienionej porady. Rozdział ten ma celu przybliżenie zwykłemu użytkownikowi wiedzy w zakresie zabezpieczeń systemu GNU/Linux! |
UWAGA! JEŚLI MASZ STOSOWNĄ WIEDZĘ PROSZĘ O UZUPEŁNIENIE TEGO TEMATU W PRZYSTĘPNY SPOSÓB |
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]Sysvinit (System V) - jest to pierwszy program uruchamiany w systemach Linux przez jądro w trakcie procesu uruchamiania systemu operacyjnego. Następnie na podstawie plików konfiguracyjnych lub skryptów startowych init uruchamia pozostałe procesy systemowe. Sysvinit był domyślnym w Debianie, łącznie z wersją Wheezy (7.0). Natomiast Debian Jessie (8.0) posiada Systemd - nowy program inicjalizujący, zarządzający systemem i usługami (units - programy działające w tle, uruchomione jednorazowo lub cyklicznie |
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
chmod (ang. change mode - zmiana atrybutu) — polecenie zmiany zezwoleń dostępu do plików w systemach uniksowych. |
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
update-rc.d - instaluje lub usuwa dowiązania do skryptów startowych w stylu System-V |
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]Jeśli stworzymy skrypt firewall dla sysvinit, używając go w systemd otrzymamy przy starcie systemu komunikat - systemd-sysv-generator [179]: Ignoring creation of an alias firewall.service for itse. Oznacza to, że skrypt nie został stworzony dla systemd i firewall.service został zignorowany. Mimo to skrypt ten został uruchomiony i działa. |
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
chmod (ang. change mode - zmiana atrybutu) — polecenie zmiany zezwoleń dostępu do plików w systemach uniksowych. |
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