{{tag>networks networking network openvpn vpn}}

====== OpenVPN ======

По умолчанию, когда клиент OpenVPN активен, только сетевой трафик к и от сайта OpenVPN-сервера идет через VPN. Например, обычный просмотр веб-страниц будет осуществляться через прямое подключение в обход VPN.

  * [[http://lithium.opennet.ru/articles/openvpn/openvpn-howto.html#redirect|Документация]]

В некоторых случаях такое поведение может быть нежелательным -- у вас может возникнуть необходимость чтобы VPN-клиент туннелировал весь сетевой трафик через VPN, включая просмотр веб-страниц Интернета. Хотя этот тип VPN конфигурации приведет к потере производительности на клиенте, он дает администратору VPN более полный контроль над политиками безопасности когда клиент одновременно подключен и к Интернету и к VPN.

  * [[http://lithium.opennet.ru/articles/openvpn/openvpn-howto.html#redirect|Документация]]
===== Настройка клиента =====

  * apt-get install openvpn
  * настроить конфигурацию
  * настроить имя конфигурации NAME в /etc/default/openvpn

==== Конфигурация ====

nano /etc/openvpn/client.conf
<code>
port 1195
proto udp
dev tap
remote xxx.xxx.xxx.xxx
tls-client
ca ca.crt #эти файлы получить у админа vpn-сервера
cert clients.crt #эти файлы получить у админа vpn-сервера
key clients.key #эти файлы получить у админа vpn-сервера
ifconfig 10.3.0.54 255.255.255.0 # присвоенный ip для вашего сертификата
route 10.3.0.54 255.255.255.255 10.3.0.1 # это думаю понятно
route 192.168.25.0 255.255.255.0 10.3.0.1 # добавляем внутренние сети со стороны сервера (если нужны конечно)
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
pull
cipher DES-CBC
comp-lzo
</code>

===== Настройка сервера =====

  * aptitude install openvpn
  * cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
  * nano /etc/openvpn/easy-rsa/2.0/vars

Зададим размер ключа (чем больше, тем лучше и тем медленнее будет работать, ну и не рекомендую ставить 4096 например, поту что build-dh потом будет выполняться несколько часов):

  export KEY_SIZE=1024
  
Зададим время, через которое понадобится обновить ключи:

  export KEY_EXPIRE=365
  
Зададим параметры генерации SSL сертификата:

  export KEY_COUNTRY="RU"
  export KEY_PROVINCE="SPB"
  export KEY_CITY="SaintPetersburg"
  export KEY_ORG="Home"
  export KEY_EMAIL="postmaster@example.com"
  
Загрузим все переменные:

  # cd /etc/openvpn/easy-rsa/2.0/
  # . ./vars
  
Эта команда удаляет все сертификаты, которые были сгенерированы ранее (ну вдруг это не первая попытка):

  # . ./clean-all
  
Создаём центр сертификации. Это очень важный файл и крайне рекомендуется сохранить получившиеся файлы ещё где-нибудь. С помощью центра сертификации производится подписывание генерируемых сертификатов и подключится с сертификатом от другого центра не получится, даже если у него будут одинаковые параметры генерации.

<code>
# . ./build-ca 
Generating a 1024 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) [RU]:
State or Province Name (full name) [SPB]:
Locality Name (eg, city) [SaintPetersburg]:
Organization Name (eg, company) [Home]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [output-meta]:openvpn.local
Name []:Nikita Menkovich
Email Address [postmaster@example.com]:
</code>

Создаём сертификат сервера, с его помощью будет производится проверка, что сервер это тот именно сервер.

<code>
# . ./build-key-server server
Generating a 1024 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) [RU]:
State or Province Name (full name) [SPB]:
Locality Name (eg, city) [SaintPetersburg]:
Organization Name (eg, company) [Home]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:server.openvpn.local
Name []:server.openvpn.local
Email Address [postmaster@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'SPB'
localityName          :PRINTABLE:'SaintPetersburg'
organizationName      :PRINTABLE:'Home'
commonName            :PRINTABLE:'server.openvpn.local'
name                  :PRINTABLE:'server.openvpn.local'
emailAddress          :IA5STRING:'postmaster@example.com'
Certificate is to be certified until Aug 19 10:34:03 2013 GMT (365 days)
Sign the certificate? [y/n]:y
</code>

Далее необходимо сгенерировать параметры Диффи-Хеллмана, это займёт очень много времени если у вас не 1024, а 4096 бит (у меня заняло около двух часов), сходите попейте чаю, можете даже на обед сходить:

<code>
# . ./build-dh 
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.........+..........................................................................................+.............................................+.......................+....................+.....+..+.................++*++*++*
</code>

Сделаем конфигурационный файл:

  # zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
  # vim /etc/openvpn/server.conf
  
Раскомментируем эти строчки, a.b.c.d заменим на IP адрес, который висит на интерфейсе:

  ;local a.b.c.d
  ;push "redirect-gateway def1 bypass-dhcp"
  ;push "dhcp-option DNS 208.67.222.222"
  ;push "dhcp-option DNS 208.67.220.220"

DNS серверы можете указать свои. Опция redirect-gateway def1 указывает на то, что весь трафик после подключения должен идти через VPN.

Должен получится такой файл:
<code>
# egrep -v '^;|^#|^$' /etc/openvpn/server.conf

local a.b.c.d
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
</code>

Перезапустим openvpn подключение server (файл же мы назвали server.conf, так что можно легко делать несколько подключений).

  # invoke-rc.d openvpn restart server
  
Теперь настроим перенаправление запросов из нашего тунеля в сеть:
<code>
# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
# iptables -A FORWARD -j REJECT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
</code>

Разрешим доступ по udp к порту 1194:

<code>
# iptables -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
</code>

Сохраняем их и настраиваем автозапуск:
<code>
# iptables-save > /etc/iptables.up.rules
# cat /etc/network/if-up.d/iptables 
#!/bin/sh
iptables-restore < /etc/iptables.up.rules
# chmod u+x /etc/network/if-up.d/iptables
</code>