Итак, сегодня мы рассмотрим установку и настройку очень полезного пакета OpenVPN.
заходим на наш сервер, переходим в каталог /usr/local/src и качаем последние исходники:
cd /usr/local/src
wget http://openvpn.net/release/openvpn-2.0.7.tar.gz
распаковываем:
tar zxvf openvpn-2.0.7.tar.gz
и запускаем инсталляцию:
cd openvpn-2.0.7
./configure
После чего получаем ошибку такого вида:
LZO library available from http://www.oberhumer.com/opensource/lzo/
configure: error: Or try ./configure --disable-lzo
Это значит что у нас в системе нет библиотеки lzo с
помощью которой происходит компрессия и декомпрессия нашего трафика в
реальном режиме времени. лезем на соответствующий сайт, качаем
библиотеку и ставим:
cd ..
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.02.tar.gz
tar zxvf lzo-2.02.tar.gz
cd lzo-2.02
./configure
make
make install
После чего возвращяемся в каталог openvpn-2.0.7 и продолжаем установку
cd ../openvpn-2.0.7
./configure
make
make install
На этом этап инсталляции пакета закончен. Теперь приступим к настройке.
Генерируем master CA сертификат/ключ
cd easy-rsa
. ./vars
./clean-all
./build-ca
при генерации жмем везде Enter за исключением одной строки:
Common Name (eg, your name or your server's hostname) []: OpenVPN-CA
Это у нас имя CA сертификата.
Дальше генерируем сертификат и ключ для сервера:
./build-key-server server
Также жмем Enter на вопросы за исключением
Common Name (eg, your name or your server's hostname) []: server
На вопросы где есть выбор y/n отвечаем y
Дальше генерируем ключи клиентов, я делаю два:
./build-key client1
./build-key client2
также как и в предыдущем случае при вопросе Common Name отвечаем
соответственно client1, client2 и два вопроса где есть выбор y/n жмем y
Дальше генерируем параметры Diffie Hellman
./build-dh
На этом с генерацией покончено.
Теперь создаем каталог /etc/openvpn и переписываем туда сгенерированные ключи и конфигурационный файл нашего сервера:
mkdir /etc/openvpn cp ../sample-config-files/server.conf /etc/openvpn/ Открываем на редактирование конфиг сервера:
vi /etc/openvpn/server.conf
ищем строку
;push "redirect-gateway"
меняем на
push "redirect-gateway def1"
;push "dhcp-option DNS 10.8.0.1"
меняем на
push "dhcp-option DNS 10.8.0.1"
;max-clients 100
меняем на
max-clients 10 потому как 100 клиентов мы не хотим, нам 2 надо но на будущее сделаем запас
строки
;user nobody
;group nobody
раскомментируем в
user nobody
group nobody строку
verb 3
меняем на
verb 0 потому как мы не хотим чтобы лог велся подробный
переписываем скрипт старта сервера и добавляем его в автоматический старт при загрузке
cp /usr/local/src/openvpn-2.0.7/sample-scripts/openvpn.init /etc/rc.d/init.d/openvpn
chkconfig --add openvpn
запускаем openvpn
service openvpn start
Еще один этап завершили. Но это еще не все.
Теперь нужно настроить наш выделенный сервер чтобы все наше хозяйство работало.
Для начала включаем форвардинг пакетов:
vi /etc/sysctl.conf
находим строку
net.ipv4.ip_forward = 0
и меняем ее на
net.ipv4.ip_forward = 1
эта строка у нас говорит ядру включить форвардинг пакетов. Но этот
параметр сработает только после перезагрузки сервера, а нам естественно
нужно чтобы система заработала прямо сейчас.
Для этого также есть хитрая команда:
echo "1" > /proc/sys/net/ipv4/ip_forward
Теперь нам надо включить трансляцию адресов (NAT) чтобы пакеты от
клиентской машины попадая на наш выделенный сервер могли уйти в
Интренет, ну и соответственно возвращались назад.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Теперь нам надо сохранить наши настройки таблицы iptables:
iptables-save > /etc/sysconfig/iptables
Теперь при перезагрузке нашего сервера правила iptables будут
загружаться автоматически (конечно при условии что на нашем выделенном
сервере выбран автоматический старт службы iptables). Проверить это
можно командой:
chkconfig --list iptables
Результат вывода такой:
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Это значит, что для уровня запуска 3 старт службы iptables разрешен.
Все! На этом настройка нашего OpenVPN сервера закончена. Но это еще не все!
Теперь нам нужно настроить клиентскую часть OpenVPN. Рассмотрим самый
простой вариант инсталляции клиентской части OpenVPN под Windows XP.
Mathias Sundman разработал очень полезный продукт OpenVPN GUI for Windows для упрощения нам жизни :-). Лезем к нему на сайт, качаем и инсталируем http://openvpn.se/files/install_packages/openvpn-2.0.7-gui-1.0.3-install.exe
После инсталляции пакета в System Tray появляется соответствующий значек, похожий на значек удаленного доступа по модему.
Вернемся к вопросу настройки нашего OpenVPN сервера. Помните, мы там
генерировали ключи. Так вот именно сейчас они нам и понадобятся. А
именно для клиента client1 нам нужны следующие файлы:
ca.crt
client1.crt
client1.key
На нашем сервер они лежат в папке /etc/openvpn. Копируем их оттуда любым
способом на свою клиентскую машину. На сайте OpenVPN на эту тему
написано, что копировать ключи очень рекомендуется через защищенные
каналы свзи, например с помощью scp или sftp из пакета OpenSSH. Это
верно. Но в крайнем случае, можно их и по почте послать и по ftp
скачать. Дело Ваше.
Далее создаем для примера на нашем диске С папку vpn и
копируем туда наши ключи. Затем из папки C:\Program
Files\OpenVPN\sample-config\ копируем файл client.ovpn в папку
C:\Program Files\OpenVPN\config\ и открываем его на редактирование. Ищем
строку
remote my-server-1 1194
Меняем на
remote xxx.xxx.xxx.xxx 1194 где xxx.xxx.xxx.xxx это ip адрес нашего выделенного сервера.
Ищем строки
ca ca.crt
cert client.crt
key client.key
и меняем для нашего случая на
ca с:\\vpn\\ca.crt
cert с:\\vpn\\client1.crt
key с:\\vpn\\client1.key
Сохраняемся, потом жмем правой кнопкой мыши на значке OpenVPN в System Tray и выбираем Connect.
В общем на этом все. Теперь Вы в сети Интернет работаете от ip адреса
Вашего выделенного сервера, причем канал между Вами и сервером шифруется
с помощью SSL и трафик сжимается с помощью LZO real-time compression
library.
Некоторые дополнения к теме OpenVPN.
Для проверки шифрования канала можно воспользоваться утилитой tcpdump
и послушать, что именно проходит через наши интерфейсы например
запустив ping -t google.com с клиентской (в нашем случае windows
машины):
tcpdump -i tun0 -lenx для прослушивания интерфейса tun0:
07:35:39.039836 > ip 76: IP 64.233.167.99 > 10.8.0.6: icmp 40: echo reply seq 52992
0x0000: 4500 003c 5024 0000 f501 8342 40e9 a763 E..
0x0010: 0a08 0006 0000 825b 0400 cf00 6162 6364 .......[....abcd
0x0020: 6566 6768 696a 6b6c 6d6e 6f70 7172 7374 efghijklmnopqrst
0x0030: 7576 7761 6263 6465 6667 6869 uvwabcdefghi
07:35:39.935597 < ip 76: IP 10.8.0.6 > 64.233.167.99: icmp 40: echo request seq 53248
0x0000: 4500 003c 502d 0000 8001 f839 0a08 0006 E.. 0x0010:
40e9 a763 0800 795b 0400 d000 6162 6364 @..c..y[....abcd
0x0020: 6566 6768 696a 6b6c 6d6e 6f70 7172 7374 efghijklmnopqrst
0x0030: 7576 7761 6263 6465 6667 6869 uvwabcdefghi
07:35:40.039872 > ip 76: IP 64.233.167.99 > 10.8.0.6: icmp 40: echo reply seq 53248
0x0000: 4500 003c 502d 0000 f501 8339 40e9 a763 E.. 0x0010:
0a08 0006 0000 815b 0400 d000 6162 6364 .......[....abcd
0x0020: 6566 6768 696a 6b6c 6d6e 6f70 7172 7374 efghijklmnopqrst
0x0030: 7576 7761 6263 6465 6667 6869 uvwabcdefghiВидим,
что пакеты не шифрованы, но ведь так и надо для этого интерфейса :-)
Теперь посмотрим как шифруется канал между клиентской машиной и нашим сервером по интерфейсу eth0:
tcpdump -i eth0 udp port 1194 -lenx смотрим
07:49:27.636106 00:13:8f:a3:3c:bf > 00:0c:db:b6:21:00, ethertype IPv4 (0x0800),
length 143: IP ss.ss.ss.ss.1194 > cc.cc.cc.cc.4286: UDP, length 101
0x0000: 4500 0081 acc4 4000 4011 2e6d 5995 c3a1 E.....@.@..mY...
0x0010: 52d1 ef32 0bd6 10be 006d 2773 3022 cd46 R..2.....m's0".F
0x0020: fdbe bd8e eb73 1d90 ff19 14a3 f2a6 a484 .....s..........
0x0030: b34d 227c 0dc8 3115 f6bd 9f68 04b4 5b6d .M"|..1....h..[m
0x0040: 9f9e 5ff1 f8a0 e8de 5963 f8de 41fc 66ac .._.....Yc..A.f.
0x0050: f652
07:49:28.647961 00:13:8f:a3:3c:bf > 00:0c:db:b6:21:00, ethertype IPv4 (0x0800),
length 143: IP ss.ss.ss.ss.1194 > cc.cc.cc.cc.4286: UDP, length 101
0x0000: 4500 0081 acc5 4000 4011 2e6c 5995 c3a1 E.....@.@..lY...
0x0010: 52d1 ef32 0bd6 10be 006d 3ee2 3001 88d0 R..2.....m>.0...
0x0020: 19de 5eb9 6ece ee5f 4088 16a0 7ccb fed4 ..^.n.._@...|...
0x0030: c097 7c7e c546 9cd5 3c88 960e d87d dfdf ..|~.F..< ....}..
0x0040: 931f d1b5 b620 9fd1 6e70 898e 9753 aaeb ........np...S..
0x0050: 2337
где ss.ss.ss.ss адрес нашего сервера, а cc.cc.cc.cc адрес нашего клиента.
Как видно из дампа наш канал зашифрован.