OpenVPN, объединяем домашние сети (original) (raw)
Данная статья посвящена объеденению нескольких домашних локальных сетей с предоставлением прозрачного общего доступа к ресурсам сетей с помощью VPN. За реализацию VPN взята openvpn. Клиенты и сервер openvpn установлены на роутерах домашних сетей, в конкретном случае роутеры семейства asus wl500, но данный мануал вполне применим и другим роутерам где есть досуп к OS и можно поставить openvpn.
Хотя подобных руководств в Интернете пруд пруди, они написаны больше для администраторов, которые имеют большой опыт общения с *nix системами, в то время как пользователями домашних роутеров являются в основном не хакеры, а обычные юзеры, может быть впервые увидевшие коммандную строку Linux на том самом роутере. Я постараюсь писать так чтобы было понятно всем.
Для тех кто не любит много букв, чтобы было понятно о чём речь под катом, привожу картинку
Итак, ещё раз формализую задачу. У нас есть несколько сетей имеющих выход в Интеренет через роутер, нам нужно предоставить доступ к ресурсам сетей друг друга через шифрованный интернет-тунель.
Что там понадобится
- Роутеры семейства asus wl500
- Очень желательно снабдить роутеры usb-флешками, так как в роутере очень мало флеш и оперативной памяти, подойдёт совершенно любая, ну кроме уж совсем раритеного старья, то есть меньше 9Mb. Чем не отличный повод порадовать себя новой флешкой? :)
- Хотя бы один из роутеров должен выходить в Интеренет с реальным IP адресом, либо все роутеры должны быть в одном сегменте локальной сети провайдера.
- Сети за роутерами должны иметь разный диапазон адресов
- Немного времени и мозга
Настраивать роутеры нужно будет вместе, поэтому желательно иметь к ним доступ одновременно. Бегать из одной квартиры в другую не особо удобно, поэтому можно либо обеспечить доступ из Интернета к компьютерам за роутерами (как это сделал я), либо просто собрать роутеры в одной квартире и прицепить клиентские (ой забежал вперёд) роутеры к сервеному, тогда на месте их постоянной работы нужно будет только изменить адрес openvpn сервера.
Теория
Рассмотрим кратко как будет работать система. Сеть состоит из сервера (на рисунке это роутер Mars) и клиентов Earth и Mercury. Сервер обеспечивает функционирование виртуальной сети, шифрование трафика и маршрутизацию пакетов из одной сети в другой.
Более подробно работа сервера показана на следующем рисунке (рисунок очень условный, он только для общего понимания и не отражает компоненты программы). В клиентском режиме openvpn работает точно также, только не осуществляет маршрутизацию.
Итак у нас есть сеть с диапазоном адресов 192.168.1.1-192.168.1.255 за первым роутером (Mars) и с диапазоном 192.168.2.1-192.168.2.255 за роутером Earth. OpenVPN создаёт специальную виртуальную сетевую карту tun0, и пакеты попавшие туда рашифровываются и отправляются на сервер (на серверном компьютере локально, на клинетском через интеренет), где они расшифровывются и отправляются по нужным тунелям до адресата.
Для примера рассмотрим прохождение пакета от компьютера Phobos до компьютера Moon. Пакет от Phobos отправлется на его гейтвей по умолчанию — Mars, там в таблице маршрутизации сказано, что его надо отправить в тунель tun0, там он попадает в openvpn, который уже знает, что пакеты для сети в которую входит Moon следует отправлять в тунель до Earth. Придя на Earth пакет благополучно будет отправлен на подключенную к лоаклке Moon.
Практика
Прошиваем роутеры прошивкой от Олега и ставим ikpg. Думаю многим пользователям wl500ых эта процедура известна. Она очень подробна написана тут: http://wl500g.info/showthread.php?t=3171. Нам необходимы шаги 1-4, собственно прошивка и 7, установка допонительных пакетов.
После того как всё готово ставим необходмы там пакеты командой ipkg install <имя пакета>
- openvpn — ну это нетрудно догадаться :)
- vim — текстовый редактор (тот который встроен в оболочку совершенно ни для чего не годится)
- wget-ssl — понадобится для обновления записей в dns, если у сервера динамический внешний ip.
Пока пакеты устанавливаются мы немного отвлечемся от Линукса и сгенерим ключи для vpn соединения. Как это сделать под Windows (линуксоиды, думаю, уже в теме :) ) уже подробно рассматривалось на хабре, повторятся тут нет смысла, следует только добавить что ca.key надо бы убрать куда нибудь подальше, например записать на ненужную флешку.
, а флешку положить в сундук под 33 замка
, так как зная ca.crt и ca.key можно спокойно подключится к вашей домашней сети, что ясно не входит в наши планы.
Имея под рукой сертификаты их надо положить на роутер который будет сервером, так как это обычные текстовые файлы, то можно просто скопипастить их в текстовый редактор на роутере.
Подключаемся с помощью telnet к роутеру, например
C:\>telnet 192.168.1.1
далее:
$vim /opt/etc/openvpn/keys/ca.crt
Потом нажимаем кнопку i, вставляем содержимое файла ca.crt. Тоже самое делаем с файлами dh2048.pem, mars.crt и mars.key.
После этого нужно создать файл конфигурации openvpn, входящий в комплект можно выбросить и вставить этот:
$rm /opt/etc/openvpn/openvpn.conf
$vim /opt/etc/openvpn/openvpn.conf
dev tun
tls-server
server 192.168.255.0 255.255.255.0
ifconfig 192.168.255.1 192.168.255.2client-config-dir ccd
route 192.168.255.0 255.255.255.0 #IP Range of VPN
route 192.168.2.0 255.255.255.0 #IP Range of Earthpush «route 192.168.1.0 255.255.255.0»
#Say to clients that Mars has 192.168.1.0/24 LAN#keys
dh /opt/etc/openvpn/keys/dh1024.pem
ca /opt/etc/openvpn/keys/ca.crt
cert /opt/etc/openvpn/keys/home2.crt
key /opt/etc/openvpn/keys/home2.key#Do not change unless know what you are doing
client-to-client
port 1194
proto udpuser nobody
group nobodycomp-lzo
persist-tun
persist-key
verb 3log-append /opt/var/log/openvpn/openvpn.log
status /opt/var/log/openvpn/status.logkeepalive 10 60
Создадим директорию в которой будет находится конфигурация для клиентов
$mkdir /opt/etc/openvpn/ccd/
В это директории необходимо создать файлы для тех клиентов за которыми будут находится объединяемые сети. В нашем случае это клиент Earth, создаём файл Earth
$vim /opt/etc/openvpn/ccd/Earth
Он у нас будет состять всего из одной строчки
iroute 192.168.2.0 255.255.255.0
Эта строчка говорит openvpn куда отправлять пакеты для сети 192.168.2.0/24.
Итак, до запука openvpn осталось только подправить скрипт запуска /opt/etc/init.d/S20openvpn и убрать оттуда строчку return 0.
Всё, запускаем openvpn
/opt/etc/init.d/S20openvpn
Если всё ok, то вывод netstat -ul | grep 1194 дожен выдавать сторчкуudp 0 0 *:1194 *:*
а в файле /opt/var/log/openvpn/openvpn.log Появится запись об успешном запуске сервера.
Итак, сервер работает, надо дать возможность пакетам проходить через firewall.
Для этого:$iptables -I INPUT -p udp --dport 1194 -j ACCEPT $iptables -I FORWARD -i br0 -o tun0 -j ACCEPT $iptables -I FORWARD -i tun0 -o br0 -j ACCEPT $iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
Чтобы правила применялись каждый раз их надо добавить в файл /usr/local/sbin/post-firewall, а строчку /opt/etc/init.d/S20openvpn дописать в post-mount, чтобы сервер стартовал каждый раз при запуске роутера ($ обозначает прилашение командной строки, в файлы его вносить не надо!).
(Вы не забыли записать изменения в flashfs?)
На этом настройка сервера практически закончена. Единственное, если сервер имеет динамический ip, то надо позаботится чтобы клиенты знали какой IP сейчас имеет сервер. Для этого есть такая штука как DDNS, то есть динамический DNS. Asus имеет встроенную поддержку некоторых DDNS провайдеров, но не всех, например моего нет. Поэтому я написал простенький скрипт, который обновляет IP на DNS, если IP роутера изменился:
`` #!/bin/sh
IFACE="ppp0"
TMPFILE="/tmp/oldip.txt"/sbin/ifconfig $IFACE > /dev/null 2>&1
if [ "$?" -ne "0" ]
then
logger "update_ip.sh: Interface $IFACE is down, exiting..."
exit 1
finew=
/sbin/ifconfig $IFACE|grep inet\ addr|sed -e 's/.*\ addr:\([0-9\.]*\).*/\1/'
if [ -f $TMPFILE ]
then
old=cat $TMPFILE
else
touch $TMPFILE
old=" "
fiif [ "$new" != "$old" ]
then
/opt/bin/wget --no-check-certificate "https://dynamicdns.park-your-domain.com/update?host=mars&domain=yourdomain&password=PASSWORD" > /dev/null 2>&1
logger "update_ip.sh: New ip $new detected"
echo new>new > new>TMPFILE
fi``
Как поставить и настроить cron очень подробно написано тут: wl500g.info/showpost.php?p=52524&postcount=1
И так, теперь переходим к клиенту. Установка клиента абсолютно такая же как и сервера, единственное надо перегнать ключи клиента (нам понадобятся ca.crt, Earth.crt, Earth.key) и нменого другом конфиге. Не забудьте подправить скрипт запуска.
Конфиг клиента, в поле remote нужно вставить адрес сервера
client dev tun proto udp remote mars.yourdomain 1194 resolv-retry infinite nobind persist-key persist-tun ca /opt/etc/openvpn/keys/ca.crt cert /opt/etc/openvpn/keys/Earth.crt key /opt/etc/openvpn/keys/Eartth.key ns-cert-type server comp-lzo verb 3 log-append /opt/var/log/openvpn/openvpn.log status /opt/var/log/openvpn/status.log
Аналогично применяем правила iptables:$iptables -I FORWARD -i br0 -o tun0 -j ACCEPT $iptables -I FORWARD -i tun0 -o br0 -j ACCEPT $iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
Запускаем openvpn на клиенте, он соединеятся с сервером и радуемся жизни. Можно смотреть фильмы, фотографии и рубится в игры как по локалке.
Единственное что я не смог сделать это синхронизировать внутренние DNS сервера, поэтому обращатся к компьютерам между сетями надо по их ip.
Ну, надеюсь это будет кому-то полезно, я что-то устал писать этот эпический мануал.
В качестве домашнего задания подключите компьютер Mercury, чтобы он имел доступ к локальным ресурам из любого места, например по gprs или публичного wifi.
В качестве advanced домашнего задания, отнимите у mercury возможность подсоединятся к сети, изменив только конфигурацию Mars.
(С) Иван Лисенков 2009