В сегодняшней статье поговорим о 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оздадим файл с параметрами для алгоритма Диффи-Хеллмана. Это займёт какое-то время.
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:
Android
Когда файлы скопированы, установим приложение "OpenVPN Connect". Откроем его, и импортируем в наши настройки. Далее нажмём кнопку "Connect".
Такая инструкция в целом должна работать, но у меня андроид совершенно не хотел видеть DNS за пределами локальной сети. Я поискал в интернете, и оказалось, что такая проблема есть у многих пользователей Samsung с Android 5.0 и выше. Тогда я добавил гугловый DNS в качестве дополнительного в настройки сервера, и всё заработало.
Ссылки:
http://wiki.openwrt.org/inbox/vpn.howto
https://www.youtube.com/watch?v=MyuzeNk0Pwk
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
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
Решение проблемы:
ОтветитьУдалитьcp /etc/easy-rsa/keys/server.crt /etc/easy-rsa/keys/server.key /etc/easy-rsa/keys/dh2048.pem /etc/openvpn