Strona zgodnie z Polityką plików cookies wykorzystuje pojedynczy plik cookie do poprawnego działania licznika odwiedzin.
Możesz określić warunki przechowywania lub dostępu do plików cookies w ustawieniach Twojej przeglądarki.

 Centrum Usług Sieciowych 
 
Komputerowy system sterowania urządzeniami
 
 
Ostatnia aktualizacja: 04.08.2015
Wstęp
Sprzęt
Oprogramowanie
Instalacja
AP i DHCP
ProFTPd
Firewall
Apache z PHP
MySQL
Dźwięk
Obsługa LPT
Moduł 230V
LPT przez WWW
Cron
Muzyka  NEW
Budzik WWW
Termometr
Automatyzacja
Kontrola dostępu
Co dalej?
Konfiguracja Firewall'a

Jeśli nasz system ma być oknem na świat trzeba go jakoś zabezpieczyć. Użycie Firewall'a jest obligatoryjne. To jednak wcale nie taka skomplikowana sprawa. Przez lata studiów wpajano mi różne metody tworzenia Firewall'a. Najwygodniej napisać skrypt, który się wszystkim zajmie. Poniżej plik /bin/firewall. Jego zawartość ewoluowała od lat wraz z moją wiedzą na ten temat. Wyjaśnieniami zajmę się później =)

#!/bin/sh

# Start firewall'a:
firewall_start() {
    echo "Starting firewall"
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    iptables -F
    iptables -F -t nat
    iptables -A INPUT -i lo -j ACCEPT
    # iptables -A FORWARD -i eth1 -o eth0 -s 10.0.0.0/24 -d 0/0 -j ACCEPT
    # iptables -A FORWARD -i eth0 -o eth1 -s 0/0 -d 10.0.0.0/24 -j ACCEPT
    # iptables -A POSTROUTING -t nat -s 10.0.0.0/24 -d 0/0 -j MASQUERADE
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22
    -j ACCEPT
    iptables -A INPUT -p icmp -j ACCEPT
    iptables -A OUTPUT -p icmp -j ACCEPT

    #dhcp
    iptables -A INPUT -p udp --dport 67 -j ACCEPT

    #ftp
    iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -A INPUT -p udp --dport 21 -j ACCEPT
    iptables -A INPUT -p tcp --dport 65500:65535 -j ACCEPT
    iptables -A INPUT -p udp --dport 65500:65535 -j ACCEPT

    #www
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    #torrent
    # iptables -A INPUT -p tcp --dport 6881:6883 -j ACCEPT
    # iptables -A INPUT -p udp --dport 6881:6883 -j ACCEPT

    #teamspeak
    # iptables -A INPUT -p tcp --dport 8767 -j ACCEPT
    # iptables -A INPUT -p udp --dport 8767 -j ACCEPT

    # OpenTTDX
    # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3979 -j DNAT        --to-destination 10.0.0.3:3979
    # iptables -t nat -A PREROUTING -p udp -i eth0 --dport 3979 -j DNAT        --to-destination 10.0.0.3:3979

    # SSH Forward
    # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 777 -j DNAT        --to-destination 10.0.0.3:22

    # WWW Forward
    # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT        --to-destination 10.0.0.3:80

    # Torrent
    # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT        --to-destination 10.0.0.3:800
    # iptables -t nat -A PREROUTING -p udp -i eth0 --dport 800 -j DNAT        --to-destination 10.0.0.3:800
    # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 801 -j DNAT        --to-destination 10.0.0.3:801
    # iptables -t nat -A PREROUTING -p udp -i eth0 --dport 801 -j DNAT        --to-destination 10.0.0.3:801

    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT DROP
    ip6tables -F
}

# Stop firewall'a:
firewall_stop() {
    echo "Stopping firewall"
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    iptables -F
    iptables -F -t nat
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT DROP
    ip6tables -F
}

# Otwarcie firewall'a:
firewall_open() {
    echo "Opening firewall"
    iptables -P INPUT ACCEPT
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    iptables -F
    iptables -F -t nat
    ip6tables -P INPUT ACCEPT
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT
    ip6tables -F
}

# Restart firewall'a:
firewall_restart() {
    firewall_stop
    sleep 1
    firewall_start
}

case "$1" in
'start')
    firewall_start
    ;;
'stop')
    firewall_stop
    ;;
'open')
    firewall_open
    ;;
'restart')
    firewall_restart
    ;;
*)
    echo "usage rc.firewall: start|stop|open|restart"
esac

Jak widać mamy tu sporo zahaszowanych linijek. Nie ma sensu ich usuwanie bo mogą się przydać. Są tu między innymi przykłady otwierania portów, przekierowywania portów, forwardingu, itp. Mamy trzy stany naszego firewall'a:

- uruchomiony (start)
- otwarty (open)
- zamknięty (stop)

Firewall zamknięty nie wpuszcza nic. Odrzuca na dzień dobry wszystkie połączenia. Gdy pracujemy zdalnie i zamkniemy sobie Firewall'a będzie przerąbane =].
Firewall otwarty wpuszcza wszystko. Teraz, gdy nie mamy jeszcze ustawionego FW jest on otwarty.
Firewall uruchomiony przepuszcza:

- wszystkie połączenia wychodzące (raczej norma)
- połączenia przychodzące z flagami RELATED lub ESTABLISHED (połączenia nawiązane
   wcześniej jako ruch wychodzący)
- nowe połączenia na port 22 (SSH - potrzebne do zdalnej pracy)
- zapytania na port 67 (nasz serwer dhcp)
- połączenia na porty 21 i zakres 65500-65535 (nasz ProFTPd)
- połączenia na port 80 (serwer WWW)

Gdy już utworzymy plik należy nadać mu prawa wykonywalności:

chmod +x /bin/firewall

Nasz skrypt ma cztery możliwości użycia:

firewall start - uruchamia
firewall stop - zamyka
firewall open - otwiera
firewall restart - wykonuje stop i po sekundzie start

Aby Firewall uruchamiał sie wraz ze startem systemu dodajemy firewall start na samym początku /etc/rc.d/rc.local.

Przygody skacowanego informatyka

Siedzi sobie wczorajszy informatyk przed laptopem zalogowany przez SSH na swój przypadkiem oddalony o 1000km serwer, do którego nikt nie ma fizycznego dostępu. Bawi się Firewall'em:

wprowadza zmiany w /bin/firewall
firewall restart
testuje
wprowadza zmiany
firewall restart
testuje
wprowadza zmiany
firewall restart
połączenie przerwane!

Kolejne próby połączenia nie przynoszą rezultatu. Każdemu może się zdarzyć zatrzaśnięcie sobie drzwi podczas modernizacji zamka =D. To banalny, ale wbrew pozorom częsty błąd. Jest na to rada. Stwórzmy sobie plik ./ftest, nadajmy mu prawa wykonywalności, a w środek wklejmy:

#!/bin/bash

touch /tmp/ftest
firewall restart
sleep 10
if [ -f /tmp/ftest ]; then
   rm -f /tmp/ftest
   firewall open
fi

Ten skrypt utworzy plik - flagę /tmp/ftest, zaktualizuje nam Firewall, poczeka 10 sekund, jeśli flaga nadal istnieje otworzy Firewall. Po każdym użyciu mamy 10 sekund na ręczne usunięcie /tmp/ftest. Jeśli tego nie zrobimy (bo nas serwer wyrzuci) po tym czasie Firewall zostanie otwarty. Teraz procedura wygląda tak:

wprowadzamy zmiany w /bin/firewall
./ftest & (symbol & spowoduje uruchomienie skryptu w tle)
rm -f /tmp/ftest
testujemy
wprowadzamy zmiany
./ftest &
rm -f /tmp/ftest
testujemy
wprowadzamy zmiany
./ftest &
połączenie przerwane!

Nie mamy możliwości usunięcia pliku /tmp/ftest więc po 10 sekundach Firewall zostanie otwarty i znów dostaniemy się na serwer =).

Na chwilę obecną nie ma potrzeby wprowadzania zmian do naszego Firewall'a, a później się zobaczy.

Na górę
Autor:

image
int

Kontakt:
facebook.com/int84
int281184@gmail.com
GG 5317390

Licznik:
27000

Valid HTML 4.01 Strict Valid CSS

Strona stworzona przy użyciu PageBreeze, Notepad++, oraz pakietu XAMPP dla sustemu Windows, a także aplikacji KSWEB i DroidEdit Pro dla systemu Android.