homeLinux

Konfiguracja Firewalla opartego o iptables w Ubuntu Server Edition (10.04 LTS)

Po instalacji systemu przyszła pora na zabezpieczenie się przed światem zewnętrznym, przecież jest pełen niebezpieczeństw. Należy szybko zamknąć niepotrzebnie otwarte furtki za pomocą zapory ogniowej (jak to śmiesznie brzmi po polsku ;-) wolę angielskie określenie lub ogniomurek :-D )

Ponieważ nie lubię natywnego formatu reguł iptables przy konfiguracji firewalla stworzę skrypt pośredni z poleceniami dla iptables. Ten format jest bardziej czytelny (przynajmniej dla mnie) w późniejszej edycji. Po stworzeniu konfiguracji wykonamy skrypt z konfiguracją a następnie zapiszemy reguły przy pomocy iptables-save. Przy starcie naszego linuxa będziemy wczytywać przygotowany w ten sposób zestaw reguł poprzez polecenie iptables-restore.

W konsoli dla wygody (edycja niektórych plików wymaga uprawnień root-a) przechodzimy na konto administratora systemu komendą sudo su.
Tworzymy plik z regułami IP, będzie on zawierał konfigurację w formacie akceptowanym przez program iptables-restore. Następnie musimy nadać prawa do wykonywania pliku (możemy sprawdzić uprawnienia ls -l zmodyfikowane prawa dla pliku: -rwxr-xr-x ).

touch /etc/iptables.rules
chmod +x /etc/iptables.rules

Aby reguły były wczytywane podczas każdego uruchomienia systemu należy je dopisać do skryptu wykonywanego podczas startu – wykorzystamy plik z konfiguracją sieci /etc/network/interfaces.
Edycję pliku można dokonać dowolnym edytorem ja korzystam z menadżera plików Midnight Commander (polecenie mc – aby doinstalować aplikację  należy wykonać apt-get install mc)  dla wygody można użyć edytora ze środowiska graficznego gedit. Uruchomienie gedit z konsoli na prawach administratora powoduje, że edycja programem również następuje jako root (nie będzie problemu z dostępem do pliku).

#Przykładowa zawartość
auto eth0
iface eth0 inet dhcp

#dodajemy ładowanie reguł podczas podnoszenia interfejsu sieciowego
pre-up iptables-restore < /etc/iptables.rules

#możemy również dodać reguły, które mają się wykonać podczas wyłączania sieci
#post-down iptables-restore < /etc/iptables.downrules

W analogiczny sposób jak poprzednio tworzymy plik skryptu który będzie dla nas bardziej czytelny, będzie to nasz projekt firewalla.
Proponuję trzymać skrypt w katalogu użytkownika /home/user/iptables.rules.
touch /home/user/iptables.rules
chmod +x /home/user/iptables.rules
Edytujemy plik i wstawiamy naszą konfigurację.

#Wyczyść istniejące reguły, nie chcemy narobić bałaganu
	iptables -F INPUT
	iptables -F FORWARD
	iptables -F OUTPUT

#Odrzucenie ruchu wchodzącego
	iptables -P INPUT DROP

#Odrzucenie ruchu przekazującego
	iptables -P FORWARD DROP

#Akceptacja ruchu wychodzącego. Zakładamy, że ruch który wychodzi od nas jest bezpieczny.
	iptables -P OUTPUT ACCEPT

#Akceptacja ruchu na loopback, nasze usługi muszą mieć możliwość wzajemnie się komunikować.
	iptables -A INPUT -i lo -j ACCEPT
	iptables -A FORWARD -o lo -j ACCEPT

#Akceptujemy pakiety powiązane z danymi których wysłanie zainicjowane było przez nasz serwer (to co my nawiązujemy jest bezpieczne)
	iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
	iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED

#Otwarcie ruchu wchodzącego z sieci wewnętrznej - dla niektórych może być zbyt radykalnym posunięciem, ja jednak ufam temu co jest wewnątrz mojej własnej sieci (oczywiście proszę zmienić adres sieci na własny ;-) )
	iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

#Jeśli chcemy zezwalamy na ruch wchodzący z innych zaufanych sieci np. openVPN
	#iptables -A INPUT -s 10.170.1.0/24 -j ACCEPT

#Otwieramy porty dla usług, które mają być dostępne dla świata. Np. http
# iptables -A INPUT -p PROTOKÓŁ --dport NUMER PORTU -j ACCEPT
	iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Nasza konfiguracja firewall'a jest już gotowa. Ładujemy reguły poprzez wykonanie utworzonego przed chwilą skryptu.
Będąc w tym samym katalogu co skrypt wykonujemy polecenie ./iptables.rules w innym przypadku wywołujemy skrypt poprzez pełną ścieżkę /home/user/iptables.rules. Sprawdzamy czy reguły firewalla prawidłowo się załadowały (polecenie iptables -L)
następnie zapisujemy reguły firewalla załadowane w systemie do pliku, który będzie ładowany podczas startu systemu.
iptables-save > /etc/iptables.rules W celu późniejszej edycji wystarczy dopisać kolejne reguły wykonać skrypt i zapisać je do pliku /etc/iptables.rules. Po zmianach najlepiej jest przetestować efekt (tak dla pewności) jakimś skanerem portów w sieci jest dużo skanerów online, co umożliwi nam przetestowanie otwartych portów z zewnątrz. Jak dla mnie jest to najbardziej czytelna forma panowania nad ruchem sieciowym. Jeśli coś jest niejasne albo  "masło jest zbyt maślane" ;-) pisać w komentarzach. Postaram się poprawić.

4 komentarze do “Konfiguracja Firewalla opartego o iptables w Ubuntu Server Edition (10.04 LTS)

  • Mam problem z firewall’em pod Ubuntu 12.04. Po napisaniu skryptu i załadowaniu reguł firewall odcina mi internet, żadne pakiety nie przychodzą i nie wychodzą. Niżej zamieszczam iptables i skrypt. Jak ktoś może to niech pomoże rozwiązać problem.

    IPTABLES

    #Początek firewalla
    iptables -P INPUT ACCEPT
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    #Blokujemy niechciane adresy IP.
    iptables -A INPUT -d 209.222.138.10 -j DROP
    #Otwieranie portów dla wybranych usług.
    iptables -A INPUT –protocol tcp –destination-port 21 -j ACCEPT
    iptables -A INPUT –protocol tcp –destination-port 22 -j ACCEPT
    iptables -A INPUT –protocol tcp –destination-port 80 -j ACCEPT
    iptables -A INPUT –protocol tcp –destination-port 443 -j ACCEPT
    iptables -A INPUT –protocol tcp –destination-port 3306 -j ACCEPT
    iptables -A INPUT –protocol tcp –destination-port 6667 -j ACCEP
    iptables -A INPUT –protocol tcp –destination-port 8080 -j ACCEPT
    #Akceptacja ruchu na loopback, usługi muszą mieć możliwość komunikowania się między sobą.
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A FORWARD -i lo -j ACCEPT
    ——————————————————————————

    SKRYPT

    1
    #!/bin/bashce
    auto lo
    iface lo inet loopback
    #deklaracja zmiennych
    IPTABLES=/sbin/iptables #ścieżka do iptables
    NO_ROUTING=1 #czy forwardować pakiety?
    #Usuwamy poprzednie reguły
    $IPTABLES -F INPUT
    $IPTABLES -F FORWARD
    $IPTABLES -F OUTPUT
    #Zapisujemy cały ruch w logach
    $IPTEBLES -A INPUT -j LOG -m limit –limit 15/hour #15 logów na godzine
    $IPTABLES -A OUTPUT -j LOG -m limit –limit 15/hour
    $IPTABLES -A FORWARD -j LOG -m limit –limit 15/hour
    #Wyłączamy odpowiedzi na pingi
    echo „1” > /proc/sys/net/ipv4/icmp_echo_ignore_all
    #Włączamy logowanie dziwnych pakietów (spoofed.source routed.redirectc)
    echo „1” > /proc/sys/net/ipv4/conf/all/log_martians
    #dla poniższych argumentów 1 udostępnia usługę,
    #każda inna wartość zabrania do niej dostępu
    OPEN_FTP=1 #czy udostępnić usługę FTP
    OPEN_SSH=1 #czy udostępnić usługę SSH
    OPEN_HTTP=1 #czy udostępnić usługę HTTP
    #ustawiamy domyślną politykę
    $IPTABLES -P INPUT DROP
    if [ „$NO_ROUTING” = „1” ]; then
    $IPTABLES -P FORWARD DROP
    fi
    if [ „$OPEN_FTP” = „1” ]; then
    $IPTABLES -A INPUT –protocol tcp –destination-port 21 -j ACCEPT
    fi
    2
    if [ „$OPEN_SSH” = „1” ]; then
    $IPTABLES -A INPUT –protocol tcp –destination-port 22 -j ACCEPT
    fi
    if [ „$OPEN_HTTP” = „1” ]; then
    $IPTABLES -A INPUT –protocol tcp –destinaton-port 80 -j ACCEPT
    fi
    #otwieramy jeszcze drogę powrotną pakietom FTP,HTTP,SSH…
    $IPTABLES -A INPUT –protocol tcp –source-port 21 -j ACCEPT
    $IPTABLES -A INPUT –protocol tcp –source-port 22 -j ACCEPT
    $IPTABLES -A INPUT –protocol tco –source-port 80 -j ACCEPT
    $IPTABLES -A INPUT –protocol tcp –source-port 8080 -j ACCEPT
    #droga do DNS-a
    $IPTABLES -A INPUT -s 85.193.224.2 -j ACCEPT

  • Bardzo ładnie i jasno napisany! – Nie mniej jednak taki z serii szybki i prosty. :)

    Może pomógłbyś w rozwikłaniu męczącego mnie problemu. Jak zablokować cały ruch dla danego IP i zezwolić mu wejść tylko na WWW (port:80) na strony, które są ujęte w regułce iptables dla tego IP ?? :)

Dodaj komentarz

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