Итак, дорогой друг, сегодня мы с тобой научимся создавать шифрованные соединения между различными сетями на базе OpenVPN. Для начала дуй на
http://openvpn.net/ и тащи от туда свеженький исходник (как всегда для гурманов) или бинарник (для любителей Windows). Те, кто не любит особо заморачиваться с компилированием в ручную могут дуть /usr/ports/security/openvpn (FreeBSD ports) и устанавливать из портов.
Если ты, как и я, дома работаешь с Windows (он все же удобнее и поиграться можно, когда работа до смерти надоедает 😉 ), то советую тебе зайти еще и суда:
http://openvpn.net/gui.html
- это GUI для виндовой версии, для MacOS там по-моему тоже что-то было. Итак, скачали, поставили под Win, устанавливаем под FreeBSD. Для тех, кто впервые решил собрать что-то ручками, напоминаю традиционные команды.
#tar –zxvf openvpn-2.0_rc21.tar.gz
#cd openvpn-2.0_rc21
#./configure
#make
#make install
#make clean
Если для успешной сборки не хватает каких-нибудь пакетиков, или попробуй указать их через опции в ./configure. Для удобной работы с конфигуратором, я обычно использую либо два терминала либо две сессии Putty. На одном запускаю:
#./configure –help | less
А на другом набиваю различные флаги. Так, с установкой вроде бы разобрались… Переходим к куда более интересной и сложной части, а именно созданию конфигурационных файлов и различного рода ключей.
Модификация BSD
Для того чтобы все заработало, необходимо пересобрать ядро со следующими опциями:
options IPSEC
options IPSEC_ESP
Редактим конфиг
Для работы серверной части нам понадобится совсем не много. Если хочешь почитать дополнительную инфу:
#man openvpn
Если хочется поскорее рваться в бой, то просто повторяй за мной! Ух ты, уже в рифму писать начал! Так вот, редактируем конфиг:
#vi /usr/local/etc/openvpn/office.conf
Прописываем туда следующее:
daemon openvpn # просим наш openvpn сервер стать демоном, советую вставить эту #строчку только после того как все заработает.
dev tun # используем этот интерфейс
server 10.1.0.0 255.255.255.0 #укажем ip сервера в vpn сети
push "route 10.1.0.0 255.255.255.0" #– эта штука добавит маршрут vpn сети
push "route 194.1.1.0 255.255.255.0" #– эта добавит клиентам маршут сетки за vpn сервером
push "route 192.168.0.0 255.255.255.0" #- это маршрут до твоей домашней сети
client-to-client #закомментируй это, если не хочешь, чтобы vpn клиенты видели друг друга
tls-server #указываем, что это серверная конфигурация
dh /etc/ssl/dh2048.pem # это сертификат для шифровки установки соединения
ca /etc/ssl/CA_cert.pem # Это серверные сертификаты
cert /etc/ssl/certs/Cserv.pem #
key /etc/ssl/keys/Kserv.pem #
proto tcp-server #Скажем серверу работать по TCP протоколу
port 5000 # На порту 5000
user nobody #Пользователь, из-под которого стартует vpn сервер (не ставь root!)
group nobody #Ну а это группа
comp-lzo #Включаем сжатие
persist-tun #Использование тех же интерфейса и ключа при рестарте сервера
persist-key
tls-auth /etc/ssl/ta.key 0 # Защита от DOS атак
keepalive 10 120 # Время жизни неактивной сессии
verb 4 # Количество отладочной информации (от 0 до 9)
Так, все. С сервером закончили. Переходим к клиенту. Про ключи и сертификаты не волнуйся, создадим их попозже.
Windows OpenVPN client
Знаешь, этой штукой можно пользоваться даже на dialup-ом соединении, что для меня не маловажно! Скинул ключи да установщик на Flash-ку и не беспокойся больше, даже если ты в гостях у друга пьешь пиво и ешь мясо, а тут начальник позвонит и начнет ругаться, что у них что-то не работает, поднимаешь клиента у друга, только не догадайся копировать ключи ему на жестак. Конфиг скопируй, а пути поменяй до клиентских ключей на флешке, вот. Ах, да… Поехали дальше.
Жмешь ПУСК-Программы-OpenVPN… Входи в папку с конфигурационными файлами. Создай home.ovpn и напиши или скопируй туда этот конфиг:
dev tun
client #Говорим, чтобы клиент забирал информацию о маршрутизации с сервера (вспомни # push опции)
remote ip-a #Вместо ip-a впиши реальный ip своего видимого в интернете сервера
tls-client # Это клиентская конфигурация
ns-cert-type server #Это еще одна защита, на этот раз от «man in the middle» атаки.
ca "H:\\config openVPN\\CA_cert.pem" # Это как раз пути ключей (Они у меня на флешке)
cert "H:\\config openVPN\\chome.pem"
key "H:\\config openVPN\\khome.pem"
tls-auth "H:\\config openVPN\\ta.key" 1 #Защита от DOS. Здесь в отличии от сервера стоит #единичка. Не перепутай, Кутузов! 😉
proto tcp-client #Клиент работает по TCP
port 5000 #Соединяется с 5000 портом
comp-lzo # Это ты уже знаешь
tun-mtu 1500 #Просто скопируй, если не знаешь сетей, я не смогу рассказать об этом в #двух строчках
tun-mtu-extra 32
mssfix 1450
verb 4
Так, конфиг готов. Перейдем к более интересному занятию, генерации ключей и сертификатов.
OpenSSL рулит
Топай в /etc/ssl. Там создай 2 файла: index.txt и serial. Теперь запишем кое-что в serial:
#cd /etc/ssl
#touch index.txt
#touch serial
#echo “01” > ./serial
Теперь, создадим пару папок:
#mkdir certs
#mkdir keys
#mkdir crl
А теперь, немножко позаботимся о безопасности и изменим свой openssl.cnf. Я понимаю, что у тебя очумелые ручки, поэтому не забудь сделать копию этого файла, так, на всякий пожарный. 😉
#cp ./openssl.cnf ./ openssl.cnf.backup
#vi openssl.cnf
Найди параметр «default_days» и выставь его равным 9125 (это кол-во дней до того, как наши сертификаты перестанут работать). И в самый конец конфига подпиши вот что:
[ server ]
basicConstraints =CA:FALSE
nsCertType =server
После того, как ты создашь сертификаты, эта штука не даст всяким читающим этот журнал парнишкам провести простую «man in the middle» атаку. Если забудешь это прописать настройка «ns-cert-type server» в конфигурационном файле работать не будет.
Еще чуток терпения и ты сделаешь то, чего так долго ждал. ТЫ СДЕЛАЕШЬ ЭТО!
Вернемся на пути истинные:
#openssl req –new –x509 –keyout private/CA_key.pem –out CA_cert.pem
Введи пароль и не забудь его.
#openssl req –new –nodes –keyout keys/Kserv.pem –out req/Rserv.pem
Для этой строки важно, чтобы параметр Organization Name совпадал с тем, что ты указал при генерации CA_cert.pem.
#openssl ca -extfile /etc/ssl/openssl.cnf –extensions server –out certs/Cserv.pem –infiles req/Rserv.pem
Тебя зададут пару вопросов, на которые не думая долго отвечай «y».
Это было для сервера. Теперь повторим все то же самое, но для клиента.
#openssl req –new –keyout keys/Khome.pem –out req/Rhome.pem
#openssl ca –out certs/Chome.pem –infiles req/Rhome.pem
Не забудем про ta.key:
#openvpn --genkey --secret ta.key
Так, и на последок создаем Diffie-Hellman (фиг знает как это по-русски написать) файл
#openssl dhparam –out dh2048.pem 2048
Получив сообщение о его долгом создании, идем пить пиво (у меня и правда почти 20 минут создавался).
Забираем наши сертификаты
Все, принимай мои поздравления, ты все сделал! Теперь осталось только забрать с собой:
- CA_cert.pem
- Chome.pem
- Khome.pem
- ta.key
Для этого либо копируем на дискетку:
#mkdir /mnt/floppy
#mount -t msdos /dev/fd0a /mnt/floppy
# cp /etc/ssl/certs/Cnode.pem /mnt/floppy
#cp /etc/ssl/keys/Knode.pem /mnt/floppy
#cp /etc/ssl/CA_cert.pem /mnt/floppy
#cp etc/ssl/ta.key /mnt/floppy
#umount –f /dev/fd0a
Либо, если ты отважный черт, а значит делаешь все строчка за строчкой сразу на сервере, то используешь sftp клиент и забираешь все с сервака самостоятельно.
Ракета пошла
Теперь запускаешь OpenVPN сервер:
#openvpn –config /usr/local/etc/openvpn/office.conf
Автозагрузка
Создай небольшой openvpn.sh в /usr/local/etc/rc.d для автоматического запуска при перезагрузках:
#!/bin/sh
case "$1" in
start)
echo -n "OpenVPN2 Starting... "
/usr/local/sbin/openvpn || exit 1
;;
stop)
echo -n "Shutting down OpenVPN2... "
/usr/bin/killall openvpn &>/dev/null || exit 1
;;
reload|restart)
$0 stop && sleep 1 && $0 start || exit 1
;;
*)
echo "Usage: $0 {start|stop|reload|restart}"
exit 1
esac
exit 0
Фаервол
Прописываешь правило для ipfw, чтобы разрешить коннекты на наш с тобой демон:
#ipfw –q add pass tcp from any to me 5000
#ipfw –q add pass tcp from any to any via tun0
Так же можешь добавить это к своему фаервол скрипту.
Последний штрих
Для коннекта с Windows-клиента используешь GUI, как прописать его в автозагрузку для удобства, думаю, и сам разберешься.
Подведем итоги
Итак, ты только что настроил соединение между сервером-маршрутизатором, защищающим твою сетку где-то там и своей домашней сетью. Это великий шаг. Ты на еще один левел поднял свое искусство администрирования. Еще раз не поскуплюсь и поздравлю тебя. Знаешь, есть умные люди, которые не советуют таким образом создавать соединения между сетями. Мы добавили с тобой правило только позволяющее подключаться к твоему серверу и беспрепятственно бегать между двумя сетями. Если ты решишь увеличить число клиентов OpenVPN сервера, тебе придется дополнительно настроить и фаерволинг с безопастность, а чем больше интерфейсов на маршрутизаторе, тем сложнее за этим следить. Кроме того, ты только что выполнил расширение адресного пространства своих сетей. Этого как раз и не любят эти грамотные в вопросах безопасности дяди. Ну да ладно, это уже философские байки, раз хочешь, пользуйся. И напоследок, отправляю тебя на
http://openvpn.net/, там много документации, с которой я бы на твоем месте ознакомился. Ну все, мне пора. Если что, адрес все тот же:
solaris@vconsultant.ru. Жду отзывов и предложений.