Блог о Gentoo и около-линуксовым штукам

20 августа 2015 г.

OpenVPN на OpenWRT + клиент Android

01:39 Опубликовал Дмитрий Исаенко 2 коммент.
В сегодняшней статье поговорим о OpenVPN. Я собираюсь в очередной раз пересказать давно прописаные мануалы по развёртке и настройке этого сервиса.
Для начала зайдём на наш маршрутизатор и установим на нём необходимые пакеты:
opkg install openvpn-openssl openvpn-easy-rsa
Для управления из Luci также можно установить поддержку:
opkg install luci-app-openvpn
Перейдём в каталог /etc/easy-rsa и отредактируем файл vars
# cd /etc/easy-rsa
# vi vars
Тут можно настроить параметры генерации сертефикатов. Например, если мы хотим, чтобы наш сертефикат не истекал как можно дольше, следует закомментировать следующие строки.
#export CA_EXPIRE=3650
#export KEY_EXPIRE=3650
Также стоит уделить внимание настройкам "принадлежности" сертефиката. Приведённые ниже поля имеют произвольный формат:
export KEY_COUNTRY="страна"
export KEY_PROVINCE="регион"
export KEY_CITY="Город"
export KEY_ORG="Организация"
export KEY_EMAIL="em@il"
export KEY_OU="подразделение"
Теперь сгенерируем сертефикат. На все предложенные вопросы можно пронажимать enter, но обязательно стоит указать 'Common Name' для нашего сертефиката.
# build-ca
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/easy-rsa/keys
Generating a 2048 bit RSA private key
...........................+++
..+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [страна]:
State or Province Name (full name) [регион]:
Locality Name (eg, city) [Город]:
Organization Name (eg, company) [Организация]:
Organizational Unit Name (eg, section) [подразделение]:
Common Name (eg, your name or your server's hostname) []:ca-srv
Name [EasyRSA]:
Email Address [em@il]:
Если что-то пошло не так, можно воспользоваться утилитой clean-all, которая "почистит" директорию /etc/easy-rsa/keys.
Cоздадим файл с параметрами для алгоритма Диффи-Хеллмана. Это займёт какое-то время.
# build-dh
Сгенерируем ключ сервера:
# build-key-server server
В процессе, как и ранее, оставляем основную часть значений по-умолчанию. В Common Name я вписал то же имя, что и ранее. В конце на предлжение подписи сертефиката ответьте "y".
# build-key-server server
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/easy-rsa/keys
Generating a 2048 bit RSA private key
..........+++
.............................+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [страна]:
State or Province Name (full name) [регион]:
Locality Name (eg, city) [Город]:
Organization Name (eg, company) [Организация]:
Organizational Unit Name (eg, section) [подразделение]:
Common Name (eg, your name or your server's hostname) []:ca-srv
Name [EasyRSA]:
Email Address [em@il]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'страна'
stateOrProvinceName   :PRINTABLE:'регион'
localityName          :PRINTABLE:'Город'
organizationName      :PRINTABLE:'Организация'
organizationalUnitName:PRINTABLE:'workplace'
commonName            :PRINTABLE:'ca-srv'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'test-data'
Certificate is to be certified until Aug 14 01:49:57 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Так как мы будем использовать наш маршрутизатор в качестве сервера, скопируем сгенерированные файлы в директорию /etc/openvpn.
# cd keys/
# cp ca.crt dh2048.pem server.crt server.key /etc/openvpn

Сгенерируем ключи для клиента.
# build-key client_1
Аналогичным образом можно сгенерировать ключ PKCS#12.
# build-key-pkcs12 client_1
Процедура создания аналогична той, которая была при создании ключей сервера с той лишь разницей, что мною был использован другой Common Name.
Теперь мы получили все необходимые для клиента файлы. Чуть позже мы к ним обязательно вернёмся, а пока поправим конфигурационный файл. Вот пример для UCI:
# cat /etc/config/openvpn
config openvpn 'vpn'
        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/dh2048.pem'
        option ifconfig_pool_persist '/tmp/ipp.txt'
        option keepalive '10 120'
        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' # это внутренний адрес openvpn
        option client_to_client '1'
        option push 'redirect-gateway def1'
        list push 'dhcp-option DNS 192.168.1.1'
        list push 'route 192.168.1.0 255.255.255.0'
        option enabled '1'
Обратите внимание на отсутствие строки
option 'comp_lzo' 'no'
В противном случае (если вы не планируете использовать компрессию трафика) вы получите ошибку "TUN write error: write_some: invalid argument"

Без использования UCI конфигурационный файл должен выглядеть так:
# cat /etc/openvpn/openvpn.conf
mode server
tls-server

### Параметры сети
port 1194
proto udp
dev tun

### Файлы сертефикатов и ключи
ca /etc/easy-rsa/keys/ca.crt
cert /etc/easy-rsa/keys/server.crt
key /etc/easy-rsa/keys/server.key
dh /etc/easy-rsa/keys/dh1024.pem

client-to-client  # даёт возможность клиентам видеть друг-друга
server 10.0.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.1.1" # Тут должен быть адрес машрутизатора в локальной сети
push "route 192.168.1.0 255.255.255.0" # Измените эти настройки для своей сети

### (опционально) включение компрессии траффика
#comp-lzo

persist-key
persist-tun 

verb 3
keepalive 10 120
log-append /var/log/openvpn/openvpn.log



Настроим firewall.
Откроем порт 1194:
cat /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'
Добавим правила для интерфейса tun0
iptables -t nat -A prerouting_wan_rule -p udp --dport 1194 -j ACCEPT
iptables -A input_wan_rule -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
Запустим и добавим наш сервер в автозагрузку:
/etc/init.d/openvpn start
/etc/init.d/openvpn enable

Android
Перейдём к настройкам на клиентской стороне. Нам понадобятся следующие файлы:
  • ca.crt
  • client.crt
  • client.key
  • client.ovpn    //иногда этот файл упоменают как client.conf

Если с первыми тремя всё более или менее понятно (они лежат в директории /etc/easy-rsa/keys), то последний вызывает вопросы. Его следует создать вручную, указав внутри адрес удалённого сервера и расположение файлов. Ниже приведён пример такого файла:
# vim client.ovpn
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

persist-tun
persist-key
verb 3
Мне нужно было лишь настроить OpenVPN на Android, поэтому я скопировал все эти файлы в отдельную папку на карте памяти (/storage/extSdCard/ovpn).
Когда файлы скопированы, установим приложение "OpenVPN Connect". Откроем его, и импортируем в наши настройки. Далее нажмём кнопку "Connect".


Когда система спросит разрешения на подключение, нажимаем ОК. Теперь VPN соединение установлено.

Такая инструкция в целом должна работать, но у меня андроид совершенно не хотел видеть DNS за пределами локальной сети. Я поискал в интернете, и оказалось, что такая проблема есть у многих пользователей Samsung с Android 5.0 и выше. Тогда я добавил гугловый DNS в качестве дополнительного в настройки сервера, и всё заработало.
# vim /etc/config/openvpn
list push 'dhcp-option DNS 8.8.8.8'
Надеюсь эта статья помогла вам разобраться в механике работы OpenVPN. На этом у меня всё.

Ссылки:
http://wiki.openwrt.org/inbox/vpn.howto
https://www.youtube.com/watch?v=MyuzeNk0Pwk

2 комментария:

  1. cd keys/
    cp ca.crt dh2048.pem server.crt server.key /etc/openvpn

    cp: can't stat 'ca.crt': No such file or directory
    cp: can't stat 'dh2048.pem': No such file or directory
    cp: can't stat 'server.crt': No such file or directory
    cp: can't stat 'server.key': No such file or directory

    ОтветитьУдалить
  2. Решение проблемы:

    cp /etc/easy-rsa/keys/server.crt /etc/easy-rsa/keys/server.key /etc/easy-rsa/keys/dh2048.pem /etc/openvpn

    ОтветитьУдалить