Konfiguracja szyfrowanego i kompresowanego tunelu vpn we FreeBSD na bazie vtund.

© 2002-01-23 Bartek 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.

Najnowsza wersja tego opracowania jest dostępna pod adresem: http://bofh.vt.pl
Dodatkowe informacje można uzyskać kontaktując się z autorem: Bartek Siębab