Saturday 30 December 2006

Konfiguracja szyfrowanego i kompresowanego tunelu vpn we FreeBSD na bazie vtund

© 2002-01-23 Bartłomiej Siębab ver. 1.3

WSTĘP

Czym jest vpn? VPN (virtual private network - wirtualna sieć prywatna) - to w największym uproszczeniu sieć rozciągnięta pomiędzy wieloma zdalnymi i oddalonymi sieciami LAN, przebiegająca poprzez łącza publiczne, które z natury są mało bezpieczne i nie zapewniają poufności dla przesyłanych danych. Chcąc zapewnić bezpieczeństwo przesyłanym danym stosuje się różnego rodzaju szyfrowanie i uwierzytelnianie, na bazie różnych systemów zarówno komercyjnych jak i OpenSource, opartych na różnych metodach i protokołach. Najpoważniejszym jest IPSec czy SUN Skip, czasami jednak nie ma potrzeby wytaczać armaty wielkiego kalibru na coś co można ustrzelić z procy. Z pomocą przyjdzie nam program Virtual Tunnel (vtund) dostępny pod adresem http://vtun.sourceforge.net a także w systemie paczek i portsów we FreeBSD (/usr/ports/net/vtun) czy dla innych systemów BSD czy też Linux'a. W przykładowej konfiguracji kompresja tunelu pozwoliła na łączu his/sdi (115200bit/sek - standartowo max 11KB/sek) "wycisnąć" podczas transmisji ftp pliku tekstowego ponad 32KB/sek. Oczywiście stopień kompresji zależy od samych przesyłanych zbiorów, JPG lub MP3 czy film już niewiele da się skompresować...

INSTALACJA

Instalację przeprowadzimy standardowym trybem, czyli:
$>cd /usr/ports/net/vtun
$>make install clean
Plik konfiguracyjny /usr/local/etc/vtund.conf powinien zawierać niezbędne parametry wymagane do zestawienia naszego tunelu pomiędzy dwiema sieciami. W celu przygotowania naszego środowiska systemu, niezbędne jest wykonanie konfiguracji firewalla (o ile go stosujemy). W przykładowej instalacji zestawiono tunel - szyfrowany i kompresowany - pomiędzy dwiema lokalnymi sieciami osiedlowymi (łącze SDI/HIS) po którym przebiega sieć Windows bazująca między innymi na Sambie. Specyfika tworzenia takiego tunelu wymusza ustalenie różnych klas adresów podsieci w łączonych sieciach, choć można także przy pomocy translacji adresów (natd czy ipnat) łączyć sieci o takich samych adresach, jednak nie jest to zalecane bowiem znacznie utrudnia późniejsze wykorzystanie sieci Windows itp. W przykładowej instalacji, obydwie sieci użytkują adresy 10.0.0.0/24 oraz 10.1.0.0/24. Końce zestawionego tunelu otrzymały adresy z podsieci 192.168.1.0/30. Vtund działa wykorzystując urządzenie systemowe /dev/tunX i dlatego musi być ono wkompilowane w nasz kernel (pseudo-device tun 4 # Packet tunnel). W systemie centralnym, vtund działa w trybie serwera obsługującego przychodzące połączenia. W systemach klienckich w trybie klienta łączącego się do systemu centralnego. W uproszczeniu odzwierciedla to poniższy schemat topologii:
LAN1------System Centralny------(.... WAN ....)------System klientowski------LAN2
           \                                              /
            \_________________tunel vpn__________________/
Konfiguracja translacji adresów systemów centralnego i klienckiego Musimy odpowiednio skonfigurować nasz firewall (ipfw) tak aby translacja adresów dotyczyła wyłącznie ruchu kierowanego w świat a nie do naszej wirtualnej sieci. Można to zlecić samemu vtund poprzez odpowiednie wpisy w jego konfiguracji, jednak tutaj wykonane to zostało w /etc/rc.firewall. Niezbędna jest modyfikacja regułek analogiczna do niżej przedstawionej (/etc/rc.firewall sekcja simple):
case ${natd_enable} in
[Yy][Ee][Ss])
if [ -n "${natd_interface}" ]; then

#wyłączamy standartowy tryb translacji wszystkiego
#${fwcmd} add divert natd all from any to any via ${natd_interface}

#będziemy maskować tylko ruch w świat
${fwcmd} add divert natd all from ${inet}:${imask} to any via ${natd_interface}
${fwcmd} add divert natd all from any to ${oip} via ${natd_interface}
fi
;;
esac
Konfiguracja firewall'a w systemie centralnym W celu przepuszczania ruchu pakietów pomiędzy naszymi systemami, w tym nawiązania połączenia systemów klienckich do naszego systemu centralnego (na port 5000) dodajemy poniższe regułki. W uproszczeniu, abstrachując od konkretnego przypadku, otrzymają one postać:
# Stop spoofing
# ...

# vpn połączenie klienta do serwera na port 5000
# tu należy wstawić publiczny adres IP systemu klienckiego
${fwcmd} add pass tcp from ${ipzdalnegohisa} to ${oip} 5000

# cały ruch pomiędzy sieciami LAN1 i LAN2 po interfejsie tunelu
${fwcmd} add pass ip from any to any via tun1

# Stop RFC1918 nets on the outside interface
# ...
Konfiguracja firewall'a w systemie klienckim W celu przepuszczania ruchu pakietów pomiędzy naszymi systemami dodajemy poniższe regułki. W uproszczeniu, abstrachując od konkretnego przypadku, otrzymają one postać:
# Stop spoofing
# ...

# cały ruch pomiędzy sieciami LAN1 i LAN2 po interfejsie tunelu
${fwcmd} add pass ip from any to any via tun1

# Stop RFC1918 nets on the outside interface
# ...
Konfiguracja vtund w systemie centralnym W pliku konfiguracyjnym vtund (/usr/local/etc/vtund.conf) umieszczamy poniższą konfigurację:
options {
# Przyjmowanie połączenia na porcie 5000
port 5000;

# Syslog facility
syslog        daemon;

# Scieżki do programów
ifconfig      /sbin/ifconfig;
route         /sbin/route;
}

# Domyślne parametry sesji
default {
compress yes;         # Włączenie kompresji
speed 0;              # Przepustowość maksymalna bez limitowania
}
# vpn do systemu klienckiego
vpn1 {
pass  mojetajnehaslo; # Password
type  tun;            # IP tunnel
proto tcp;            # TCP protocol
comp  zlib:9;         # LZO compression level 9
encr  yes;            # Encryption
keepalive yes;        # Keep connection alive
stat  yes;            # statistics in /var/log/vtund/

# co zrobić przy zestawieniu łącza
up {
   # Connection is Up
   # 192.168.1.1 - local, 192.168.1.2 - remote
   ifconfig "%% 192.168.1.1 192.168.1.2 netmask 255.255.255.252 mtu 1450";
   route "add -net 10.0.0.1/24 192.168.1.2";
};
# co zrobić przy zrzuceniu łącza
down {
   # Connection is down
   # 192.168.1.1 - local, 192.168.1.2 - remote
   ifconfig "%% down";
   ifconfig "%% delete";
   route "delete -net 10.0.0.0/24";
};
}
Konfiguracja vtund w systemie klienckim W pliku konfiguracyjnym vtund (/usr/local/etc/vtund.conf) umieszczamy poniższą konfigurację:
options {
# Przyjmowanie połączenia na porcie 5000
port 5000;

# Syslog facility
syslog        daemon;

# Scieżki do programów
ifconfig      /sbin/ifconfig;
route         /sbin/route;
}

# Domyślne parametry sesji
default {
compress yes;         # Włączenie kompresji
speed 0;              # Przepustowość maksymalna bez limitowania
}

# vpn do systemu klienckiego
vpn1 {
pass  mojetajnehaslo; # Password
type  tun;            # IP tunnel
proto tcp;            # TCP protocol
comp  zlib:9;         # LZO compression level 9
encr  yes;            # Encryption
keepalive yes;        # Keep connection alive
stat  yes;            # statistics

# co zrobić przy zestawieniu łącza
up {
   # Connection is Up
   # 192.168.1.2 - local, 192.168.1.1 - remote
   ifconfig "%% 192.168.1.2 192.168.1.1 netmask 255.255.255.252 mtu 1450";
   route "add -net 10.1.0.1/24 192.168.1.1";
};

# co zrobić przy zrzuceniu łącza
down {
   # Connection is down
   # 192.168.1.2 - local, 192.168.1.1 - remote
   ifconfig "%% down";
   ifconfig "%% delete";
   route "delete -net 10.1.0.0/24";
};
}
Uruchomienie vtund w systemie centralnym W systemie centralnym, vtund musi działać w trybie serwera i dlatego należy go uruchamiać w sposób typowy dla samodzielnych daemonów np. z /usr/local/etc/rc.d/ przykładowo:
$/usr/local/etc/rc.d>ls -l vpn*
-rwxr-x---  1 root  wheel  206 16 Sty 11:48 vpn-server.sh

$/usr/local/etc/rc.d>cat vpn-server.sh
#!/bin/sh
vpn=/usr/local/sbin/vtund

# start
if [ "x$1" = "x" -o "x$1" = "xstart" ]; then
   if [ -f $vpn ]; then
           echo -n ' vpn'
           $vpn -s vpn1
   fi
# stop
elif [ "x$1" = "xstop" ]; then
   killall vtund
fi
Uruchomienie vtund w systemie klienckim W systemie klienckim, vtund musi działać w trybie klienta nawiązującego i uprzymującego połączenie z systemem centralnym. Należy go uruchamiać w sposób typowy dla samodzielnych daemonów np. z /usr/local/etc/rc.d/ przykładowo:
$/usr/local/etc/rc.d>ls -l vpn*
-rwxr-x---  1 root  wheel  322 Jan 16 11:49 vpn-client.sh

$/usr/local/etc/rc.d>cat vpn-client.sh
#!/bin/sh
vpn=/usr/local/sbin/vtund

# start
if [ "x$1" = "x" -o "x$1" = "xstart" ]; then
   if [ -f $vpn ]; then
           echo -n ' vpn'
# tu należy wstawić publiczny adres IP systemu centralnego
$vpn -p vpn1 ${iphisacentralnego}
   fi

# stop
elif [ "x$1" = "xstop" ]; then
   killall vtund
fi
"5, 4, 3, ..." Odpalamy! Czas to wszystko uruchomić, bądź "z palca", bądź poprzez restart systemów. Testowo można "popingować" przeciwległe końce tunelu oraz hosty w zdalnej sieci. Jeśli wszystko działa jak należy, możemy się zabrać za szlifowanie regułek firewalli, rzeźbienie sieci Windows i Samby (jeden wspólny serwer wins niezbędny). Nie jest prostym zadaniem poprawne "wyrzeźbienie" regułek tak aby wszystko działało idealnie w konkretnym środowisku, stąd proponuję rozpocząć od cytowanych ustawień firewalla. Z pewnością napotkacie specyficzne problemy nad którymi przyjdzie wam spędzić wiele czasu ;-)
Dokumentacja jest umieszczona na stronie domowej Virtual Tunnel (vtund) http://vtun.sourceforge.net manuale dostępne w systemie po zainstalowaniu oprogramowania (man vtund). Na stronie domowej projektu jest także dostępne FAQ oraz archiwum grupy dyskusyjnej.

No comments: