суббота, 14 ноября 2015 г.

Создаём приватную сеть с помощью OpenVPN

OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. С помощью OpenVPN можно создать локальную сеть между удалёнными офисами поверх Интернета, а также обходить различные блокировки сайтов. Предположим, в центральном офисе есть сервер, который соединён с базами данных, хранилищами данных и т.д. И нужно организовать доступ ко всему этому, для удалённых филиалов этого офиса, находящихся в разных городах. Не будем терять время, приступим.


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


Предположим, что сервер работает под управлением Debian 8. Ставим:

sudo apt install openvpn easy-rsa openssl

Подготавливаем каталог для сертификатов:

sudo mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
mv /etc/openvpn/easy-rsa/easy-rsa /etc/openvpn/easy-rsa/2.0
cd /etc/openvpn/easy-rsa/2.0

Редактируем переменные:

sudo nano vars

# По умолчанию здесь просто openssl, которого нет в директории, в результате чего мы получим ошибку, если не укажем существующий. Я выбрал последнюю версию. Указывается без расширения .conf.
export OPENSSL="openssl"

# В самом низу файла, заполняем информацию о сертификатах по умолчанию (ваши значения).
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Ваш регион"
export KEY_CITY="Ваш город"
export KEY_ORG="server"
export KEY_EMAIL="vash@email.tut"
export KEY_EMAIL=vash@email.tut
export KEY_CN=server
export KEY_NAME=server
export KEY_OU=server
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

#Добавить
export KEY_ALTNAMES="VPNsRUS"

Сохраняем. Инициируем переменные:

sudo source /vars

Очищаем от старых сертификатов каталог keys/server и создаём новый сертификат:

sudo /clean-all
sudo /build-ca

Генерируем сертификат сервера:

sudo ./build-key-server server

Генерируем сертификат клиента:

./build-key user

Генерируем ключ Диффи-Хеллмана:

sudo /build-dh

Генерируем ключ для TLS-аутентификации:

sudo openvpn --genkey --secret keys/ta.key

Копируем серверные ключи в каталог /etc/openvpn:

cd keys
cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Ключи user.crt, user.key, ca.crt и ta.key нужны OpenVPN-клиенту. Далее приступаем к настройке сервера. Копируем и распаковываем пример конфигурационного файла:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

Правим:

sudo nano /etc/openvpn/server.conf

port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 192.168.0.25 255.255.255.0 #IP-адрес сервера и маска подсети
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
tls-auth ta.key 0
cipher DES-EDE3-CBC


В данном конфиге указывается порт, протокол, тип соединения, а также сертификаты, задаются параметры VPN-сети, указывается файл в котором хранить параметры соединений (чтобы можно было их восстановить после переподключения клиента), задаются параметры поддержания соединения, включается сжатие передаваемых данных, даётся указание серверу при перезагрузке не подключаться к ресурсам которые могут быть недоступны из-за понижения привилегий, задаётся файл статуса (содержит информацию о подключенных клиентах), лог-файл и уровень подробности отладочной информации.
Если нужно больше отладочной информации, то для параметра verb можно установить значение вплоть до 9. В большинстве случаев вам должно хватить значения 5 или максимум 6. Также включаем TLS-шифрование.

Теперь перезапустите OpenVPN-сервер:

sudo systemctl restart openvpn

Настройка клиента.


Устанавливаем на клиентской машине:

sudo apt install openvpn openssl

Вышеупомянутые ключи скопируйте в директорию /etc/openvpn. Копируем пример конфига и распаковываем его:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Правим:

sudo nano /etc/openvpn/client.conf

client
dev tun
proto tcp
remote 192.168.0.25 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
ns-cert-type server
comp-lzo
log /var/log/openvpn.log
verb 3

tls-auth ta.key 1
cipher DES-EDE3-CBC


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

push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"


Открываем файл /etc/sysctl.conf, и меняем строку net.ipv4.ip_forward=0 на net.ipv4.ip_forward=1 и убираем решётку вначале. Сохраняем и применяем:

sudo sysctl -p

Теперь осталось создать правило для фаерволла, чтобы весь трафик маршрутизировался из локальной сети и сети провайдера в VPN-сеть и наоборот:

sudo apt install iptables-persistent
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Вот и всё. Вы можете также настроить VPN-подключение через Network Manager. Там вам потребуется указать адрес шлюза, а также путь к сертификатам


Клиенты OpenVPN доступны и для других ОС.

Ссылки:

Руководство (на русском).
Ещё пример настройки.
Настройка связки OpenVPN + прокси-сервер Squid

Комментариев нет:

Отправить комментарий