               Firewall na polaczeniu modemowym w FreeBSD

  Marc Silver

   <marcs@draenor.org>

   $FreeBSD:
   head/pl_PL.ISO8859-2/articles/dialup-firewall/article.sgml 38826
   2012-05-17 19:12:14Z hrs $

   W niniejszym artykule przedstawiono instrukcje konfiguracji
   firewalla przy dynamicznie przydzielanym adresie IP, a takze
   przepis na uruchomienie takiego firewalla w FreeBSD, korzystajac z
   IPFW. Artykul nie zawiera instrukcji konfigurowania polaczenia
   PPP.

     --------------------------------------------------------------

1. Wstep

   Firewall na polaczeniu modemowym w FreeBSD

   Niniejszy artykul opisuje konfiguracje firewalla w FreeBSD w
   przypadku, gdy adres IP przydzielany jest dynamicznie przez
   dostawce uslug internetowych. Dolozono wszelkich staran, aby
   artykul zawieral przydatne informacje i byl wolny od bledow,
   jednakze wszelkie uwagi i sugestie sa mile widziane, prosze
   kierowac je do <marcs@draenor.org>.

     --------------------------------------------------------------

2. Opcje jadra

   Na poczatek bedziemy musieli przekompilowac jadro. Wiecej
   informacji na temat kompilowania jadra znalezc mozna w czesci
   Podrecznika poswieconej konfiguracji jadra. Do pliku
   konfiguracyjnego jadra dopisujemy nastepujace opcje:

   options IPFIREWALL

           Wlaczenie obslugi firewalla w jadrze.

   options IPFIREWALL_VERBOSE

           Wysylanie informacji o pakietach do logow systemowych.

   options IPFIREWALL_VERBOSE_LIMIT=100

           Ograniczenie liczby pakietow zapisywanych w logach; dzieki
           temu plik loga nie zostanie zapchany wieloma
           powtarzajacymi sie wpisami. Wartosc 100 jest sensowna,
           mozna jednak wstawic inna, odpowiednia dla wlasnych
           potrzeb.

   options IPDIVERT

           Wlaczenie gniazd divert.

   Mozna dopisac jeszcze kilka wierszy opcjonalnych, ktore zwiekszaja
   poziom bezpieczenstwa. Firewall pracuje poprawnie rowniez bez
   nich, jednakze bardziej ostrozni uzytkownicy moga zechciec z nich
   skorzystac.

   options TCP_DROP_SYNFIN

           Ignorowanie pakietow TCP z ustawionymi flagami SYN i FIN.
           Zapobiega to mozliwosci identyfikacji stosu TCP/IP przy
           pomocy narzedzi takich jak nmap, jest to jednak wbrew
           ustaleniom dokumentu RFC1644. Nie powinno byc stosowane,
           jesli na maszynie ma dzialac serwer WWW.

   Po kompilacji jadra nie trzeba od razu przeladowywac systemu.
   Jesli wszystko pojdzie zgodnie z planem, wystarczy jedno
   przeladowanie po ukonczeniu konfiguracji firewalla.

     --------------------------------------------------------------

3. Uruchamianie firewalla w /etc/rc.conf

   Trzeba teraz wprowadzic pewne zmiany w /etc/rc.conf, by
   uwzglednial on firewalla. Dodajemy nastepujace linijki:

 firewall_enable="YES"
 firewall_script="/etc/firewall/fwrules"
 natd_enable="YES"
 natd_interface="tun0"
 natd_flags="-dynamic"

   Informacje na temat dzialania powyzszych polecen mozna znalezc w
   /etc/defaults/rc.conf oraz rc.conf(5).

     --------------------------------------------------------------

4. Wylaczenie tlumaczenia adresow przez PPP

   Jezeli wykorzystywane jest tlumaczenie adresow sieciowych
   wbudowane w PPP, trzeba bedzie je wylaczyc. W naszych przykladach
   tlumaczeniem zajmuje sie natd(8).

   Fragment pliku odpowiedzialny za automatyczne uruchomienie PPP
   wyglada zapewne tak:

 ppp_enable="YES"
 ppp_mode="auto"
 ppp_nat="YES"
 ppp_profile="profile"

   Jesli tak wlasnie jest, trzeba bedzie wylaczyc ppp_nat wpisujac
   ppp_nat="NO" w /etc/rc.conf. Ponadto nalezy usunac wpisy nat
   enable yes lub alias enable yes w /etc/ppp/ppp.conf.

     --------------------------------------------------------------

5. Reguly firewalla

   Wiekszosc pracy mamy juz za soba. Pozostalo juz tylko ustalenie
   regul firewalla, po czym bedzie mozna dokonac przeladowania
   systemu i powinnismy otrzymac dzialajacego firewalla. Zdaje sobie
   sprawe, ze zbior regul zalezy od indywidualnych potrzeb, staralem
   sie jednak przygotowac reguly odpowiednie dla wiekszosci
   uzytkownikow lacz komutowanych. Mozna je oczywiscie dostosowac
   samodzielnie, traktujac ponizsze reguly jako punkt wyjscia.
   Zacznijmy od zamknietego firewalla: z zalozenia wszystkie pakiety
   sa blokowane, przepuszczac bedziemy jedynie to, co jest nam
   rzeczywiscie potrzebne. Reguly powinny najpierw okreslac, co jest
   przepuszczane, potem co jest blokowane. Podajemy wiec wszystkie
   reguly przepuszczajace, a potem nakazujemy blokowac cala reszte.
   :)

   Stworzmy teraz katalog /etc/firewall. W nim utworzmy plik fwrules,
   zgodnie z tym, co napisalismy w rc.conf. Mozemy oczywiscie nazwac
   ten plik jak nam sie zywnie podoba, proponowana tu nazwa jest
   jedna z mozliwosci.

   Spojrzmy teraz na przykladowy plik firewalla, opatrzony
   komentarzami.

 # Reguly firewalla
 # Autor: Marc Silver (marcs@draenor.org)
 # http://draenor.org/ipfw
 #

 # Definicja komendy firewalla (jak w /etc/rc.firewall) upraszcza
 # jej wywolywanie i czyni plik bardziej czytelnym.
 fwcmd="/sbin/ipfw"

 # Wyczyszczenie aktualnie obowiazujacych regul.
 $fwcmd -f flush

 # Przekierowanie wszystkich pakietow przez interfejs tun0.
 $fwcmd add divert natd all from any to any via tun0

 # Przepuszczanie danych przesylanych przez karte sieciowa i lokalnie.
 # Upewnij sie, ze wpisales tu wlasciwa karte (w moim przypadku fxp0)
 # zanim przeladujesz system. :)
 $fwcmd add allow ip from any to any via lo0
 $fwcmd add allow ip from any to any via fxp0

 # Przepuszczanie wszystkich polaczen nawiazywanych przez nas.
 $fwcmd add allow tcp from any to any out xmit tun0 setup

 # Pozwalamy, by polaczenia nawiazane mogly pozostac otwarte.
 $fwcmd add allow tcp from any to any via tun0 established

 # Zezwolenie na polaczenia z zewnatrz z okreslonymi uslugami na
 # naszej maszynie. Przykladowo dopuszczamy polaczenia z ssh i apache.
 $fwcmd add allow tcp from any to any 80 setup
 $fwcmd add allow tcp from any to any 22 setup

 # Wysylamy RESET w odpowiedzi na pakiety ident.
 $fwcmd add reset log tcp from any to any 113 in recv tun0

 # Pozwalamy na wychodzace zapytania DNS do wybranych serwerow.
 $fwcmd add allow udp from any to x.x.x.x 53 out xmit tun0

 # I oczywiscie pozwalamy im odpowiedziec... :)
 $fwcmd add allow udp from x.x.x.x 53 to any in recv tun0

 # Dopuszczenie pakietow ICMP (dzieki ktorym dzialaja ping i traceroute).
 # Mozna zdecydowac sie na ich blokowanie, ja jednak mysle, ze mi sie
 # przydadza.
 $fwcmd add allow icmp from any to any

 # Odrzucenie calej reszty.
 $fwcmd add deny log ip from any to any

   Zbudowalismy w pelni sprawny firewall zezwalajacy na polaczenia z
   portami 80 i 22, oraz rejestrujacy proby polaczenia z czymkolwiek
   innym. Po przeladowaniu systemu powinien juz nalezycie
   funkcjonowac. Jezeli jakiekolwiek z podanych tu informacji okaza
   sie bledne, badz beda powodowac problemy, prosze o zawiadomienie
   emailem. Mile widziane sa rowniez pomysly na ulepszenie niniejszej
   strony.

     --------------------------------------------------------------

6. Pytania

   6.1. Dlaczego korzystasz z natd(8) i ipfw(8), a nie z filtrow
   wbudowanych w ppp(8)?

   6.2. Otrzymuje komunikat w rodzaju "limit 100 reached on entry
   2800", po ktorym w logach nie pojawiaja sie informacje o
   zablokowanych pakietach. Czy moj firewall nadal dziala?

   6.3. W sieci wewnetrznej korzystam z adresow z puli prywatnej, np.
   z zakresu 192.168.0.0, czy moge uzupelnic reguly firewalla wpisem
   w rodzaju $fwcmd add deny all from any to 192.168.0.0:255.255.0.0
   via tun0 aby uniemozliwic proby polaczen z zewnatrz z lokalnymi
   maszynami?

   6.4. Cos musi byc nie tak. Postepowalem dokladnie wedlug wskazowek
   i jestem w kropce.

   6.1. Dlaczego korzystasz z natd(8) i ipfw(8), a nie z filtrow
   wbudowanych w ppp(8)?

   Mowiac szczerze, nie ma konkretnego powodu dla ktorego
   zdecydowalem sie na ipfw i natd, a nie filtrowanie wbudowane w
   ppp. Dyskusje przeprowadzone z roznymi osobami doprowadzily do
   stwierdzenia, iz ipfw jest z pewnoscia bardziej rozbudowany i ma
   wieksze mozliwosci konfiguracji niz filtry ppp, jest jednak
   trudniejszy w uzywaniu. Jednym z powodow mojego wyboru jest to, ze
   wole, by firewall dzialal na poziomie jadra systemu, a nie
   programu uzytkownika.

   6.2. Otrzymuje komunikat w rodzaju "limit 100 reached on entry
   2800", po ktorym w logach nie pojawiaja sie informacje o
   zablokowanych pakietach. Czy moj firewall nadal dziala?

   Taki komunikat oznacza jedynie, ze osiagniety zostal limit
   rejestrowania reguly. Sama regula wciaz obowiazuje, nie bedzie juz
   jednak rejestrowana, dopoki liczniki rejestrowania nie zostana
   wyzerowane; mozna to zrobic poleceniem ipfw resetlog. Innym
   rozwiazaniem jest zwiekszenie limitu w konfiguracji jadra przy
   pomocy opcji IPFIREWALL_VERBOSE_LIMIT, tak jak jest to opisane
   wczesniej. Limit mozna takze ustawic zmieniajac wartosc
   net.inet.ip.fw.verbose_limit przy pomocy sysctl(8).

   6.3. W sieci wewnetrznej korzystam z adresow z puli prywatnej, np.
   z zakresu 192.168.0.0, czy moge uzupelnic reguly firewalla wpisem
   w rodzaju $fwcmd add deny all from any to 192.168.0.0:255.255.0.0
   via tun0 aby uniemozliwic proby polaczen z zewnatrz z lokalnymi
   maszynami?

   Nie, poniewaz wszystko co przechodzi przez tun0 podlega
   tlumaczeniu adresow realizowanemu przez natd. Pakiety przychodzace
   z zewnatrz trafiaja wylacznie do dynamicznie przydzielonego adresu
   IP, a nie do sieci wewnetrznej. Zauwazmy jednak, ze mozna dodac
   regule w rodzaju $fwcmd add deny all from 192.168.0.4:255.255.0.0
   to any via tun0, ktora zabroni maszynie w sieci wewnetrznej
   komunikowania sie ze swiatem przez firewall.

   6.4. Cos musi byc nie tak. Postepowalem dokladnie wedlug wskazowek
   i jestem w kropce.

   W artykule przyjmujemy, ze korzystamy z userland-ppp, reguly
   obowiazuja wiec dla interfejsu tun0, odpowiadajacemu pierwszemu
   polaczeniu nawiazanemu przez ppp(8) (zwanemu takze user-ppp).
   Dodatkowym polaczeniom odpowiadac beda interfejsy tun1, tun2 itd.

   W przypadku pppd(8) jest z kolei wykorzystywany interfejs ppp0,
   jesli wiec polaczenie jest realizowane za posrednictwem pppd(8), w
   miejscu tun0 trzeba wstawic ppp0. Ponizej przedstawiona jest
   szybka metoda uwzglednienia tej zmiany w regulach firewalla.
   Oryginalny plik z regulami zachowywany jest pod nazwa
   fwrules_tun0.

             % cd /etc/firewall
             /etc/firewall% su
             Password:
             /etc/firewall# mv fwrules fwrules_tun0
             /etc/firewall# cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules
          

   By przekonac sie, czy w uzyciu jest ppp(8), czy pppd(8), mozna po
   nawiazaniu polaczenia posluzyc sie ifconfig(8). W przypadku
   polaczenia nawiazanego przez pppd(8) zobaczylibysmy cos w rodzaju
   (pomijajac nieistotne informacje):

             % ifconfig
             (nieistotne...)
             ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     inet xxx.xxx.xxx.xxx -************-> xxx.xxx.xxx.xxx netmask 0xff000000
             (nieistotne...)
            

   Natomiast gdy nawiazanie polaczenia odbylo sie za posrednictwem
   ppp(8) (user-ppp), ujrzymy cos takiego:

             % ifconfig
             (nieistotne...)
             ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
             (nieistotne...)
             tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     (nieistotne IPv6...)
                     inet xxx.xxx.xxx.xxx -************-> xxx.xxx.xxx.xxx netmask 0xffffff00
                     Opened by PID xxxxx
             (nieistotne...)

     --------------------------------------------------------------

                  Ten i inne dokumenty mozna pobrac z
                ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

  W przypadku pytan o FreeBSD prosimy przeczytac dostepna dokumentacje
               przed kontaktem z <questions@FreeBSD.org>.
        W sprawie zapytan o te dokumentacje prosimy o kontakt z
                           <doc@FreeBSD.org>.
