22 июля 2014 г.

Устанавливаем OpenVPN в роутер TP-LINK TL-WR1043ND v1.x

OpenVPN + TP-Link TL-WR1043ND v1.x

В предыдущей статье (устанавливаем Open-WRT) мы установили в роутер TP-LINK TL-WR1043ND альтернативную прошивку OpenWRT, которая позволяет расширить возможности роутера. Теперь рассмотрим вопрос установки OpenVPN сервера.

Предыстория

Я имею беспроводной 3G роутер, с дешевым тарифом, ориентированным на пользование детьми, в котором на уровне провайдера запрещены многие категории сайтов, включая форумы и социальные сети. Без социалок и прочего можно вполне жить, а вот отсутствие доступа к форумам меня удручало. К тому же фильр провайдера иногда очень странно фильтровал ресурсы, относя совсем безобидные (типа досок объявлений) к списку запрещенных, что немного раздражало. По этому я решил установить  OpenVPN Server в домашний роутер, что позволит ходить на любые ресурсы в Сети без ограничений. Для провайдера это выглядит как подключение к одному хосту (роутеру дома), а куда я от туда хожу дальше уже не его дело. И как дополнительный бонус я получаю возможность работать с любым устройством внутри домашней сети без необходимости открывать уйму портов на фаерволе. 

Зачем это нужно?


Начнем с того, что такое VPN и в каких случаях может понадобится. VPN (англ. Virtual Private Network — виртуальная частная сеть) — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например, Интернет). Проще говоря, с помощью VPN можно соединить два удаленных друг от друга  компьютера так, как будь-то они находятся в одной локальной сети. В случае с домашним роутером VPN-соединение позволяет подключатся через Интернет к домашней сети и работать с любым устройством в ней как если бы мы находились дома. 

Что такое OpenVPN?


OpenVPN — реализация технологии VPN с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall. При этом есть возможность защитить подключение шифрованием на основе сертификатов.

Обновление прошивки OpenWRT


Для начала обновим прошивку OpenWRT c Backfire 10.03.1 до Attitude Adjustment 12.09. Этот шаг можно конечно пропустить, но в 12.09 есть файловый менеджер Midnight Commander, именуемый часто просто MC, у которого не отключен встроенный редактор в отличие от такового в 10.03.01. А редактировать конфигурационные файлы в консольном vi то еще удовольствие. Да и в новой версии пакеты посвежее.

И так, подключаемся в консоль роутеру, переходим в каталог /tmp и качаем файл прошивки для нашего роутера (sysupgrade) и md5sums:

cd /tmp
wget http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/openwrt-ar71xx-generic-tl-wr1043nd-v1-jffs2-sysupgrade.bin
wget http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/md5sums


Проверяем целосность скачаного файла с прошивкой:
md5sum -c md5sums 2> /dev/null | grep OK
Запускаем обновление:
sysupgrade -v /tmp/openwrt-ar71xx-generic-tl-wr1043nd-v1-jffs2-sysupgrade.bin
Роутер автоматически перезагрузится после прошивки. Есть еще несколько альтернативных способов обновления. Все они описаны здесь.

Подготовительные работы


После обновления прошивки нам нужно заново установить пакеты, если таковые были установлены. Обновляем, устанавливаем MC:
opkg update
opkg install mc
Если вы подключаетесь в консоль роутера из Windows с помощью Putty то в его настройках необходимо изменить кодировку с UTF8 на KOI8 для того, что бы интерфейс MC выглядел нормально.

Установка OpenVPN Server


Устанавливаем необходимые пакеты:
opkg update
opkg install openvpn openvpn-easy-rsa
Запускаем MC:
mc 
Переходим в каталог /etc/easy-rsa и редактируем файл vars. Можно оставить значения по умолчанию.

Генерируем сертификаты:
build-ca
build-dh
Создаем серверный ключ:
build-key-server server
Создаем клиентский ключ:
build-key client
Опционально, для создания ключей в хранилище PKCS12:
build-key-pkcs12 client
Создавать ключи необходимо для каждого клиента в отдельности. Например, у вас компьютер на работе и мобильный телефон — нужно каждому создать свой ключ. Иначе может возникнуть ситуация, когда соединение будет разрываться по непонятным причинам в случае установки одного ключа на разные устройства. А причина такого поведения проста — при обнаружении подключения клиента с другого устройства сервер разорвет предыдущее установленное подключение этого клиента.

Копируем сгененрированые файлы в папку /etc/openvpn:
cd /etc/easy-rsa/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn/
Теперь нам необходимо скопировать ключи и сертификаты клиентов из роутера на целевые устройства. Обычно для этих целей устанавливают в роутер SFTP сервер, но мы обойдемся без него. В прошивке уже реализована поддержка протокола SCP (Secure Copy Protocol) для передачи файлов. Возьмем бесплатный клиент WinSCP и подключимся к нашему роутеру, что бы скопировать необходимые файлы:


Нам понадобятся: ca.crt, dh1024.pem и пара сертификат-ключ для клиента client.crt, client.key. На скрине ниже для второго клиента так же скопированы gnex.crt и gnex.key:


Редактируем файл конфигурации OpenVPN


Запускаем mc и открываем в нем файл /etc/config/openvpn. Содержимое файла заменяем на следующее:

config 'openvpn' 'lan'
option 'enable' '1'
option 'port' '1194'
option 'proto' 'udp'
option 'dev' 'tun'
option 'ca' '/etc/easy-rsa/keys/ca.crt'
option 'cert' '/etc/easy-rsa/keys/server.crt'
option 'key' '/etc/easy-rsa/keys/server.key'
option 'dh' '/etc/easy-rsa/keys/dh1024.pem'
option 'ifconfig_pool_persist' '/tmp/ipp.txt'
option 'keepalive' '10 120'
option 'comp_lzo' 'no'
option 'persist_key' '1'
option 'persist_tun' '1'
option 'status' '/var/log/openvpn-status.log'
option 'verb' '3'
option 'server' '10.0.0.0 255.255.255.0'
option 'client_to_client' '1'
list 'push' 'redirect-gateway def1'
list 'push' 'dhcp-option DNS 192.168.1.1'
list 'push' 'route 192.168.1.0 255.255.255.0'
Этот конфиг создаст vpn-туннель и назначит клиенту IP адрес из сети 10.0.0.x с указанием в качестве DNS сервера адрес роутера на локальном интерфейсе (192.168.1.1). Сервер получит первый адрес из диапазона — 10.0.0.1. Команда 'redirect-gateway def1' заменит на клиенте шлюз по умолчанию на адрес vpn-сервера, благодаря чему весь трафик в Интернет пойдет через vpn-туннель. А команда 'route 192.168.1.0 255.255.255.0' создаст на клиенте маршрут в локальную сеть роутера.

Настраиваем Firewall для OpenVPN


Теперь нам нужно разрешить подключение снаружи (из Интернет) на WAN порт роутера по порту 1194. Для этого в конец файла /etc/config/firewall добавляем следующее:
config 'include'
option 'path' '/etc/firewall.user'
config 'rule' option 'target' 'ACCEPT'
option 'name' 'VPN'
option 'src' 'wan'
option 'proto' 'udp'
option 'dest_port' '1194'
А в файл /etc/firewall.user вставляем следующее:
iptables -t nat -A prerouting_wan -p udp --dport 1194 -j ACCEPT
iptables -A input_wan -p udp --dport 1194 -j ACCEPT
iptables -I INPUT -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT
Все готово для запуска. Запускаем OpenVPN-сервис командой /etc/init.d/openvpn start
Если запуск прошел успешно без сообщений об ошибках то можно добавить openvpn в автозагрузку командой /etc/init.d/openvpn enable


Конфигурирование клиентов OpenVPN


Для подключения нам понадобится конфигурационный файл. Создадим его и назовем client.ovpn
Внутрь файла вставим следующее, заменив SERVER-IP своим значением:
client tls-client
dev tun
proto udp
remote SERVER-IP 1194 # доступный из Интернет внешний IP-адрес роутера
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
dh dh1024.pem
persist-tun
persist-key
verb 3
 Файл client.ovpn вместе с сертификатами и ключами клиента нужно сложить в одну папку.

Использование клиента OpenVPN


Скачивем клиент для своей платформы со страницы проекта и устанавливаем. Рассмотрим вариант с Windows. Необходимо переложить все подготовленные файлы в папку \Program Files\OpenVPN\config  (если у вас Win32) и запустить OpenVPN клиент от имени Администратора если вы таковым не являетесь. Это необходимо для того, что бы OpenVPN клиент смог добавить необходимые маршруты в таблицу маршрутизации. Далее правый клик на значке OpenVPN в системном лотке и жмем «Подключится». В результате успешного подключения вы увидите следующее:


Теперь можно проверить как работает наш vpn-туннель поверх Интернет просто выполнив ping локального адреса роутера (при условии, что в сети из которой вы подключаетесь нет такого адреса):


Таким образом мы получили защищенное подключение к домашней сети. В следующей статье будут освещены особенности использования OpenVPN клиента для Android.