Wirtualne sieci prywatne, IPsec, FreeBSD

Transkrypt

Wirtualne sieci prywatne, IPsec, FreeBSD
Wirtualne sieci prywatne, IPsec, FreeBSD
Zestawianie tunelu VPN pomiędzy dwoma sieciami w Internecie opartego na bramkach pracujących
pod kontrolą FreeBSD i IPsec.
VPN (ang. Virtual Private Network, Wirtualna Sieć Prywatna), można opisać jako "tunel", przez który
płynie ruch w ramach sieci prywatnej pomiędzy klientami końcowymi za pośrednictwem publicznej
sieci (takiej jak Internet) w taki sposób, że węzły tej sieci są przezroczyste dla przesyłanych w ten
sposób pakietów. Taki kanał może opcjonalnie kompresować lub szyfrować w celu zapewnienia
lepszej jakości lub większego poziomu bezpieczeństwa przesyłanych danych.
Ten dokument przedstawia krok po kroku proces uruchamiania IPsec oraz używania go w środowisku
maszyn pracujących pod kontrolą systemów FreeBSD oraz Microsoft® Windows® 2000/XP, tak aby
mogły się bezpiecznie ze sobą komunikować poprzez publiczną sieć Internet.
IPsec może być wykorzystany do bezpośredniego szyfrowania ruchu pomiędzy dwoma hostami
(znane jako Transport Mode) oraz budowania ”wirtualnych tuneli” pomiędzy podsieciami, co może być
zastosowane do komunikowania się dwóch sieci korporacyjnych (znane jako Tunell Mode) zwane
powszechnie jako Wirtualne Sieci Prywatne (VPN). Manulal ipsec(4) dokładniej opisuje implementację
protokołu IPsec wbudowanego w system FreeBSD.
Aby możliwe było korzystanie z IPsec w systemie FreeBSD, konieczne jest zmodyfikowanie kernela o
następujące parametry:
options
options
IPSEC
IPSEC_ESP
#IP security
#IP security (crypto; define w/ IPSEC)
Jeżeli chcielibyśmy załączyć tryb debugowania, do konfigu kernela dodatkowo należy dopisać:
options
IPSEC_DEBUG
#debug for IP security
Po uzupełnieniu pliku konfiguracyjnego o odpowiednie wpisy, należy kernel przekompilować i
ponownie uruchomić maszynę.
Scenariusz – dwie oddzielne sieci podłączone do Internetu, zachowujące się jak jedna
Wymagania:
•
•
•
•
•
•
dwie oddzielne sieci,
obydwie sieci zbudowane wewnątrz na bazie protokołu IP,
obydwie sieci podłączone do Internetu poprzez bramkę pracującą pod kontrolą FreeBSD,
bramka każdej z sieci posiada co najmniej jeden publiczny adres IP,
wewnętrzne adresy sieci mogą posiadać publiczne lub prywatne adresy IP, nie ma to żadnego
znaczenia, na bramce ich adresy mogą być poddawane translacji (NAT) na bramce,
klasy adresowe wewnętrznych sieci nie mogą ze sobą kolidować
Jeżeli zamierzasz połączyć dwie wewnętrzne sieci, używające tych samych prywatnych klas
adresowych (np. obydwie używają klasy 192.168.1.x) jedna z tych sieci musi być przeadresowana.
1
Schemat topologii sieci:
bramka 1
sieć
wewnętrzna 1
10.1.0.0/24
10.1.0.1
A.B.C.D
Internet
bramka 2
sieć
wewnętrzna 2
10.1.1.0/24
10.1.1.1
W.X.Y.Z
Drobna uwaga co do liter oznaczających adresy publiczne hostów, których będę używał w dalszej
części artykułu. Wszędzie gdzie będą one występowały, należy je zastąpić własnymi publicznymi
adresami IP. Należy również zauważyć, że bramki mają na interfejsie wewnętrznym adres IP .1 oraz,
to że dwie sieci, które chcemy złączyć używają oddzielnych klas (odpowiednio 10.1.0.x oraz 10.1.1.x).
Wszystkie maszyny w sieci wewnętrznej zostały skonfigurowane tak by używać maszynę .1 jako
swoją bramkę do Internetu.
Zatem zamiar jest taki by pomiędzy obiema sieciami wewnętrznymi istniała możliwość komunikacji tak
jak by były bezpośrednio podłączone do tego samego routera (z punktu widzenia rzeczywistości i
łącza którym na dzień dzisiejszy dysponujemy – dość wolnego routera).
Oznacza to, że komputer o numerze IP 10.1.0.12 będzie mógł wykonać
ping 10.1.1.31
i uzyska odpowiedź (przezroczyście) od komputera znajdującego się po drugiej stronie. Komputery z
systemem Windows będą mogły ”widzieć się” w sieci, będzie możliwe przeglądanie udostępnionych
katalogów tak jakby były w jednej sieci lokalnej.
Oczywiście cała komunikacja jest bezpieczna, to znaczy że wymiana danych pomiędzy sieciami jest
kodowana.
2
Utworzenie tunelu VPN pomiędzy sieciami to złożony proces, oto etapy:
1. Utworzenie wirtualnego połączenia pomiędzy sieciami poprzez sieć Internet. Przetestowanie
np. za pomocą polecenia ping(8), aby być pewnym, że tunel działa.
2. Zastosowanie polityki bezpieczeństwa aby zapewnić, że ruch pomiędzy dwoma sieciami jest
przezroczyście kodowany i dekodowany. Przetestowanie np. za pomocą narzędzia
tcpdump(1), aby upewnić się, że ruch jest kodowany.
3. Konfiguracja dodatkowego oprogramowania na serwerze FreeBSD, pozwalającego by
maszyny pracujące pod kontrolą Windows ”widziały” siebie nawzajem.
1. Utworzenie i testowanie wirtualnego połączenia
Będąc zalogowanym na maszynie pełniącej rolę bramki w pierwszej sieci (z publicznym adresem
IP A.B.C.D, prywatnym adresem IP 10.1.0.1), uruchamiamy ping 10.1.1.1, który jest
prywatnym adresem maszyny pełniącej rolę bramki w drugiej sieci o publicznym adresie W.X.Y.Z.
Co potrzebujemy by to zadziałało.
•
•
•
pierwsza bramka musi wiedzieć jak może ”zobaczyć” komputer o adresie 10.1.1.1, innymi
słowami musi mieć do niej trasę routingu,
prywatne adresy, postaci 10.x.x.x nie są używane w Internecie, oznacza to, że pakiety które
chcemy wysłać do 10.1.1.1 muszą być ”opakowane” w inne pakiety. Ów opakowany pakiet
musi przyjąć adres A.B.C.D i zostać wysłany do adresu W.X.Y.Z. Proces ten nazywany jest
enkapsulacją.
gdy już pakiet dotrze do adresu W.X.Y.Z konieczne jest by sostał od-enkapsulowany, oraz
dostarczony do adresu 10.1.1.1
Można więc powiedzieć, że potrzebujemy tunel pomiędzy dwoma sieciami. Dwie strony tunelu to
adresy IP A.B.C.D oraz W.X.Y.Z . Tunel ten transportować będzie pakiety z puli prywatnej,
poprzez publiczny Internet.
W systemie FreeBSD tunel tworzony jest używając interfejsu gif. Inaczej mówiąc interfejs gif
na każdej z bramek musi być skonfigurowany za pomocą dwóch adresów. Jednym z publicznej
puli, drugim z puli prywatnej adresów IP.
Obsługa interfejsu gif musi być wkompilowana w kernel na obydwu maszynach. Aby tak się
stało do configu Kornela należy dodać opcję:
device gif
oraz przekompilować kernel, zainstalować i uruchomić ponownie maszyny.
Konfiguracja tunelu następuje w dwóch etapach. Najpierw należy ustawić adresy zewnętrzne tunel
(publiczne IP), a następnie adresy, które będą przez nie transportowane (prywatne IP).
Na maszynie bramka 1 wykonujemy dwie komendy by skonfigurować tunel:
ifconfig gif0 create tunnel A.B.C.D W.X.Y.Z up
ifconfig gif0 inet 10.1.0.1 10.1.1.1 netmask 0xffffffff
analogicznie postępujemy na bramce 2:
ifconfig gif0 create tunnel W.X.Y.Z A.B.C.D up
ifconfig gif0 inet 10.1.1.1 10.1.0.1 netmask 0xffffffff
wykonując komendę:
ifconfig gif0
możemy zobaczyć jak wygląda nowo utworzony tunel:
więc na maszynie bramka 1 będzie to wyglądać następująco:
3
# ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
tunnel inet A.B.C.D --> W.X.Y.Z
inet6 fe80::250:daff:fe8b:2cfb%gif0 prefixlen 64 scopeid 0x6
inet 10.1.0.1 --> 10.1.1.1 netmask 0xffffffff
Jak można zauważyć utworzony tunel pomiędzy adresami A.B.C.D oraz W.X.Y.Z pozwala na
przesyłanie danych pomiędzy adresami 10.1.0.1 oraz 10.1.1.1
Routing tables
Internet:
Destination
...
10.1.1.1
...
Gateway
Flags
10.1.0.1
UH
Refs
Use
710
3710
Netif Expire
gif0
Aby możliwe było również przesyłanie danych pomiędzy adresami z podsieci konieczne jest
dodanie trasy routingu:
bramka 1:
route add -net 10.1.1.0/24 10.1.1.1
bramka 2:
route add -net 10.1.0.0/24 10.1.0.1
Dzięki tym ustawieniom oddzielone przez Internet prywatne sieci mogą się komunikować.
Aby jednak ten tunel oraz tablica routingu ustawiana była przy uruchamianiu systemu, dopiszmy
do rc.conf:
bramka 1:
gif_interfaces="gif0"
gifconfig_gif0="A.B.C.D W.X.Y.Z"
ifconfig_gif0="10.1.0.1 10.1.1.1 netmask 0xffffffff"
static_routes="vpn"
route_vpn="-net 10.1.1.0/24 10.1.1.1"
bramka 2:
gif_interfaces="gif0"
gifconfig_gif0=" W.X.Y.Z A.B.C.D "
ifconfig_gif0="10.1.1.1 10.1.0.1netmask 0xffffffff"
static_routes="vpn"
route_vpn="-net 10.1.0.0/24 10.1.0.1"
2. Zabezpieczenie połączenia
Aby zabezpieczyć nasz tunel użyjemy protokołu IPsec. Na początku protokołu wspominałem, że
musimy wkompilować obsługę IPsec w jądro. Jeżeli mamy już tą rzecz za sobą, możemy zabrać
się za szyfrowanie tunelu. Do tego celu potrzebne będzie doinstalowanie ipsec-tools znajdujących
się w drzewie ports, więc:
cd /usr/ports/secuirity/ipsec-tools/
make install clean
Do rc.conf dopiszmy jeszcze:
racoon_enable="YES"
Wymianą kluczy zajmie się racoon, który do swojego prawidłowego działania wymaga utworzenia
kluczy zaufania na obydwu hostach, oraz prawidłowego pliku konfiguracyjnego (możemy użyć
standardowego pliku znajdującego się w przykładach), zatem:
4
cp /usr/local/share/examples/ipsec-tools/racoon.conf /usr/local/etc/racoon/
oraz plik z kluczami psk.txt
bramka 1:
W.X.Y.Z
mojetajnehaslo
bramka 2:
A.B.C.D mojetajnehaslo
pamiętajmy, że plik ten może być jedynie czytany przez root-a więc:
chmod 0600 /usr/local/etc/raccoon/psk.txt
następnie w pliku ipsec.conf zdefiniujmy kodowanie tunelu:
bramka 1:
spdadd
10.1.0.0/24
W.X.Y.Z/require;
spdadd
10.1.1.0/24
A.B.C.D/require;
10.1.1.0/24
any
10.1.0.0/24
any
10.1.0.0/24
any
10.1.1.0/24
any
-P
-P
out
ipsec
esp/tunnel/A.B.C.D-
in
ipsec
esp/tunnel/W.X.Y.Z-
out
ipsec
esp/tunnel/W.X.Y.Z-
in
ipsec
esp/tunnel/A.B.C.D-
bramka 2:
spdadd
10.1.1.0/24
A.B.C.D/require;
spdadd
10.1.0.0/24
W.X.Y.Z/require;
-P
-P
Do rc.conf dopiszmy jeszcze:
ipsec_enable="YES"
Po załadowaniu reguł IPsec oraz starcie demona racoon, koniecznego do wymiany kluczy nasz
ruch pomiędzy sieciami jest kodowany. Możemy to sprawdzić używając fingując z bramki1
wewnętrzny adres bramki2 oraz podglądając transmisję pomiędzy tymi hostami programem
tcpdump, więc:
ping 10.1.1.1
a na kolejnej konsoli:
tcpdump dst host W.X.Y.Z
To co powinniśmy zobaczyć, to zakodowana transmisja po protokole ESP:
tcpdump dst host W.X.Y.Z
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xl0, link-type EN10MB (Ethernet), capture size 96 bytes
20:29:44.986706 IP A.B.C.D > W.X.Y.Z: ESP(spi=0x0103f965,seq=0x26), length 116
20:29:45.987570 IP A.B.C.D > W.X.Y.Z: ESP(spi=0x0103f965,seq=0x27), length 116
20:29:46.988421 IP A.B.C.D > W.X.Y.Z: ESP(spi=0x0103f965,seq=0x28), length 116
^C
3 packets captured
89 packets received by filter
0 packets dropped by kernel
5
i tak samo powinno to wyglądać dla każdej usługi:
# ftp 10.1.1.1
Connected to 10.1.1.1.
220---------- Welcome to Pure-FTPd [TLS] ---------220-You are user number 2 of 50 allowed.
220-Local time is now 20:38. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (10.1.1.1:jasiu):
331 User jasiu OK. Password required
Password:
230-User jasiu has group access to: wheel
230 OK. Current directory is /usr/home/jasiu
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
output z tcpdump:
# tcpdump dst host 192.168.1.60
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xl0, link-type EN10MB (Ethernet), capture size 96 bytes
20:32:36.975418 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xca),
length 100
20:32:36.977079 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xcb),
length 84
20:32:37.089883 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xcc),
length 84
20:32:41.942218 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xcd),
length 100
20:32:42.044149 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xce),
length 84
20:32:45.464018 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xcf),
length 100
20:32:45.603612 IP 192.168.1.11 > 192.168.1.60: ESP(spi=0x0103f965,seq=0xd0),
length 84
^C
7 packets captured
2416 packets received by filter
0 packets dropped by kernel
I już nie musimy się martwić, że przy sesji FTP przesyłamy hasło naszego konta otwartym
tekstem.
3. Konfiguracja dodatkowego oprogramowania,
Otoczenie sieciowe, SAMBA
W przygotowaniu.
autor: Janusz Pruszewicz <[email protected]>
źródła:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ipsec.html
http://ipsec-tools.sf.net
http://ipsec.pl/ipsec/
6