[OpenBSD]

[Wstecz: Wydajność] [Spis treści] [Dalej: Authpf: powłoka dla bramek uwierzytelniających]

PF: Problemy z FTP


Spis treści


Tryby pracy FTP

Powstanie protokołu FTP miało miejsce gdy Internet był jeszcze małą, przyjazną siecią i każdy wiedział wszystko o wszystkich, a więc wtedy gdy filtrowanie pakietów i nadzwyczajne środki ostrożności nie były jeszcze potrzebne. Protokół ten nie jest więc zaprojektowany tak aby umożliwić jego łatwe filtrowanie lub przekazywanie jego datagramów poprzez ściany ogniowe, a także do współpracy z translacją adresów.

Z FTP można korzystać na dwa sposoby: pasywnie lub aktywnie. Wybór trybu aktywnego lub pasywnego zależy w głównej mierze od określenia kto ma problemy z filtrowaniem pakietów. Najlepszym rozwiązaniem byłoby umożliwić korzystanie z obu metod.

Kiedy użytkownik łączy się z serwerem przy pomocy aktywnego FTP i wysyła żądanie otrzymania informacji lub pliku, serwer FTP tworzy nowe połączenie z powrotem do klienta i przesyła dane. nazywa się to połączeniem przesyłania danych (ang. data connection). Aby zacząć, klient FTP wybiera losowy port, przesyła jego numer do serwera FTP i wtedy zaczyna nasłuchiwać na tym porcie wybrał. Serwer FTP inicjuje wówczas połączenie na adres i otrzymany port klienta, po czym rozpoczyna transmisję danych. Stanowi to problem dla użytkowników starających się uzyskać dostęp do serwerów FTP z za bramek realizujących NAT. Ponieważ NAT działa, jak działa, serwer FTP inicjuje połączenie przesyłania danych poprzez łączenie się na zewnętrzny adres bramki oraz wybrany port. Maszyna realizująca NAT otrzyma połączenie, lecz ponieważ nie wie, jak zmapować pakiet w swojej tabeli stanów, porzuci pakiet i nie dostarczy go do klienta.

W trybie pasywnym (jest to domyślne zachowanie programu ftp(1)), dostarczonego wraz z OpenBSD), klient żąda aby to serwer określił losowy port na którym będzie oczekiwał na połączenie dla przesłania danych. Serwer informuje klienta, który port został wybrany, a klient łączy się z tym portem i następuje transfer danych. Niestety, z powodu możliwości istnienia zapory ogniowej przed serwerem FTP, która będzie blokować nadchodzące połączenia przesyłania danych. W OpenBSD ftp(1) używa tego trybu domyślnie, wymuszenie trybu aktywnego można uzyskać na dwa sposoby: opcja -A podczas wywołania ftp, lub wyłączenie trybu pasywnego komendą "passive off" w linii poleceń programu "ftp>".

Klient FTP za firewallem

Jak to zostało opisane wcześniej, protokół FTP ma problemy z współpracą z NAT i firewallami.

Packet Filter dostarcza rozwiązanie tego problemu, którym jest przekierowanie ruchu FTP na serwer proxy FTP. proces ten "przeprowadzi" połączenia FTP poprzez bramkę/firewall z NAT. Serwerem proxy FTP wykorzystywanym przez OpenBSD i PF ftp-proxy(8). Aby go aktywować, w umieść coś takiego w sekcji translacji pliku pf.conf:

rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
   port 8021

Działanie tej linii można streścić następująco: "Ruch na wewnętrznym interfejsie sieciowym jest przekierowany do serwera pośredniczącego, uruchomionego na tej maszynie i nasłuchującego na porcie 8021".

Oczywiście powyższe przekierowanie zakłada, że serwer proxy jest uruchomiony na tym komputerze. Należy sprawdzić, czy w pliku /etc/inetd.conf, jest następująca linia:

127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy \
   ftp-proxy

a następnie albo uruchomić ponownie system albo wysłać sygnał 'HUP' do demona inetd(8). Sygnał ten można wysłać do demona inetd w następujący sposób:

kill -HUP `cat /var/run/inetd.pid`

Można zauważyć, że ftp-proxy nasłuchuje na porcie 8021, dokładnie tym samym, na który podana dyrektywa rdr przekierowuje ruch FTP. Wybór numeru portu jest zupełnie dowolny, jednak port 8021 jest dobrym wyborem, jako że nie jest on używany przez żadną inną aplikację.

Proszę zauważyć, że ftp-proxy(8) jest pomocą dla klientów FTP znajdujących się za ścianą ogniową, nie służy natomiast do uruchomienia serwera FTP za firewallem.

"Samozabezpieczenie" PF serwera FTP

W tym przypadku, filtr PF jest uruchomiony na tym samym komputerze co serwer FTP, a nie na osobnej maszynie. Kiedy serwer obsługuje pasywne sesje FTP, otwiera wysoki port TCP dla danych. Domyślnie, natywny serwer OpenBSD ftpd(8) używa w tym celu portów z zakresu od 49152 do 65535. Oczywiście ruch na tych portach musi być przepuszczany wraz z portem 21 (który jest portem kontrolnym FTP):
pass in on $ext_if proto tcp from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
   keep state

Proszę zauważyć, że jeśli zaistnieje potrzeba ograniczenia zakresu wysokich portów, których będzie używał natywny serwer ftpd(8) OpenBSD, można to osiągnąć poprzez zmianę wartości zmiennych sysctl(8) net.inet.ip.porthifirst i net.inet.ip.porthilast.

Zabezpieczanie serwera FTP poprzez dedykowany firewall z NAT

Ta sytuacja zmusza, ścianę ogniową do przekierowania ruchu FTP do serwera FTP, dodatkowo nie blokując wymaganych, nowo otwartych portów. W tym przykładzie założono, że serwerem FTP będzie znów natywne rozwiązanie OpenBSD czyli ftpd(8), korzystający z domyślnego zakresu portów.

Oto przykład reguł dzięki którym powyższy cel może zostać osiągnięty:

ftp_server = "10.0.3.21"

rdr on $ext_if proto tcp from any to any port 21 -> $ftp_server \
   port 21
rdr on $ext_if proto tcp from any to any port 49152:65535 -> \
   $ftp_server port 49152:65535
# in on $ext_if
pass in quick on $ext_if proto tcp from any to $ftp_server \
   port 21 keep state
pass in quick on $ext_if proto tcp from any to $ftp_server \
   port > 49151 keep state

# out on $int_if
pass out quick on $int_if proto tcp from any to $ftp_server \
   port 21 keep state
pass out quick on $int_if proto tcp from any to $ftp_server \
   port > 49151 keep state

Więcej informacji o FTP

Więcej informacji o filtrowaniu protokołu FTP oraz o tym, jak ogólnie działa FTP znajdziesz w tym opracowaniu:

[Wstecz: Wydajność] [Spis treści] [Dalej: Authpf: powłoka dla bramek uwierzytelniających]


[wstecz] www@openbsd.org
Originally [OpenBSD: ftp.html,v 1.12 ]
$Translation: ftp.html,v 1.6 2004/01/12 17:37:45 pl-team Exp $
$OpenBSD: ftp.html,v 1.6 2004/01/16 21:01:34 jufi Exp $