Firewall w Slackware


Artykuł ten jest kontynuacja tematów związanych z bezpieczeństwem sieciowym i dotyczy firewalla dla pojedyńczej stacji (bez podsieci). Firewall oparty jest na programie iptables i dystrybucji Slackware. Po zaznajomieniu się z dokumentacją i różnymi opisami w czasopismach i w internecie stworzyłem zbiór reguł filtrujących ruch pakietów w sieci. Przy standardowej instalacji Slackware w pliku /etc/rc.d/rc.inet2 jest wpis o uruchomieniu naszego firewalla o treści:
    if [ -x /etc/rc.d/rc.firewall ]; then
      /etc/rc.d/rc.firewall start
    fi
    
oraz wpis o uruchomieniu w jądrze filtrowania pakietów:
    IPV4_FORWARD=1
    if [ -f /proc/sys/net/ipv4/ip_forward ]; then
      if [ "$IPV4_FORWARD" = "1" ]; then
        echo "Activating IPv4 packet forwarding."
        echo 1 > /proc/sys/net/ipv4/ip_forward
      else
        echo "Disabling IPv4 packet forwarding."
        echo 0 > /proc/sys/net/ipv4/ip_forward
      fi
    fi
    

Po utworzeniu w katalogu /etc/rc.d pliku o nazwie rc.firewall i nadaniu mu praw wykonywalności wstawiłem do niego reguły filtrujące ten ruch pakietów. W moim przypadku są to reguły, które opiszę po kolei:
    #!/bin/sh
    
    #--------------------------
    #załadowanie modułów śledzenia pakietów
    
    /sbin/modprobe ip_conntrack
    /sbin/modprobe ip_conntrack_ftp
    
    #--------------------------
    #wyczyszczenie reguł zapory
    
    iptables -F
    iptables -F -t nat
    
    #--------------------------
    #zakazanie wszelkich działań
    
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    
    #--------------------------
    #akceptowanie wszystkich połączeń dotyczących pętli loopback
    
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    iptables -A FORWARD -o lo -j ACCEPT
    
    #--------------------------
    #informowanie o nieosiągalności portów dla PROXY (1080)
    
    iptables -A INPUT -p tcp --dst 0/0 --dport 1080 -j REJECT --reject-with icmp-port-unreachable
    
    #-------------------------
    #odpowiadanie na zapytania z sieci wewnętrznej
    
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
    
    #-------------------------
    #akceptowanie już nawiązanych połączeń
    
    iptables -A INPUT -p tcp -j ACCEPT -m state --state ESTABLISHED
    iptables -A INPUT -p udp -j ACCEPT -m state --state ESTABLISHED
    iptables -A INPUT -p icmp -j ACCEPT -m state --state ESTABLISHED
    iptables -A INPUT -p icmp -j ACCEPT -m state --state RELATED
    #--------------------------
    iptables -A FORWARD -p tcp -j ACCEPT -m state --state ESTABLISHED
    iptables -A FORWARD -p udp -j ACCEPT -m state --state ESTABLISHED
    iptables -A FORWARD -p icmp -j ACCEPT -m state --state ESTABLISHED
    iptables -A FORWARD -p tcp -j ACCEPT -m state --state RELATED
    iptables -A FORWARD -p icmp -j ACCEPT -m state --state RELATED
    #--------------------------
    iptables -A OUTPUT -p tcp -j ACCEPT -m state --state ESTABLISHED
    iptables -A OUTPUT -p udp -j ACCEPT -m state --state ESTABLISHED
    iptables -A OUTPUT -p icmp -j ACCEPT -m state --state ESTABLISHED
    iptables -A OUTPUT -p tcp -j ACCEPT -m state --state RELATED
    iptables -A OUTPUT -p icmp -j ACCEPT -m state --state RELATED
    
    #--------------------------
    #dostęp do usługi ssh z internetu
    
    iptables -A INPUT -i eth0 -p tcp -j ACCEPT -m state --state NEW -d 80.58.72.50 --destination-port 22
    
    #--------------------------
    #dostęp do usługi http - serwer z internetu
    
    iptables -A INPUT -i eth0 -p tcp -j ACCEPT -m state --state NEW -d 80.58.72.50 --destination-port 80
    
    #--------------------------
    #dostęp do usługi ftp - serwer z internetu
    
    iptables -A INPUT -i eth0 -p tcp -j ACCEPT -m state --state NEW -d 80.58.72.50 --destination-port 21
    
    #--------------------------
    #uprawnianie użytkowników do korzystania z internetu (otwarte porty usług)
    
    TCP_OUT_ALLOW=20,21,22,25,53,80,110,119,443,1110,1550,6346,8074,8080
    UDP_OUT_ALLOW=20,21,22,25,53,110,119,123,1110,6346
    #--------------------------
    iptables -A OUTPUT -o eth0 -p tcp -j ACCEPT -m state --state NEW -m multiport --destination-port $TCP_OUT_ALLOW
    iptables -A OUTPUT -o eth0 -p udp -j ACCEPT -m state --state NEW -m multiport --destination-port $UDP_OUT_ALLOW
    iptables -A FORWARD -o eth0 -p tcp -j ACCEPT -m state --state NEW -m multiport --destination-port $TCP_OUT_ALLOW
    iptables -A FORWARD -o eth0 -p udp -j ACCEPT -m state --state NEW -m multiport --destination-port $UDP_OUT_ALLOW
    
    #--------------------------
    #zapisywanie do logów innnych prób połączeń niż w/w
    
    iptables -A INPUT -j LOG -m limit --limit 15/hour
    iptables -A OUTPUT -j LOG -m limit --limit 15/hour
    iptables -A FORWARD -j LOG -m limit --limit 15/hour
    

Zmienne TCP_OUT_ALLOW oraz UDP_OUT_ALLOW przyjmują wartości portów tych usług. Wykaz portów i usług jest zamieszczony w plikach /etc/services i /etc/protocols. Dla usługi ftp są to porty o mumerach: 20/tcp, 20/udp, 21/tcp i 21/udp. O tym jakie numery portów należy wpisać decydujemy przez wpisywanie pojedyńczego numeru usługi i próbowanie, czy ona zadziała. W ten sposób zapewnimy minimalną (ale konieczną) ilość otwartych portów. Porty o numerach podanych w listingu firewalla zapewniają obsługę poczta - klient, grupy dyskusyjne - klient, www - klient i serwer, ftp - klient i serwer, ssh - klient i serwer oraz gtk-gnutelli i kadu. Firewall oparty na tym skrypcie pracuje poprawnie i nie mam powodów do narzekań. Ze względu na fakt, że internet mam przez łącze sieci telewizji kablowej, firewall został sprawdzony na stałym numerze IP zewnętrznym i wewnętrznym oraz na zmiennym wewnętrznym z DHCP. We wszystkich przypadkach pracował dobrze. I jeszcze jedna uwaga na koniec. Zwiększa się ilość ładowanych modułów i rośnie zajętość pamięci, co widać poniżej. Aby móc korzystać z irc należy dopisać na początku skryptu polecenie załadowania modułu: /sbin/modprobe ip_conntrack_irc. Dodatkowo należy dodać numer portu irc- a (194) do zmiennej TCP_OUT_ALLOW i jeżeli jest to konieczne do UDP_OUT_ALLOW. Ilość wpisów do każdej z tych zmiennych nie może przekraczać piętnastu. Przy większej ilości wpisów należy dopisywać osobne łańcuchy.


Stąd można pobrać przykładowy plik firewalla dla pojedyńczego komputera pracującego w sieci telewizji kablowej.

do góry
11.02.2003 i na bieżąco.