[Wstecz: Wydajność] [Spis treści] [Dalej: Authpf: powłoka dla bramek uwierzytelniających]
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>".
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.
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.
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
[Wstecz: Wydajność] [Spis treści] [Dalej: Authpf: powłoka dla bramek uwierzytelniających]