Iptables jest programem sterującym filtrami pakietów używanym głównie jako zapora sieciowa (firewall) lub NAT. Strona domowa projektu www.netfilter.org. Linux tradycyjnie zawiera jedynie ograniczoną formę mechanizmu tłumaczenia adresów sieciowych (NAT, ang. Network Address Translation), co poprawnie określa się jako tłumaczenie adresów portów (PAT, ang. Port Address Translation). Zamiast posługiwać się zakresami adresów IP, jak w prawdziwej implementacji NAT, PAT przekazuję wszystkie połączenia na pojedynczy adres. Szczegóły i różnice nie mają tutaj jednak większego znaczenia. Program iptables implementuje nie tylko NAT, ale również umożliwia filtrowanie pakietów. Wcześniejsze wersje systemu Linux miały to trochę nieuporządkowane ale od wprowadzenia iptables zarysowały się wyraźniejsze różnice między NAT, a funkcją filtracji pakietów.
Tradycyjnie firewall konfigurowany jest pomiędzy siecią LAN , a siecią zewnętrzną taką jak internet. Ale zasady bezpieczeństwa mogą wymagać by każdy system posiadał uruchomioną zaporę. RHEL6 zwiera firewall w każdej domyślnej konfiguracji. Najlepsza zapora jest w warstwie w której można filtrować pakiety np.: narzędziem iptables. Kontrola ruchu pakietów obejmuję ich drogę od startu do celu w cieci TCP.
Linux do komunikacji z siecią używa protokołu TCP/IP. Różne protokoły używają danych portów oraz istnieją protokoły domyślne jakie zdefiniowane są w pliku /etc/services. Aby móc się właściwie posługiwać narzędziem iptables musimy wiedzieć jaka usługa nasłuchuje na jakim porcie. Poniżej znajdzie się lista popularnie używanych usług wraz z portami nasłuchu. Pamiętajmy, że niektóre z tych portów mogą używać jednego lub więcej protokołów komunikacyjnych takich jak TCP (Transmision Control Protocol), UDP (User Datagram Protocol) i ICMP (Internet Control Message Protocol). Informację o tym jaka usługa ma powiązanie z jakim portem znajdziemy w pliku /etc/services. Przykładowo serwer FTP może komunikować się dwoma sposobami zarówno TCP jaki UDP.
ftp 21/tcp
ftp 21/udp
Podstawowe usługi i ich porty komunikacyjne
- 21 - FTP
- 22 - Secure SHell(SSH)
- 23 - Telnet
- 25 - Simple Mail Transfer Protocol (SMTP) Postfix, Sendmail
- 53 - Domain Name Service servers
- 80 - Hypertext Transfer Protocol (HTTP)
- 88 - Kerberos
- 110 - Post Office Protocol, version 3 (POP3)
- 139 - NetBios
- 143 - Internet Mail Access Protocol (IMAP)
- 443 - HTTP,secure (HTTPS)
IPTABLES
Filozofią kryjącą się za iptables są "łańcuchy", które zawierają zestawy reguł dla każdego pakietu sieciowego do którego zostały przypisane. Każda reguła robi dwie rzeczy określa warunki jakie pakiet musi spełniać i działania jakie będą wykonane jeżeli pakiet pasuje do określonych warunków.
Iptables używa prostego formatu poleceń :
iptables -t tabletype <kierunek działania> <wzór pakietu> -j <co zrobić>
Przeanalizujmy to polecenie krok po kroku. Pierwszym przełącznikiem jest -t tabletype. Mamy dwie podstawowe opcje tabletype w iptables:
- filter Ustawia regułe dla filtrowania pakietu
- nat Konfiguruje tłumaczenie adresu sieciowego
Domyślnie filtrowanie nie musi być określone w -t tabletype ponieważ iptables określa że polecenie zawiera regułę dla pakietu , dalej mamy <kierunek działania> gdzie znajdą się cztery podstawowe działania zawarte w narzędziu iptables:
- -A (--append) Dołącza regułę na końcu łańcucha
- -D (--delete) Usunięcie reguły z łańcucha
- -L (--list) Lista aktualnie skonfigurowanych reguł w łańcuchu
- -F (--flush) Odświeża wszystkie reguły w aktualnym łańcuchu iptables
Jeżeli dodajemy lub usuwamy coś z łańcucha powinniśmy zatwierdzić dla przemieszczających się w sieci danych w jednej z trzech wytycznych:
- INPUT Wszystkie pakiety przychodzące będę sprawdzone z regułą z łańcucha
- OUTPUT Wszystkie pakiety wychodzące będę ponownie sprawdzone z regułą łańcucha
- FORWARD Wszystkie pakiety zostaną przesłane na inny host i ponownie sprawdzone z regułami zawartymi w iptables.
Zazwyczaj wszystkie te dyrektywy są nazwą danego łańcucha.
Następnie musimy skonfigurować <wzór pakietu> . Wszystkie zapory iptables sprawdzają każdy pakiet ze wzorcem. Prostym wzorcem może być adres IP:
- -s adres_IP Wszystkie pakiety będą sprawdzane z jakiego adresu zostały wysłane
- -d adres_IP Wszystkie pakiety będą sprawdzane do jakiego adresu IP zmierzają
Wzorzec pakietu może być bardziej złożony. W TCP/IP, pakiety przesyłane są za pomocą protokołów TCP, UDP lub ICMP. Możemy ustawić protokół przełącznikiem -p dla portu docelowego. Dla przykładu : -p tcp --dport 80 rozszerzenie mające wpływ na użytkowników sieci zewnętrznej próbujących użyć protokołu HTTP.
Jeżeli polecenie iptables dokona porównania pakietu z wzorcem i będzie ono poprawne trzeba wiedzieć co dalej z takim pakietem zrobić. Stanowi to ostatnią opcję polecenia -j <co zrobić>. Podstawowe opcje wyglądają następująco:
- DROP Pakiet zostaje zrzucony. Żadna wiadomość nie jest wysyłana w odpowiedzi
- REJECT Pakiet zostaje zrzucony. Zostaje wysłana wiadomość o błędzie.
- ACCEPT Pakiet otrzymuje pozwolenie na przejście z wykonaniem działania -A : INPUT, OUTPUT lub FORWARD
Zobaczmy kilka przykładów jak skonfigurować zaporę stosując polecenia iptables. Pierwszym krokiem jest zawsze sprawdzenie aktualnej konfiguracji przy pomocy polecenia:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ftp
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Jeżeli iptables zostało poprawnie skonfigurowane powinniśmy zobaczyć łańcuchy w trzech różnych kategoriach : INPUT, FORWARD oraz OUTPUT.
![]() |
Schemat działania iptables - źródło Redhat.com |
Utrzymanie zapory w działaniu.
Zapora Linuxa bazuje na narzędziu iptables oraz usłudze o tej samej nazwie. Przeglądając aktualne zasady które wyświetliliśmy poleceniem # iptables -L możemy się domyślić, że czysta pusta lista reguł przedstawia się następująco:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Jeżeli usługa iptables nie jest uruchomiona należy upewnić się że można ją uruchomić oraz mieć pewność, że zostanie uruchomiona po restarcie systemu. Do obsługi przydadzą się polecenia:
# /etc/init.d/iptables start
# chkconfig iptables on
Reguły na jakich bazuję zapora w systemie RedHat znajdują się w pliku /etc/sysconfig/iptables.
# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth+ -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
Domyślne ustawienia zapory w RHEL 6
Wcześniej wyświetlaliśmy już domyślne ustawienia przy pomocy polecenia # iptables -L i wiemy że reguły zapory podzielone są na trzy kategorię (INPUT, FORWARD, OUTPUT). Informację znajdują się w sześciu kolumnach zawierających opcje narzędzia iptables. To co wyświetliliśmy bazuje na zapisanych w pliku /etc/sysconfig/iptables łańcuchach reguł. Pierwsza linia informuję, że regułami są reguły filtrowania. Alternatywnie mogą to być reguły określające NAT.
*filter
Dalej ruch sieciowy do lokalnego systemu przeznaczony do przesłania dalej jest normalnie akceptowany co ustawione zostało opcją ACCEPT.
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
Niektóre profesjonalne zabezpieczenia zawarte w U.S National Security Agency sugerują by zmienić opcję ACCEPT na DROP dla linii INPUT oraz FORWARD. Ten sposób konfiguracji zabezpieczeń dotyczy poziomu RedHat Enterprise Security Network w kursie RH333 teraz zajmujemy się RHCE.
[0:0] jest licznikiem bajtów i pakietów i pozycją startową w tym przypadku jest wartość 0. Linie te umożliwiają wprowadzenie poleceń iptables. Każda z opcji i przełączników została również opisana na strona systemowego podręcznika man.
Następne linie utrzymują aktualną komunikację sieciową w działaniu. Opcja ESTABLISHED kontynuuje akceptowanie pakietów aktualnego połączenia. Opcja RELATED akceptuje pakiety do przesłania przez sieć taką jak FTP.
-A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
W następnej kolejności akceptujemy pakiety wędrujące w protokole ICMP.
-A INPUT -p icmp -j ACCEPT
Dalej konfigurujemy akceptacje dla połączeń przez interfejs loopback oraz interfejsy eth
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth+ -j ACCEPT
Kolejne linie określają dopasowanie pakietów przesłanych nowym połączeniem przez protokół TCP przesłanych do portu docelowego o numerze 22. Pakiety spełniające wszystkie kryteria zostaną zaakceptowane.
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
Ostatnie dwie reguły dla wszystkich innych pakietów wysyłają informacje zawartą w icmp-host-prohibited:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
Zakończenie wpisów łańcuchów reguł zamyka znacznik COMMIT
Popularne usługi wraz z portami wymagające konfiguracji zapory iptables
Amanda Backup Client
Klient zawarty w Advanced Maryland Automatic Network Disc Archiver (AMANDA) potrzebuje konfiguracji protokołu UDP na porcie 10080
Bacula
Serwer kopii zapasowych o otwartym kodzie źródłowym (Open Source) wymaga konfiguracji TCP na portach 9101,9102 i 9103
Bacula Client
Klient serwera kopii zapasowych Bacula potrzebna konfiguracja portu TCP 9102
DNS
Usługa Serwera nazw domenowych potrzebna konfiguracja protokołów UDP i TCP na porcie 53
FTP
Protokół transferu plików serwer do działania wykorzystuje port TCP 21
IMAP
IMAP bez SSL zazwyczaj wykorzystuje TCP port 993
IPsec
UDP port 500
Mail (SMTP)
Simple Mail Transport Protocol - sendmail, postfix potrzebuje TCP 25
Multicast DNS (mDNS)
UDP port 5353
NFS4
TCP port 2049
Network Printing Client
Standardowo klient wydruku potrzebuje UDP port 631
Network Printing Server
Serwer wydruku zazwyczaj konfigurowany jest na TCP oraz UDP 631
Open VPN
Wirtualna sieć prywatna (Open source) UDP port 1194
POP3 bez SSL
Zwyczajowo zastosowanie ma tu TCP port 995
RADIUS
UDP port 1812 oraz 1813
RedHat Cluster Suite
TCP port 11111 oraz 21064 , UDP 5404 oraz 5405
Samba
Protokół komunikacyjny stosowany do komunikacji z sieciami Microsoft konfigurowany na TCP port 139 i 445 oraz UDP 137 i 138
Samba Client
Klient dla komunikacji z sieciami Microsoft protokół UDP porty 137 i 138
Secure WWW (HTTPS)
Komunikacja z bezpiecznym serwerem www TCP port 443
SSH
Serwer SSH używa TCP port 22
TFTP server oraz client
Komunikacja z Trivial File Transfer Protocol odbywa się przez TCP port 69
Virtual Machine Management (KVM)
Dostęp zdalny przebiega przy użyciu TCP port 16509
WWW (HTTP)
Standardowy port serwera WWW TCP port 80
Graficzne narzędzia konfiguracyjne zaporę sieciową
W systemie RedHat do konfigurowania zapory sieciowej iptables mamy również dostępne narzędzia z graficznym interfejsem. By je uruchomić z poziomu konsoli wydajemy polecenie :
system-config-firewall-tui
Narzędzie w prosty sposób umożliwia włączenie lub wyłączenie zapory dla danej usługi lub też ustawienie Forward.
LINKI
- http://www.sebool.net/index.php/firewall-iptables.html
- http://wiki.centos.org/HowTos/Network/IPTables
- http://www.linuxhomenetworking.com/ - zastosowanie iptables
- Linux - RHCE - SSH - Kontrola dostępu
Bardzo fajnie napisane. Jestem pod wrażeniem i pozdrawiam.
OdpowiedzUsuń