от Zerg(16-06-2005)

рейтинг (18)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Статията е преведена от руски

можете да я намерите тук

Съществуват различни способи за организиране на виртуална частна мрежа (VPN). И този е един от тях – безплатен и с проста настройка.

Всичко тече, всичко се променя. Фирмичката, започнала своята дейност от една стаичка, се разпълзява на няколко етажа - а след още няколко години тя е вече компания с щаб-квартира във две здания и филиали по цялата страна.

Разширението засяга не само работните площадки, но и компютърните мрежи. Първи признак за ръст на компанията обикновено е появяването на сървър, когато администрирането на споделената мрежа става все по-трудно и по-трудно. Но скоро и той престава да се справя със задачите, защото данни искат всички, а сървърът е един.

Мрежата започва да се дели, а потребителите – да се оплакват от неудобствата. Те са свикнали, че сървърът се намира в същата като тях мрежа, и че достъпът до необходимите данни може да се получи с две щраквания с мишката. Сега, за да получат необходимата информация се налага да се промъкват през множество мрежи.

Допълнително възникват проблеми с защитата на информацията. На злоумишленика му е достатъчно да постави компютър някъде във връзките между различните мрежи , за да може спокойно да „прехваща“ цялата преминаваща информация. Единствения за системния администратор изход е да съедини всичко в една защитена мрежа VRN (Virtual Private Network).

Съществуват няколко свободни проекта, позволяващи създаването на такава мрежа: IPsec, FreeS/WAN, CIPE и просто РРР върху SSH. Те позволяват да се достигне необходимия резултат - но да се настроят правилно е трудна задача.

Като алтернатива може да се използва дистрибуция на Linux, имаща в своя състав средства за създаване на виртуални частни мрежи: Smoothwall или Astaro Security Linux. Тези системи са приложими в качеството си на рутер - но обикновено само в този случай, когато цялата система е събрана "от нулата".

"Виртуален тунел" VTun

„Виртуалния тунел“ Vtun е друго нещо. Буквално след 10 минути след набирането в адресния ред на браузъра на адреса на този проект, аз вече знаех , че той подхожда на 100%. VTun предоставя най-простия от всички известни на мен способи за създаване на виртуален тунел в TCP/IP мрежите.

Главното достойнство на VTun е отличната документация, простотата на инсталиране и конфигуриране, гъвкавостта на настройката. VTun поддържа различни типове тунели: IP, ppp, SLIP, Ethernet, TTY и pipe. Потоците се кодират с 128-битов ключ при помощта на OpenSSL по алгоритъма BlowFish. За генериране на ключа се използва алгоритъма MD5.

В качеството на базов (транспортен) протокол може да се използва не само по надеждния TCP, но и – за близки подмрежи – по бързия UDP. За ускоряване на предаването на данни е възможна (но не е задължителна) компресия на потока с помощта на библиотеките zlib и lzo. Библиотеката zlib осигурява ефективна компресия за TCP. По-бързата (и препоръчвана от разработчиците) lzo поддържа и двата протокола (UDP и TCP).

Освен това, VTun позволява да се ограничи входната и изходната скорост на тунелите за избягване на претоварвания на сървъра при наличие на голямо количество клиенти.

Официално проекта поддържа всички Unix-подобни операционни системи: Linux (RedHat, Debian, Corel и др.), FreeBSD и други аналози на BSD (FreeBSD 3.x, 4.x, OpenBSD, Apple OS/X и др.), а също така Solaris 2.6, 7.0, 8.0.

Системата работи чрез уникалните драйвери tun и tap. Tun се използва за тунелиране на IP-пакети, а tap (той е и ethertap) - при тунелиране на Ethernet. Драйверът TUN/TAP позволява на потребителските програми самостоятелно да обработват съществуващите пакети. Него можем да го разглеждаме като виртуално PPP или Ethernet устройство, което приема пакетите не от физически носители, а от потребителските програми, и изпраща пакетите не през физически носители, а ги записва в програмата на потребителя. По-подробна информация за работата на това устройство има в файловете на документацията на ядрото /usr/src/linux/Documentation/networking/tuntap.txt и ethertap.txt. Там има и примери за използването на тези устройства.

Настройка на драйверите

Към настоящия момент, драйверите TUN/TAP са реализирани за Linux, Solaris и FreeBSD, но работят и под други BSD-системи. Преди започване на работа е желателно да се убедим в наличието на необходимите устройства /dev/net/tun или /dev/tap#. При мен в RedHat и FreeBSD устройството tun бе създадено при инсталацията:

[root@grinder /]# ls -al /dev/net/tun
crw-r--r-- 1 root root 10, 2003Июн 23 11:26 /dev/net/tun

Ако по някаква причина това не е станало, може да пробвате да го създадете самостоятелно:

[root@grinder /]# mkdir /dev/net (ако я няма)
[root@grinder /]# mknod /dev/net/tun c 10 200

И да дадете права за достъп:

[root@grinder /]# chmod 0700 /dev/net/tun

Сега за автоматично зареждане на съответния модул добавяме във файла /etc/modules.conf такива редове:

alias char-major-10-200 tun

И обновяваме зависимостта на модулите:

# /sbin/depmod -a

Или ръчно:

[root@grinder /]# /sbin/modprobe tun

Проверяваме работата на системата:

[root@grinder /]# /sbin/lsmod
Module Size Used by Not tainted
tun 5696 0 (unused)

Аналогично за TAP:

[root@grinder /]# mknod /dev/tap0 c 36 16
[root@grinder /]# mknod /dev/tap1 c 36 17

Сега устройството е готово за работа. Ако нещо не се е получило, то, най-вероятно, ще се наложи отново да конфигурирате ядрото.

За поддържане на tap е необходимо да се включат следните редове:

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
#
# Network device support
#
CONFIG_ETHERTAP=m

А за tun – такъв ред:

CONFIG_TUN=m
Архитектура на VTun

VTun работи по принципа клиент-сървър. На един от хостовете програмата се стартира като сървър, а на останалите като клиент. Количеството на клиентите се ограничава само от мощността на компютъра, изпълняващ ролята на сървър.

При използване на firewall е необходимо да се разреши преминаването на пакета през порт 5000, по подразбиране използван от VPN-сървъра за прослушване на мрежата за наличие на включвания. При създаване на съединение клиентът се опитва да се включи към този порт. Сървърът удостоверява клиента на основата на парола, записана във файла /usr/local/etc/vtun.conf. Ако всичко е нормално, сървърът с fork () стартира още един демон vtun (който ще работи с клиента по нататък), а сам се връща в изходно състояние и чака следващи включвания.

Но това не е всичко. Възможно е едновременното стартиране върху един компютър на няколко демона vtun, всеки от които чете собствен конфигурационен файл и работи в режим сървър или клиент. По този начин се създават няколко vtun мрежи. Единствения проблем е в това, че не може да се използват заедно NAT и VPN-тунел, понеже последния проверява валидността на пакетите чрез шифроване и проверка на контролната сума. NAT презаписва съдържанието на преминаващите пакети, и поради това те няма да преминат през такава проверка.

Инсталиране на VTun

Освен дистрибуцията на VTun, за инсталирането ще потрябват и пакета OpenSSL и библиотеките zlib и lzo. Впрочем, може и без последните - но тогава потока няма да се компресира. В дистрибуциите FreeBSD или OpenBSD всичко това се инсталира отделно. В RedHat 9, с която съм работил, става по следния начин:

# rpm -qa | grep openssl
openssl-0.9.7a-2
openssl-devel-0.9.7a-2
# rpm -qa | grep zlib
zlib-devel-1.1.4-8
zlib-1.1.4-8
[root@grinder sergej]# rpm -qa | grep lzo

Както виждаме, всичко е готово, освен библиотеката lzo. Ако нещо не достига, то последните версии на zlib можем да намерим тук, lzo - на сайта, а OpenSSL - на официалния им сайт. Потребителите на системите BSD им е по удобно всичко това да го намерят в системата от портов.

След като са инсталирани всички необходими програми, пристъпваме към инсталирането на VTun:

# tar xvfz vtun-2.6.tar.gz
# cd vtun
#./configure

Понякога, ако програмата при конфигурацията не е намерила някои файлове, тя дава примерно следното съобщение за грешка:

checking for ZLIB Library and Header files...
checking for deflate in -lz... yes
checking for LZO Library and Header files...
checking for lzo1x.h... no
configure: error: headers not found.

С други думи, програмата не е намерила файлове от библиотеката LZO. Ако тези библиотеки са инсталирани, трябва просто да се даде ръчно тяхното разположение с опциите --with-lzo-headers=DIR и --with-lzo-lib=DIR:

#./configure with-lzo-headers=/usr/local/include/
--with-lzo-lib=/usr/local/lib/

Ако съобщението за грешка продължава да се появява или библиотеката не е инсталирана, то за да се продължи работата без поддържане на библиотеката LZO се използва ключа --disable-lzo, а за библиотеките ZLIB - --disable-zlib, за изключване на шифрирането - --disable-ssl. След това извършваме компилиране и инсталиране на програмата, както обикновено:

# make
# make install

Ако всичко е преминало без грешки, то преди стартирането е необходимо да се въведат изменения в конфигурационите файлове на сървърите и клиентите. Файла /usr/local/etc/vtun.conf, създаден при инсталирането, е добре коментиран и съдържа готови шаблони за работата на VTun както в качеството на сървър, така и като клиент. Нашата задача се състои в това, да премахнем излишното и поставим необходимите за работата параметри.

Типичен файл за сървър изглежда така:

options {
port 5000;
syslog daemon;
 
# В този блок се описват пътищата
# до използваните програми
ppp /usr/sbin/pppd;
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/ipchains;
ip /sbin/ip;
}
default {
compress lzo:9;
speed 0;
}

Разделите options и default са общи. Тяхното съдържание се разпространява на всички следващи секции. Обаче при следваща настройка стойността на опциите от раздела default могат да се преопределят за всеки клиент. По-долу се описва настройка на отделни клиенти. Обърнете внимание, че имената на всички опции могат да се съкратят до 4-ри знака.

mashine1 {
passwd Ma;;*TU;
type tun;
proto udp;
encrypt yes;
keepalive yes;
up {
ifconfig "%% 192.168.0.1 pointopoint 192.168.0.3
mtu 1450";
};
}
mashine2 {
passwd Ma&^TU;
type ether;
device tap0;
proto udp;
compress zlib:5;
speed 256:128;
encrypt yes;
stat yes;
keepalive yes;
 
up {
ifconfig "%% 192.168.0.2 192.168.0.1
netmask 255.255.255.0";
route "add -net 192.168.0.0 netmask 255.255.255.0";
firewall "-A forward -s 192.168.0.0/24 -d 0.0.0.0/0
-j MASQ";
};
 
down {
 
ifconfig "%% down";
route "delete 192.168.0.0";
firewall "-D forward -s 192.168.0.0/24 -d 0.0.0.0/0
-j MASQ";
};
}

Възможни стойности на опциите при настройка на Vtun

Опция

Описание

Секция options

type

Способ на стартиране на демона vtund: като самостоятелна програма (по подразбиране) или чрез inetd. Възможни стойности - stand, inetd

рort

Номер на порта, който прослушва сървъра в очакване на съобщения

рersist

Възможни стойности - yes, no. При стойност yes клиентът ще се опитва повторно да се съедини със сървъра в случай на прекъсване. Игнорира се при сървър

timeout

Време на изчакване за клиента. Игнорира се при сървър

Секция default и секции за клиентите

рassword

Парола за достъп на клиента до сървъра. Еднакъв за двата компютъра. Доколкото паролата се съхранява във файловете за настойката в открит вид, достъп до тях трябва да има само root

type

Тип на използвания тунел. Игнорира се при клиент. Възможни стойности: tun (IP tunnel, пo PPP, Ether), ether (Ethernet), tty (serial tunnel, по PPP, SLIP, използва се по подразбиране) и pipe (pipe tunnel)

device

Използвано сървърно устройство. Обикновено vtund правилно разпознава устройството автоматично, така че тази опция може да не се пипа

proto

Възможни стойности: tcp, udp. Използван протокол. По подразбиране - ТСР. UDP може да се използва само за ether и tun. Игнорира се при клиент

сompress

Метод и степен на компресия. Възможни стойности - no (без компресия), yes (компресия по подразбиране), zlib и lzo (ако системата е компилирана с поддръжка на тези библиотеки). Чрез двоеточие се указва степента на компресиране от 1 до 9. Колкото е по-голямо числото, толкова е по-голяма степента на компресиране. При това е необходимо да се помни, че по-високи степени на компресиране изискват повече системни ресурси. Игнорира се при клиент

encrypt

Включване/изключване на шифриране. Възможни стойности - yes, no. Игнорира се при клиент

keepalive

Възможни стойности - yes, no. Определя, необходимо ли е да се опитва възтановяване на връзката при прекъсване на връзката. Игнорира се при клиент

stat

Включване/изключване на режима за водене на статистика. Възможни стойности - yes, no. Ако тази опция е включена, то сървърът на всеки 5 минути записва статистически данни във файла /var/log/vtund/host_X

speed

Ограничение на скоростта за особено "лакоми" клиенти. Параметрите се задават в Кб/с. Допустими стойности са 8, 16, 32, 64, 128, 256 и т.н. По подразбиране параметърът е равен на 0, което означава максималната възможна скорост. Може да се зададе скорост във формата in:out, където in – е скоростта на предаване на данни към клиента,а out - от клиента. Една цифра означава еднаква скорост в двете посоки. Игнорира се при клиент

srcaddr

Твърда връзка с абсолютен адрес и порт

Multi

Управление на паралелни съединения. Стойностите yes и allow разрешават паралелните съединения, no и deny - забраняват, killold разрешава ново съединение, забранявайки старите. Игнорира се при клиент

up, down

Посочват инструкции, които се изпълняват при удачно съединение и при прекъсване на връзката. Използват се за да се инициализират протоколи, устройства, маршутизацията и firewall. Освен стартираните програми, могат да се шаблони и аргумента wait, позволяващ на vtund да изчака завършването на работата на програмата. Шаблоните могат да бъдат следните:

·         ' (единична кавичка) - група аргументи;

·         \ (обратна наклонена черта) - символ escape;

·         %d - устройство TUN или TAP или име на TTY-порт;

·         %% - същото, като %d;

·         %A - локален IP-адрес;

·         %P - локален порт TCP или UDP;

·         %a - отдалечен IP-адрес;

·         %p – отдалечен порт TCP или UDP

Повечете параметри обикновено се настройват автоматично, и да се прибягва към ръчна настройка се налага само в краен случай. Да разгледаме пример на файла за клиентски компютър. В него са премахнати излишните параметри от секцията за сървър и са изменени стойностите на IP-адресите на вдиганите интерфейси (Адресите на интерфейсите, използвани в примера, са дадени в таблицата).

Адреси на интерфейси, използвани в примера

Компютър

Външен IP

Вътрешен IP

Виртуален интерфейс

Сървър

1.2.3.4

192.168.10.0

192.168.0.1

Клиент mashine2

10.20.30.40

192.168.20.0

192.168.0.2

options {
port 5000;
timeout 60;
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/ipchains;
}
 
mashine2 {
pass Ma&^TU;
type ether;
up {
ifconfig "%% 192.168.0.2 netmask 255.255.255.0";
};
down {
ifconfig "%% down";
};
}

Обърнете внимание: синтаксиса на параметрите ifconfig, firewall и общата настройка на мрежовите интерфейси в дадените примери ще се различават за различните операционни системи.

След като всички файлове са готови, стартираме на компютъра, изпълняващ ролята на съръвър, демона vtund в режим сървър:

Server# vtund -s

На компютрите-клиенти страртираме vtund с указване името на хоста, фигуриращо в конфигурационния файл, и IP-адреса или името на сървъра:

mashine2# vtund -р mashine2 1.2.3.4

За грешките при стартирането наблюдаваме в друга конзола:

# tail -f /var/log/message

Ако не се появи нищо подозрително, можем да считаме че създаването на VPN-мрежата е завършено.

Последна настройка

За да се убедим още веднъж в правилността на инсталирането, можем да погледнем с помощта на командите на ifconfig, какви интерфейси са инсталирани на компютрите и какви стойности на параметрите са им присвоени. Ако има устройства tun# и tap# с указаните във файла параметри - значи, всичко е наред.

Способа на шифриране леко може да се определи чрез обикновена команда ping. Необходимо е да се изпълни тази команда в посока защитената и незащитена мрежа и да се "прехванат" предаваните пакети с tcpdump. По подразбиране ping предава едни и същи данни при всяко обръщение, и затова, ако получените пакети се различават, значи данните се шифрират.

При такава конфигурация всички клиенти имат достъп до мрежата на сървъра, но не един към друг. Ако се налага изграждане на тунел между клиентите, то единия от тях се настройва като съръвр, а на втория се стартира нов клиент. Данните за новото съединение могат да бъдат получени както от отделен файл, който се указва при стартиране с опцията -f, така и от основния файл. При това е необходимо да се присвои на новото съединение отделно име с неговите параметри, с което след това ще се стартира клиента, а сървъра ще слуша за неговите опити за съединение.

Единственото, което за сега огорчава, е липсата на реализация на VTun поне за клиенти под Windows.

 



<< Създаване на резервни копия с TAR | Как да си направим малък торент тракер на Линукс машината >>