Archive for Luty, 2010

Użycie serwera proxy przy pomocy polecenia tsocks

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

Tags: , , , ,

Migracja Joomli z wersji 1.0 do wersji 1.5

Opis procesu migracji portalu internetowego z postawionego na Joomli 1.0.14 do wersji 1.5.15.

Kopia bazy danych

Wykonanie kopii bazy danych nie jest konieczne, ponieważ nowa wersja będzie korzystała z czystej bazy danych, ale dobrym zwyczajem jest robienie kopii.

mysqldump www > joomla.sql

Migracja danych

  1. Zainstalować w Joomli 1.0 komponent Migrator.
  2. Utworzyć plik XML przy użyciu komponentu Migrator.
  3. Pobrać wygenerowany plik SQL.
  4. Dokonać konwersji pliku SQL z formatu LATIN2 na UTF-8:
    iconv -f latin2 -t utf8 -o www_20100211_121246_utf8.sql www_20100211_121246.sql

W tym momencie dysponujemy już kopią dynamicznych stron oraz zapisanymi informacjami o użytkownikach. Skopiowany plik SQL będzie potrzebny w celu wczytania informacji do nowej instancji Joomli.

Instalacja Joomli 1.5

  1. Skopiować źródła PHP w odpowiednie miejsce, skonfigurować serwer WWW.
  2. Utworzyć nową bazę danych oraz przydzielić uprawnienia do bazy danych użytkownikowi.
    CREATE  DATABASE joomla DEFAULT CHARACTER SET utf8;
    GRANT ALL PRIVILEGES ON `joomla` . * TO 'joomla_user'@'localhost';
  3. Rozpocząć instalację Joomli. W momencie tworzenia serwisu należy wczytać przygotowany wcześniej plik SQL, podaniu prefiksu do tabel (domyślnie było jos_) oraz zaznaczeniu pola informującego, że przeprowadzany jest import danych z wersji 1.0.
  4. Koniec, jeżeli nie wystąpiły błędy to migracja zakończona sukcesem.

Potencjalne problemy

Błąd SQL spowodowany brakiem niektórych tabel.

Błąd taki wystąpił w sytuacji, gdy nie został podany prefiks jos_ dla tabel przy imporcie danych.

Przydatne linki

Tags: , ,

Konfiguracja dostępu do maszyny wirtualnej przy użyciu polecenia virsh lub xm

Problem: chcemy zalogować się na maszynę wirtualną ale nie możemy użyć aplikacji virt-viewer bądź np. ssh.

Najlepszym rozwiązaniem wtedy powinno być użycie polecenia:

# virsh console maszyna

Tutaj często pojawia się jednak problem, nie jesteśmy w stanie tego zrobić. Rozwiązanie tego problemu wymaga wprowadzenia pewnych modyfikacji po stronie systemu gościa i konfiguracji konsoli podłączonej portu szeregowego.

Krok 1: Dodanie wpisu w pliku /etc/inittab.

Dla systemu Debian:

co:2345:respawn:/sbin/getty -L ttyS0 115200 vt100

Dla systemu RedHat:

co:2345:respawn:/sbin/agetty ttyS0 115200  vt100

Krok 2: Włączenie logowania przy użyciu konsoli szeregowej.

Należy do pliku /etc/securetty dodać nazwę konsoli na którą chcemy się zalogować (jeżeli już nie jest ona tam wymieniona)

ttyS0

Krok 3: Włączenie dostępu do menu startu GRUB 1.

Można jeszcze włączyć możliwość podglądu startu systemu już od momentu uruchomienia Gruba. Aby to zrobić, należy wprowadzić następujące modyfikacje do pliku /boot/grub/menu.lst lub /boot/grub/grub.conf (najczęściej istnieje jeden z plików, a drugi jest linkiem do pierwszego)

1
2
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

Wpis ten powinien znaleźć się powyżej pierwszej dyrektywy title.

Należy także dodać następujący ciąg znaków console=ttyS0,115200 do linii ze ścieżką do jądra systemu. W przypadku RedHata linia taka wyglądałaby podobnie do tej:

1
2
3
4
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/sda2 rhgb quiet console=ttyS0,115200
initrd /initrd-2.6.18-164.el5.img

Dla Debiana natomiast warto dodać podane instrukcje w linii zaczynającej się tak:

1
# kopt=root=/dev/mapper/eris-root ro

Po modyfikacji linia ta będzie miała taką postać (zwracam uwagę na znak komentarza, jest i powinien zostać):

1
# kopt=root=/dev/mapper/eris-root ro console=ttyS0,115200

Teraz pozostaje tylko uruchomić polecenie update-grub:

1
2
3
4
5
6
7
# update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /vmlinuz-2.6.26-2-amd64
Updating /boot/grub/menu.lst ... done

Powoduje ona aktualizacje wpisów w pliku konfiguracyjnym tak, że będą one wyglądały tak jak poniżej. Także po instalacji nowego jadra systemu odpowiednie wpisy zostaną dodane do konfiguracji jądra.

1
2
3
4
title           Debian GNU/Linux, kernel 2.6.26-2-amd64
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-amd64 root=/dev/mapper/scope-root ro quiet console=ttyS0,115200
initrd          /initrd.img-2.6.26-2-amd64

Krok 4. Restart maszyny wirtualnej.

Teraz pozostaje tylko zatrzymać maszynę wirtualną i ponownie ją uruchomić.

# virsh shutdown maszyna

A teraz pozostaje nam wystartować maszynę za pomocą polecenia (jeżeli dysponujemy odpowiednio nową wersją komendy virsh, opcja --console jest dostępna przynajmniej od wersji 0.7.0)

# virsh start maszyna --console

W przypadku starszych wersji polecenia virsh należy użyć sekwencji poleceń:

# virsh start maszyna

# virsh console maszyna

Po tych krokach powinniśmy połączyć się z maszyną wirtualną i możemy obserwować zarówno menu GRUB jak i proces startu maszyny wirtualnej.

Także jeżeli używamy do zarządzania maszynami wirtualnymi polecenia xm, wszystko powinno działać. Należy jedynie zmienić polecenia służące do startu i zatrzymywania maszyn wirtualnych.

Tags: , , , , ,

Optymalizacja parametrów JVM dla JBoss AS

W celu przyspieszenia zarówno startu jak i działania serwera aplikacji JBoss można trochę zmodyfikować działanie JVM dodając parametry włączające dodatkowe optymalizacje.

Dwa podstawowe parametry to oczywiście zarządzanie pamięcią:

  • -Xms1024m
    Ustawienie początkowego rozmiaru sterty dla JVM (zalecana ta sama wartość co przy -Xmx).
  • -Xmx1024m
    Ustawienie maksymalnego rozmiaru sterty dla JVM.
  • -XX:MaxPermSize=256
    Ustawienie rozmiaru dla przestrzeni z definicjami klas, istotne w przypadku wystąpienie wyjątku OutOfMemoryError: PermGen space.
  • -XX:+UseLargePages
    Rezerwacja dużych strona pamięci, większych niż standardowe 4kB. Może wpływać negatywnie na wydajność innych aplikacji. Uboczną właściwością użycia dużych stron pamięci w Linuksie jest brak ich możliwości zapisania w pamięci swap (co niekoniecznie musi oznaczać coś złego). Aby używać tego parametru, wcześniej należy skonfigurować odpowiednio system operacyjny, dokumentacja znajduje się pod tym dokumencie: Java Support for Large Memory Pages.
  • -XX:+AggressiveOpts
    Włączenie dodatkowych optymalizacji JVM, które mają zostać włączone dopiero w przyszłych wersji Javy.
  • -XX:+DoEscapeAnalysis
    Po włączeniu tej opcji JVM będzie starał się sprawdzić, czy dany obiekt występuje tylko i wyłączenie w lokalnym zasięgu działania metody. Jeżeli tak, to będzie próbował alokować go bezpośrednio w na stosie bądź też w rejestrach. Dokładny opis można znaleźć w artykułach:

Przykładowa zawartość pliku run.conf:

1
2
3
4
5
6
if [ "x$JAVA_OPTS" = "x" ]; then
 JAVA_OPTS="-Xms128m -Xmx512m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi

# optymalizacja
JAVA_OPTS="${JAVA_OPTS} -XX:+UseLargePages -XX:+AggressiveOpts -XX:+DoEscapeAnalysis"

Tags: , ,