Wymiana firwalla w OpenWrt na własny
Ostatnia zmiana: 2013-11-26 18:43

Firewall w ostatnich wersjach OpenWrt Kamikaze jest dość skomplikowany. Wymuszenie składni w pliku /etc/config/firewall zgodnej z LuCI spowodowało wymuszenie stosowania określonych zapisów bez możliwości wykonania bardziej skompilowanych składni.
Prezentowane poniżej rozwiązanie ma na celu zastąpienie wbudowanego firewalla standardowymi regułkami iptables.
UWAGA: jeżeli nie wiesz co to jest iptables, jak działa kształtowanie ruchu i co można zrobić za pomocą iptables w linuksie - ten poradnik nie jest dla Ciebie. Poniższe rozwiązanie z pewnymi modyfikacjami działa od jakiegoś czasu u mnie - co nie oznacza że będzie działać dobrze wszędzie i u każdego. Traktuj to jako wskazówki a nie ścisłe wytyczne których masz się trzymać. Początkową lekturą może być Lartc (PL).

Skrypt

Jeżeli ktoś jest obeznany z iptables może podobny skrypt napisać samodzielnie. Poniższy jest chyba najprostszy z możliwych. Wychodzimy z założenia, że dopuszczamy cały ruch wychodzący (przechodzący) a wszystko na wejściu jest odrzucane (przez polityki domyślne).


    #!/bin/sh /etc/rc.common
    
    WAN=$(uci get network.wan.ifname)
    IPT=/usr/sbin/iptables
    START=44
    
    start() {
        $IPT -F
        $IPT -F -t nat
        $IPT -F -t mangle
        $IPT -P OUTPUT ACCEPT
        $IPT -P FORWARD ACCEPT
        $IPT -P INPUT DROP
        $IPT -A INPUT -i ! ${WAN} -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
        $IPT -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
    }

    stop() {
        $IPT -P INPUT  ACCEPT
        $IPT -P OUTPUT ACCEPT
        $IPT -P FORWARD ACCEPT
        $IPT -F
        $IPT -F -t nat
        $IPT -F -t mangle
    }

Plik trzeba zapisać w katalogu /etc/init.d pod nazwą firewall_custom.

Konfiguracja

Należy "wyłączyć" plik /etc/hotplug.d/iface/20-firewall który w tym przypadku nie spełnia swojej roli. Należy dodać jako pierwszą linię polecenie wyjścia, żeby wyglądało to w taki sposób


    exit 0
    . /lib/firewall/uci_firewall.sh
    unset ZONE
    ...

Następnie należy wyłączyć wbudowany firewall, włączyć nasz nowy i zrobić restart rutera


    /etc/init.d/firewall disable
    chmod 755 /etc/init.d/firewall_custom
    /etc/init.d/firewall_custom enable
    reboot

Modyfikacje

Oczywiście skrypt można dowolnie zmodyfikować - od zmian w stosie tcpip, poprzez ustawienie priorytetów czy znaczników QoS a na logowaniu skończywszy. Oto jedne z przydanych poleceń, najczęściej oczekiwanych (do dopisania na końcu w sekcji start

Otworzenie portu

Np. portu 22 - ssh


    $IPT -A INPUT -i ${WAN} -p tcp --dport 22  -j ACCEPT

Przekierowanie portu

Np. dla torrentów - port 12345 będzie przekierowany do komputera 192.168.1.100


    $IPT -t nat -A PREROUTING -i ${WAN} -p tcp --dport 12345 -j DNAT --to-destination 192.168.1.100:12345    

Oczywiście w OpenWrt mamy szereg rozszerzeń iptables, wiec będą działały opcje multiport/mac/limit itd. Można tu już robić dowolnie stosownie to potrzeb.

Zakończenie

Tak zbudowany firewall robi dokładnie to samo co standardowy, ale wszystko jest w jednym pliku, więc można się posiłkować gotowymi skryptami znalezionymi w internecie. Wadą tego firewalla jest to, że nie może być konfigurowany przez www/LuCI. Ten firewall to tylko zbiór reguł iptables - więc można odpowiedni firewall wygenerować sobie wieloma programami dostępnymi na linuksa.
Czy taka modyfikacja ma sens? Im mniej regułek tym szybsze przesyłanie pakietów. Jeżeli oczekujemy bardziej skompilowanych rzeczy od firewalla to i tak musimy zakładać osoby plik, bo ten od LuCI składniowo nie wspiera żadnych innych zapisów. Więc wszystko zależy od konkretnego przeznaczenia.