W sieciach intranetowych bardzo często nie mamy możliwości łączenia się z systemami udostępniającymi swoje usługi na niestandardowych portach. Przykładami takich usług może być:

  • radio internetowe
  • repozytorium kodu źródłowego (np. udostępnianie przez CVS)
  • zablokowany dostęp do portów SMTP czy POP3
  • i tak dalej, wymieniać można długo.

Jeżeli jednak mamy możliwość wykonywania połączeń przy użyciu SSH, jesteśmy w stanie otworzyć odpowiedni tunel, który umożliwi nam przekierowanie takiego połączenia poprzez niego i ominięcie zabezpieczeń.

Co jednak, jeżeli wybranej przez nas aplikacji nie można skonfigurować tak, aby używała do pracy tunelu? Jeżeli nie chcemy zmieniać konfiguracji całego systemu, tak aby korzystał z tunelu?

Ja miałem taki problem przy próbie połączenia się ze stacjami radiowymi przy użyciu aplikacji Rhythmbox. Chciałem aby ona łączyła się z każdą stacją radiową, a nie znalazłem możliwości konfiguracji połączania przy użyciu serwera proxy czy też tunelu.

Rozwiązaniem tego problemu jest użycie aplikacji tsocks, umożliwi nam przekierowanie połączeń przez utworzony tunel SSH.

Jak działa biblioteka tsocks?

Najprościej mówiąc, tsocks jest biblioteką, która przechwytuje połączenia z podanej aplikacji i przesyła je dalej wykorzystując serwer proxy typu SOCKS.

Aby biblioteka zadziałała poprawnie, należy ustawić odpowiedni zmienną środowiskową LD_PRELOAD, tak aby wskazywała na bibliotekę libtsocks.so. Spowoduje to jej wczytanie zanim jeszcze zostaną wczytane pozostałem biblioteki związane z aplikacją oraz to właśnie funkcje z niej zostaną użyte podczas łączenia.

export LD_PRELOAD=/lib/libtsocks.so

Oczywiście nie musimy tego robić ręcznie, pomocny będzie odpowiedni skrypt o nazwie tsocks napisany w bashu.

Konfiguracja tsocks

Aby biblioteka tsocks zadziałała poprawnie, należy przygotować odpowiedni plik konfiguracyjny, który będzie zawierał informacje potrzebne do przekierowania połączenia.

Plik konfiguracyjny o nazwie .tsocks.conf powinien znajdować się w katalogu domowym użytkownika. Plik ten w najprostszej formie zawiera tylko definicję serwera SOCKS oraz sieci lokalnych, z którymi należy łączyć się bezpośrednio. Dokładne informacje o formacie tego pliku i wszystkich parametrach można znaleźć na stronie MAN tsocks.conf(5). Przykładowy plik konfiguracyjny:

1
2
3
4
server = 127.0.0.1
server_port = 8075
server_type = 5
local = 192.168.1.0/255.255.255.0

Konfiguracja nakazuje łączyć się z serwerem SOCKS typu 5 (linia 3) nasłuchującym na porcie 8075 (linia 2) naszej lokalnej maszyny (linia 1), czyli połączyć się z tunelem stworzonym przy użyciu polecenia ssh. Połączenie z siecią lokalną 192.168.1.0/24 (linia 4) będę się odbywały bezpośrednio.

Zestawienie tunelu

Proste polecenie demonstrujące zestawienie tunelu przy wykorzystaniu aplikacji ssh:

ssh -D 8075 login@host

Jeżeli nie używamy uwierzytelniania opartego o klucze to jeszcze będziemy musieli podać hasło użytkownika na zdalnej maszynie. Po tej operacji klient SSH będzie nasłuchiwał na połączenia na porcie 8075 naszej lokalnej maszyny. Połączenia te zostaną przesłane przez tunel na maszynę zdalną i tam wysłane do serwerów docelowych. Tym sposobem został uruchomiony serwer proxy SOCKS.

Włączenie biblioteki tsocks

Ostatnim krokiem jest uruchomienie aplikacji, która ma korzystać w przezroczysty sposób z serwera SOCKS. Są dostępne trzy możliwości, przydatne w różnych okolicznościach. Do odpowiedniej konfiguracji systemu zostanie wykorzystany skrypt /usr/bin/tsocks. Dokumentacja do niego jest dostępna na stronie MAN tsocks(1).

Uruchomienie pojedynczej aplikacji

Najprostszą metodą na uruchomienie aplikacji jest użycie konstrukcji:

tsocks nazwa_aplikacji_do_uruchomienia

Spowoduje ustawienie zmiennej środowiskowej LS_PRELOAD i uruchomienie żądanej aplikacji. Aplikacji już powinna automatycznie korzystać z serwera proxy, nie będąc tego świadomą.

Konfiguracja uruchomionej powłoki

W ramach aktualnej powłoki możemy włączyć korzystanie z serwera proxy dla wszystkich aplikacji później uruchamianych. Korzystamy wtedy z polecenia:

$ source tsocks -on

lub też z jego krótkiej formy:

$ . tsocks -on

Spowoduje to odpowiednie ustawienie zmiennej środowiskowej LD_PRELOAD w aktualnej powłoce systemowej.

Wyłączenie serwera proxy następuje po wydaniu komendy:

$ source tsocks -off

lub też:

$ . tsocks -off

Należy zwrócić uwagę na wykorzystanie polecenia source. Jeżeli tego nie zrobimy, powłoka nie zostanie skonfigurowana poprawnie.

Aby sprawdzić czy mamy ustawione przekierowanie połączeń na serwer pośredniczący, używamy instrukcji:

$ tsocks -show
LD_PRELOAD="/usr/lib/libtsocks.so"

W wyniku jej wykonania zostania pokazana zawartość zmiennej środowiskowej LD_PRELOAD. Jeżeli zawiera ona ścieżkę do biblioteki libtsocks.so oznacza to, że mamy skonfigurowane połączenie z serwerem proxy.

Utworzenie nowej powłoki

Ostatnią możliwością jest utworzenie od razu odpowiednio skonfigurowanej nowej powłoki. Można to zrobić wywołując po prostu polecenie tsocks bez żadnych parametrów:

$ tsocks
$ tsocks -show
LD_PRELOAD="/usr/lib/libtsocks.so"

Wszystkie wywoływane aplikacje z tej powłoki będą łączyły się przy użyciu serwera proxy. Powłokę można opuścić wydając polecenie exit.

Źródła