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