397 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			397 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
<!--
 | 
						|
     The FreeBSD Polish Documentation Project
 | 
						|
 | 
						|
     $FreeBSD$
 | 
						|
     Original revision: 1.25
 | 
						|
-->
 | 
						|
 | 
						|
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
 | 
						|
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
 | 
						|
%man;
 | 
						|
]>
 | 
						|
 | 
						|
<article lang="pl">
 | 
						|
  <articleinfo>
 | 
						|
    <title>Firewall na połączeniu modemowym w FreeBSD</title>
 | 
						|
 | 
						|
    <authorgroup>
 | 
						|
      <author>
 | 
						|
	<firstname>Marc</firstname>
 | 
						|
	<surname>Silver</surname>
 | 
						|
	<affiliation>
 | 
						|
	  <address><email>marcs@draenor.org</email></address>
 | 
						|
	</affiliation>
 | 
						|
      </author>
 | 
						|
    </authorgroup>
 | 
						|
 | 
						|
    <releaseinfo>$FreeBSD$</releaseinfo>
 | 
						|
 | 
						|
    <abstract>
 | 
						|
      <para>W niniejszym artykule przedstawiono instrukcję konfiguracji
 | 
						|
        firewalla przy dynamicznie przydzielanym adresie IP, a także
 | 
						|
	przepis na uruchomienie takiego firewalla w FreeBSD, korzystając
 | 
						|
	z IPFW.
 | 
						|
	Artykuł nie zawiera instrukcji konfigurowania połączenia
 | 
						|
	PPP.</para>
 | 
						|
    </abstract>
 | 
						|
  </articleinfo>
 | 
						|
 | 
						|
  <sect1 id="preface">
 | 
						|
    <title>Wstęp</title>
 | 
						|
 | 
						|
    <para>Firewall na połączeniu modemowym w FreeBSD</para>
 | 
						|
 | 
						|
     <para>Niniejszy artykuł opisuje konfigurację firewalla w FreeBSD
 | 
						|
       w przypadku, gdy adres IP przydzielany jest dynamicznie przez
 | 
						|
       dostawcę usług internetowych. Dołożono wszelkich starań, aby
 | 
						|
       artykuł zawierał przydatne informacje i był wolny od błędów,
 | 
						|
       jednakże wszelkie uwagi i sugestie są mile widziane, proszę
 | 
						|
       kierować je do <email>marcs@draenor.org</email>.</para>
 | 
						|
   </sect1>
 | 
						|
 | 
						|
   <sect1 id="kernel">
 | 
						|
    <title>Opcję jądra</title>
 | 
						|
 | 
						|
    <para>Na początek będziemy musieli przekompilować jądro. Wiecej
 | 
						|
      informacji na temat kompilowania jądra znaleźć można w <ulink
 | 
						|
      URL="../../books/handbook/kernelconfig.html">części Podręcznika
 | 
						|
      poświęconej konfiguracji jądra</ulink>. Do pliku konfiguracyjnego
 | 
						|
      jądra dopisujemy następujące opcje:</para>
 | 
						|
 | 
						|
    <variablelist>
 | 
						|
      <varlistentry>
 | 
						|
	<term><literal>options IPFIREWALL</literal></term>
 | 
						|
 | 
						|
	<listitem>
 | 
						|
	  <para>Właczenie obsługi firewalla w jądrze.</para>
 | 
						|
	</listitem>
 | 
						|
      </varlistentry>
 | 
						|
 | 
						|
      <varlistentry>
 | 
						|
	<term><literal>options IPFIREWALL_VERBOSE</literal></term>
 | 
						|
 | 
						|
	<listitem>
 | 
						|
	  <para>Wysyłanie informacji o pakietach do logów systemowych.</para>
 | 
						|
	</listitem>
 | 
						|
      </varlistentry>
 | 
						|
 | 
						|
      <varlistentry>
 | 
						|
	<term><literal>options
 | 
						|
	    IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>
 | 
						|
 | 
						|
	<listitem>
 | 
						|
	  <para>Ograniczenie liczby pakietów zapisywanych w logach;
 | 
						|
	    dzięki temu plik loga nie zostanie zapchany wieloma
 | 
						|
	    powtarzającymi się wpisami. Wartość
 | 
						|
	    <replaceable>100</replaceable> jest sensowna, można jednak
 | 
						|
	    wstawić inną, odpowiednią dla własnych potrzeb.</para>
 | 
						|
	</listitem>
 | 
						|
      </varlistentry>
 | 
						|
 | 
						|
      <varlistentry>
 | 
						|
	<term><literal>options IPDIVERT</literal></term>
 | 
						|
 | 
						|
	<listitem>
 | 
						|
	  <para>Włączenie gniazd divert.</para>
 | 
						|
	</listitem>
 | 
						|
      </varlistentry>
 | 
						|
    </variablelist>
 | 
						|
 | 
						|
    <para>Można dopisać jeszcze kilka wierszy
 | 
						|
      <emphasis>opcjonalnych</emphasis>, które zwiększają poziom
 | 
						|
      bezpieczeństwa. Firewall pracuje poprawnie również bez nich,
 | 
						|
      jednakże bardziej ostrożni użytkownicy mogą zechcieć z nich
 | 
						|
      skorzystać.</para>
 | 
						|
 | 
						|
    <variablelist>
 | 
						|
      <varlistentry>
 | 
						|
	<term><literal>options TCP_DROP_SYNFIN</literal></term>
 | 
						|
 | 
						|
	<listitem>
 | 
						|
	  <para>Ignorowanie pakietów TCP z ustawionymi flagami
 | 
						|
	    SYN i FIN. Zapobiega to możliwości identyfikacji stosu TCP/IP
 | 
						|
	    przy pomocy narzędzi takich jak nmap, jest to jednak wbrew
 | 
						|
	    ustaleniom dokumentu RFC1644. Nie powinno być stosowane,
 | 
						|
	    jeśli na maszynie ma działać serwer WWW.</para>
 | 
						|
	</listitem>
 | 
						|
      </varlistentry>
 | 
						|
     </variablelist>
 | 
						|
 | 
						|
    <para>Po kompilacji jądra nie trzeba od razu przeładowywać systemu.
 | 
						|
      Jeśli wszystko pójdzie zgodnie z planem, wystarczy jedno
 | 
						|
      przeładowanie po ukończeniu konfiguracji firewalla.</para>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
  <sect1 id="rcconf">
 | 
						|
    <title>Uruchamianie firewalla w
 | 
						|
      <filename>/etc/rc.conf</filename></title>
 | 
						|
 | 
						|
    <para>Trzeba teraz wprowadzić pewne zmiany w
 | 
						|
      <filename>/etc/rc.conf</filename>, by uwzględniał on firewalla.
 | 
						|
      Dodajemy następujące linijki:</para>
 | 
						|
 | 
						|
    <programlisting>firewall_enable="YES"
 | 
						|
firewall_script="/etc/firewall/fwrules"
 | 
						|
natd_enable="YES"
 | 
						|
natd_interface="tun0"
 | 
						|
natd_flags="-dynamic"</programlisting>
 | 
						|
 | 
						|
    <para>Informacje na temat działania powyższych poleceń można
 | 
						|
      znaleźć w <filename>/etc/defaults/rc.conf</filename> oraz
 | 
						|
      &man.rc.conf.5;.</para>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
  <sect1>
 | 
						|
    <title>Wyłączenie tłumaczenia adresów przez PPP</title>
 | 
						|
 | 
						|
    <para>Jeżeli wykorzystywane jest tłumaczenie adresów
 | 
						|
      sieciowych
 | 
						|
      wbudowane w PPP, trzeba będzie je wyłączyć. W naszych przykładach
 | 
						|
      tłumaczeniem zajmuje się &man.natd.8;.</para>
 | 
						|
 | 
						|
    <para>Fragment pliku odpowiedzialny za automatyczne uruchomienie
 | 
						|
      PPP wygląda zapewne tak:</para>
 | 
						|
 | 
						|
    <programlisting>ppp_enable="YES"
 | 
						|
ppp_mode="auto"
 | 
						|
ppp_nat="YES"
 | 
						|
ppp_profile="<replaceable>profile</replaceable>"</programlisting>
 | 
						|
 | 
						|
    <para>Jeśli tak właśnie jest, trzeba będzie wyłączyć
 | 
						|
      <literal>ppp_nat</literal> wpisując
 | 
						|
      <literal>ppp_nat="NO"</literal> w
 | 
						|
      <filename>/etc/rc.conf</filename>. Ponadto należy usunąć
 | 
						|
      wpisy <literal>nat enable yes</literal> lub
 | 
						|
      <literal>alias enable yes</literal> w
 | 
						|
      <filename>/etc/ppp/ppp.conf</filename>.</para>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
  <sect1 id="rules">
 | 
						|
    <title>Reguły firewalla</title>
 | 
						|
 | 
						|
    <para>Większość pracy mamy już za sobą. Pozostało już tylko
 | 
						|
      ustalenie reguł firewalla, po czym będzie można dokonać
 | 
						|
      przeładowania systemu i powinniśmy otrzymać działającego
 | 
						|
      firewalla. Zdaję sobie sprawę, że zbiór reguł zależy od
 | 
						|
      indywidualnych
 | 
						|
      potrzeb, starałem się jednak przygotować reguły odpowiednie
 | 
						|
      dla większości użytkowników łącz komutowanych. Można je
 | 
						|
      oczywiście dostosować samodzielnie, traktując poniższe reguły
 | 
						|
      jako punkt wyjścia. Zacznijmy od zamkniętego firewalla: z
 | 
						|
      założenia wszystkie pakiety są blokowane, przepuszczać
 | 
						|
      będziemy jedynie to, co jest nam rzeczywiście potrzebne.
 | 
						|
      Reguły powinny najpierw określać, co jest przepuszczane, potem
 | 
						|
      co jest blokowane. Podajemy więc wszystkie reguły
 | 
						|
      przepuszczające, a potem nakazujemy blokować całą resztę.
 | 
						|
      :)</para>
 | 
						|
 | 
						|
    <para>Stwórzmy teraz katalog <filename
 | 
						|
      class="directory">/etc/firewall</filename>. W nim utwórzmy plik
 | 
						|
      <filename>fwrules</filename>, zgodnie z tym, co napisaliśmy
 | 
						|
      w <filename>rc.conf</filename>. Możemy oczywiście nazwać ten
 | 
						|
      plik jak nam się żywnie podoba, proponowana tu nazwa jest
 | 
						|
      jedną z możliwości.</para>
 | 
						|
 | 
						|
    <para>Spójrzmy teraz na przykładowy plik firewalla, opatrzony
 | 
						|
      komentarzami.</para>
 | 
						|
 | 
						|
 | 
						|
    <programlisting>
 | 
						|
# Reguły firewalla
 | 
						|
# Autor: Marc Silver (marcs@draenor.org)
 | 
						|
# http://draenor.org/ipfw
 | 
						|
#
 | 
						|
 | 
						|
# Definicja komendy firewalla (jak w /etc/rc.firewall) upraszcza
 | 
						|
# jej wywoływanie i czyni plik bardziej czytelnym.
 | 
						|
fwcmd="/sbin/ipfw"
 | 
						|
 | 
						|
# Wyczyszczenie aktualnie obowiązujących reguł.
 | 
						|
$fwcmd -f flush
 | 
						|
 | 
						|
# Przekierowanie wszystkich pakietów przez interfejs tun0.
 | 
						|
$fwcmd add divert natd all from any to any via tun0
 | 
						|
 | 
						|
# Przepuszczanie danych przesyłanych przez kartę sieciową i lokalnie.
 | 
						|
# Upewnij się, że wpisałeś tu właściwą kartę (w moim przypadku fxp0)
 | 
						|
# zanim przeładujesz system. :)
 | 
						|
$fwcmd add allow ip from any to any via lo0
 | 
						|
$fwcmd add allow ip from any to any via fxp0
 | 
						|
 | 
						|
# Przepuszczanie wszystkich połączeń nawiązywanych przez nas.
 | 
						|
$fwcmd add allow tcp from any to any out xmit tun0 setup
 | 
						|
 | 
						|
# Pozwalamy, by połączenia nawiązane mogły pozostać otwarte.
 | 
						|
$fwcmd add allow tcp from any to any via tun0 established
 | 
						|
 | 
						|
# Zezwolenie na połączenia z zewnątrz z określonymi usługami na
 | 
						|
# naszej maszynie. Przykładowo dopuszczamy połączenia z ssh i apache.
 | 
						|
$fwcmd add allow tcp from any to any 80 setup
 | 
						|
$fwcmd add allow tcp from any to any 22 setup
 | 
						|
 | 
						|
# Wysyłamy RESET w odpowiedzi na pakiety ident.
 | 
						|
$fwcmd add reset log tcp from any to any 113 in recv tun0
 | 
						|
 | 
						|
# Pozwalamy na wychodzące zapytania DNS do wybranych serwerów.
 | 
						|
$fwcmd add allow udp from any to <replaceable>x.x.x.x</replaceable> 53 out xmit tun0
 | 
						|
 | 
						|
# I oczywiście pozwalamy im odpowiedzieć... :)
 | 
						|
$fwcmd add allow udp from <replaceable>x.x.x.x</replaceable> 53 to any in recv tun0
 | 
						|
 | 
						|
# Dopuszczenie pakietów ICMP (dzięki którym działają ping i traceroute).
 | 
						|
# Można zdecydować się na ich blokowanie, ja jednak myślę, że mi się
 | 
						|
# przydadzą.
 | 
						|
$fwcmd add allow icmp from any to any
 | 
						|
 | 
						|
# Odrzucenie całej reszty.
 | 
						|
$fwcmd add deny log ip from any to any
 | 
						|
</programlisting>
 | 
						|
 | 
						|
    <para>Zbudowaliśmy w pełni sprawny firewall zezwalający na połączenia
 | 
						|
      z portami 80 i 22, oraz rejestrujący próby połączenia z czymkolwiek
 | 
						|
      innym. Po przeładowaniu systemu powinien już należycie
 | 
						|
      funkcjonować. Jeżeli jakiekolwiek z podanych tu informacji
 | 
						|
      okażą się błędne, bądź będą powodować problemy, proszę o
 | 
						|
      zawiadomienie emailem. Mile widziane są również pomysły
 | 
						|
      na ulepszenie niniejszej strony.</para>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
  <sect1>
 | 
						|
    <title>Pytania</title>
 | 
						|
 | 
						|
    <qandaset>
 | 
						|
      <qandaentry>
 | 
						|
	<question>
 | 
						|
	  <para>Dlaczego korzystasz z &man.natd.8; i &man.ipfw.8;, a
 | 
						|
	    nie z filtrów wbudowanych w &man.ppp.8;?</para>
 | 
						|
	</question>
 | 
						|
	
 | 
						|
	<answer>
 | 
						|
	  <para>Mówiąc szczerze, nie ma konkretnego powodu dla którego
 | 
						|
	    zdecydowałem się na <command>ipfw</command> i
 | 
						|
	    <command>natd</command>, a nie filtrowanie wbudowane w
 | 
						|
	    <command>ppp</command>. Dyskusje przeprowadzone z
 | 
						|
	    różnymi osobami doprowadziły do stwierdzenia, iż
 | 
						|
	    <command>ipfw</command> jest z pewnością bardziej
 | 
						|
	    rozbudowany i ma większe możliwości konfiguracji niż
 | 
						|
	    filtry <command>ppp</command>, jest jednak trudniejszy
 | 
						|
	    w używaniu. Jednym z powodów mojego wyboru jest
 | 
						|
	    to, że wolę, by firewall działał na poziomie jądra systemu,
 | 
						|
	    a nie programu użytkownika.</para>
 | 
						|
	</answer>
 | 
						|
      </qandaentry>
 | 
						|
 | 
						|
      <qandaentry>
 | 
						|
        <question>
 | 
						|
	  <para>Otrzymuję komunikat w rodzaju <errorname>limit 100
 | 
						|
	    reached on entry 2800</errorname>, po którym w logach
 | 
						|
	    nie pojawiają się informacje o zablokowanych pakietach.
 | 
						|
	    Czy mój firewall nadal działa?</para>
 | 
						|
        </question>
 | 
						|
 | 
						|
	<answer>
 | 
						|
	  <para>Taki komunikat oznacza jedynie, że osiągnięty został
 | 
						|
	    limit rejestrowania reguły. Sama reguła wciąż obowiązuje,
 | 
						|
	    nie będzie już jednak rejestrowana, dopóki liczniki
 | 
						|
	    rejestrowania nie zostaną wyzerowane; można to zrobić
 | 
						|
	    poleceniem <command>ipfw resetlog</command>. Innym
 | 
						|
	    rozwiązaniem jest zwiększenie limitu w konfiguracji
 | 
						|
	    jądra przy pomocy opcji
 | 
						|
	    <option>IPFIREWALL_VERBOSE_LIMIT</option>, tak jak
 | 
						|
	    jest to opisane wcześniej. Limit można także ustawić
 | 
						|
	    zmieniając wartość net.inet.ip.fw.verbose_limit
 | 
						|
	    przy pomocy &man.sysctl.8;.</para>
 | 
						|
        </answer>
 | 
						|
      </qandaentry>
 | 
						|
 | 
						|
      <qandaentry>
 | 
						|
	<question>
 | 
						|
	  <para>W sieci wewnętrznej korzystam z adresów z puli prywatnej,
 | 
						|
	    np. z zakresu 192.168.0.0, czy mogę uzupełnić reguły firewalla
 | 
						|
	    wpisem w rodzaju
 | 
						|
	    <literal>$fwcmd add deny all from any to
 | 
						|
	    192.168.0.0:255.255.0.0 via tun0</literal> aby uniemożliwić
 | 
						|
	    próby połączeń z zewnątrz z lokalnymi maszynami?</para>
 | 
						|
	</question>
 | 
						|
 | 
						|
	<answer>
 | 
						|
	  <para>Nie, ponieważ <emphasis>wszystko</emphasis> co
 | 
						|
	    przechodzi przez <devicename>tun0</devicename> podlega
 | 
						|
	    tłumaczeniu adresów realizowanemu przez
 | 
						|
	    <command>natd</command>.
 | 
						|
	    Pakiety przychodzące z zewnątrz trafiają wyłącznie do
 | 
						|
	    dynamicznie przydzielonego adresu IP, a
 | 
						|
	    <emphasis>nie</emphasis> do sieci wewnętrznej. Zauważmy
 | 
						|
	    jednak, że można dodać regułę w rodzaju <literal>$fwcmd
 | 
						|
	    add deny all from 192.168.0.4:255.255.0.0 to any
 | 
						|
	    via tun0</literal>, która zabroni maszynie w sieci
 | 
						|
	    wewnętrznej komunikowania się ze światem przez
 | 
						|
	    firewall.</para>
 | 
						|
	</answer>
 | 
						|
      </qandaentry>
 | 
						|
 | 
						|
      <qandaentry>
 | 
						|
	<question>
 | 
						|
	  <para>Coś musi być nie tak. Postępowałem dokładnie według
 | 
						|
	    wskazówek i jestem w kropce.</para>
 | 
						|
        </question>
 | 
						|
 | 
						|
	<answer>
 | 
						|
	  <para>W artykule przyjmujemy, że korzystamy z
 | 
						|
	    <emphasis>userland-ppp</emphasis>, reguły obowiązują więc
 | 
						|
	    dla interfejsu <devicename>tun0</devicename>, odpowiadającemu
 | 
						|
	    pierwszemu połączeniu nawiązanemu przez &man.ppp.8;
 | 
						|
	    (zwanemu także <emphasis>user-ppp</emphasis>). Dodatkowym
 | 
						|
	    połączeniom odpowiadać będą interfejsy
 | 
						|
	    <devicename>tun1</devicename>, <devicename>tun2</devicename>
 | 
						|
	    itd. </para>
 | 
						|
 | 
						|
	  <para>W przypadku &man.pppd.8; jest
 | 
						|
	    z kolei wykorzystywany
 | 
						|
	    interfejs <devicename>ppp0</devicename>, jeśli
 | 
						|
	    więc połączenie jest realizowane za pośrednictwem
 | 
						|
	    &man.pppd.8;, w miejscu <devicename>tun0</devicename>
 | 
						|
	    trzeba wstawić <devicename>ppp0</devicename>. Poniżej
 | 
						|
	    przedstawiona jest szybka metoda uwzględnienia tej zmiany
 | 
						|
	    w regułach firewalla. Oryginalny plik z regułami
 | 
						|
	    zachowywany jest pod nazwą
 | 
						|
	    <filename>fwrules_tun0</filename>.</para>
 | 
						|
 | 
						|
	  <screen>	    &prompt.user; <userinput>cd /etc/firewall</userinput>
 | 
						|
	    /etc/firewall&prompt.user; <userinput>su</userinput>
 | 
						|
	    <prompt>Password:</prompt>
 | 
						|
	    /etc/firewall&prompt.root; <userinput>mv fwrules fwrules_tun0</userinput>
 | 
						|
	    /etc/firewall&prompt.root; <userinput>cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules</userinput>
 | 
						|
	  </screen>
 | 
						|
 | 
						|
	  <para>By przekonać się, czy w użyciu jest &man.ppp.8;, czy
 | 
						|
	    &man.pppd.8;, można po nawiązaniu połączenia
 | 
						|
	    posłużyć się &man.ifconfig.8;. W przypadku połączenia
 | 
						|
	    nawiązanego przez &man.pppd.8; zobaczylibyśmy coś
 | 
						|
	    w rodzaju (pomijając nieistotne informacje):</para>
 | 
						|
 | 
						|
	  <screen>	    &prompt.user; <userinput>ifconfig</userinput>
 | 
						|
	    <emphasis>(nieistotne...)</emphasis>
 | 
						|
	    ppp0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
 | 
						|
                    inet <replaceable>xxx.xxx.xxx.xxx</replaceable> -************-> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xff000000</replaceable>
 | 
						|
	    <emphasis>(nieistotne...)</emphasis>
 | 
						|
	    </screen>
 | 
						|
 | 
						|
	  <para>Natomiast gdy nawiązanie połączenia odbyło się za
 | 
						|
	    pośrednictwem &man.ppp.8; (<emphasis>user-ppp</emphasis>),
 | 
						|
	    ujrzymy coś takiego:</para>
 | 
						|
 | 
						|
	  <screen>	    &prompt.user; <userinput>ifconfig</userinput>
 | 
						|
	    <emphasis>(nieistotne...)</emphasis>
 | 
						|
	    ppp0: flags=<replaceable>8010<POINTOPOINT,MULTICAST> mtu 1500</replaceable>
 | 
						|
	    <emphasis>(nieistotne...)</emphasis>
 | 
						|
	    tun0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
 | 
						|
	            <emphasis>(nieistotne IPv6...)</emphasis>
 | 
						|
                    inet <replaceable>xxx.xxx.xxx.xxx</replaceable> -************-> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xffffff00</replaceable>
 | 
						|
                    Opened by PID <replaceable>xxxxx</replaceable>
 | 
						|
            <emphasis>(nieistotne...)</emphasis></screen>
 | 
						|
	</answer>
 | 
						|
      </qandaentry>
 | 
						|
    </qandaset>
 | 
						|
  </sect1>
 | 
						|
</article>
 |