Prosty firewall na bazie iptables

Tym razem zajmiemy się budową prostego Firewalla na bazie najpopularniejszego narzędzia – Iptables. Dlaczego iptables? Powodów jest wiele. Iptables jest niemal w każdej dystrybucji, inne rozwiązania, które w zamyśle są lub miały być mniej lub bardziej „userfriendly” bazują tak na prawdę na iptables dokonując wpisy do niego. Przykładem może być tu ufw. Czy jest prościej? Jako osoba, która „wychowała się” na iptables nie sądzę.

Czym charakteryzuje się dobry firewall? Tym, że jest skuteczny, a iptables niewątpliwie jest skuteczne, dlatego to właśnie na tym narzędziu będziemy opierać nasze pierwsze cybertarcze. Zaczniemy od prostych wpisów, które każdy firewall mieć musi.

Na początek zainstaluj odpowiedni pakiet.

apt install iptables-persistent

Pierwsze wpisy powinny zacząć się obowiązkowo od tego:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

W tym momencie dopuszczamy do ruchu wszystkie już nawiązane połączenia (tak, abyśmy nie odcięli siebie samych), oraz dopuszczamy pełen ruch w ramach localhosta.

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Tutaj odrzucamy wszystkie błędne pakiety.

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

Na sam koniec odrzucamy wszystko co nie pasuje do wyżej dopuszczonych wraz z blokadą odpowiedzi ICMP. Ty msamym informujemy nadawcę, że pakiet został odrzucony bez zwrotnej odpowiedzi. Można w tym miejscu użyć po prostu Reject’a. Dobrą praktyką jest jednak zastosowanie powyższego wpisu.

Inne typy Reject’a, ale nie będziemy się nimi dzisiaj zajmować.

 icmp-net-unreachable
 icmp-host-unreachable
 icmp-port-unreachable
 icmp-proto-unreachable
 icmp-net-prohibited
 icmp-host-prohibited or
 icmp-admin-prohibited (*)

Kolejnymi ważnymi wpisami będą wpisy do sekcji FORWARD (choć na końcu i tak ją zablokujemy, ale to dobra praktyka mieć już tam wpisy).

iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

Podobnie jak wyżej dopuszczamy tylko to co powinno być dopuszczone, resztę odrzucamy.

Dodajemy kolejne regułki do sekcji INPUT, tak abyśmy mieli dostęp do SSH i innych usług w zależności od tego co mamy.

SSH:

iptables -I INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT

WWW:

iptables -I INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 443-m conntrack --ctstate NEW,UNTRACKED -j ACCEPT

Wszystkie inne usługi dodajemy w ten sam sposób zmieniając tylko port. Ważnym jest, aby w tym przypadku dodawać zawsze regułki nad stosem (przełącznik -I) zamiast pod stosem (przełącznik -A), dlatego, że iptables działa stosowo. Na końcu iptables powinien znaleźć zawsze się wpis blokujący wszystko co nie pasuje, zatem jeżeli umieścimy coś pod tą linijką – nie będzie działać bo iptables dopasuje tylko pierwszą regułę i resztę pominie.

Na koniec zostaje nam zablokowanie całkowicie ruchu.

iptables -P INPUT DROP
iptables -P FORWARD DROP 

Dobrą praktyką jest zablokowanie całkowicie protokołu ipv6 w iptables jeśli nie korzystamy z ipv6, a na przykład nie wyłączylismy tego protokołu w systemie. W tym celu używamy trzech prostych regułek.

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

Na koniec pozostaje nam zapisanie zmian, tak aby po restarcie systemu nasze regułki przywracane były automatycznie.

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v4

Tak przygotowany prosty firewall jest doskonałą bazą do dalszej zabawy i rozbudowywania go o inne elementy jak limitowanie, logowanie, mechanizmy blokujące itd. W kolejnych wpisach poświęconych iptables będziemy rozbudowywać nasz firewall.

Leave a Reply

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *