В сети много мануалов как поднять свой VPN-сервер на облаке Amazon AWS, но под unix-подобные системы, а вот как поднять его на Windows не рассматривается вовсе.
Поскольку мануалов я не нашел, захотелось разобраться самому и сделать связку Amazon EC2 based on Windows Server + OpenVPN + Android OpenVPN Client.
Поехали!
Статья не рассчитана на новичков, поэтому какие-то общие вопросы пропущены.
Описывать процесс регистрации на Amazon AWS не буду — это просто. Я раньше не регистрировался, поэтому был удивлен, что подтверждение приходит на номер телефона. Пишите рабочий номер. После прохождения регистрации идем в Dashboard https://console.aws.amazon.com/console/home
Топаем в меню Services → Compute → EC2 → Instances. Нажимаем Launch Instance чтобы открылся Wizard. В списке доступных AMI выбираем Microsoft Windows Server 2008 R2 Base — ami-59fc7439
На втором шаге выбираем доступный вариант t2.micro (Free tier) — его возможностей нам хватит с лихвой. Не спешим нажимать Launch — нажимаем Next:Configure Instance Details (предполагаю, что у вас по дефолту настроен VPC, есть дефолтные подсети и создан KeyPairs. Если ключи не созданы, то идём сначала в Dashboard → Key Pairs → Create. Ключ сохраняем себе куда-нибудь. К слову, я пересобрал с нуля VPC, оставив в нем только одну сеть 10.100.11.0/24).
Настройки оставляем по-умолчанию, а вот Auto-assign Public IP ставим Enable. Затем нажимаем на Preview and Launch. Ждем несколько минут, пока инстанст создается.
В Dashboard слева выбираем раздел Network & Security → Security Groups. Выбираем группу, которая ассоциирована с нашим инстансом. Снизу на вкладках Inbound,Outbound добавляем временно разрешения на пропуск всего трафика (alltraff).
На текущий момент там разрешен только RDP. Те, кто спешат, могут на обоих вкладках разрешить порт 1194 для OpenVPN и ICMP. Теперь, когда инстанс создан и работает, нам необходимо подключится к нему. Выбираем наш инстанс, нажимаем Connect.
Появляется окошко с предложением скачать RDP-файл и получить пароль. Скачиваем. Нажимаем Get Password, указываем наш файл ключа, дешифруем, получаем пароль. Первая половина дела завершена. Открываем RDP, соединяемся с хостом.
Перед нами — чистая ОС. Что нам нужно дальше?
1. Скачать Google Chrome, чтобы было удобнее проверять.
2. Скачать OpenVPN.
3. Поднять сервер с дефолтной конфигурацией.
4. Поднять NAT.
С первыми двумя пунктами проблем возникнуть не должно, разве что скачивать придется через IE. OpenVPN качаем с официального сайта (MSI), ставим с дефолтными настройками, ничего не меняем.
Через Chrome заходим на ipleak.net и проверяем свой IP. Он будет где-то в регионе США/Орегон. Как сделать сертификаты сервера и клиента для OpenVPN расписывать не буду, материалов достаточно по этой теме. Обязательно создаем PAM-файл (Диффи-Хеллман), без него сервер не запустится.
Ок, всё скачали, установили. На нашем сервере открываем Server Manager, идем в раздел Services. Находим службу OpenVPN Legacy Service, открываем её свойства — указываем Startup type: Automaticи запускаем службу. Это нужно, чтобы после рестарта нашего инстанса OpenVPN-сервер запускался сам.
Теперь открываем C:Program FilesOpenVPNconfig — туда скидываем ключи CA.key, server.key,ta.key и dh2048.pem и сертификаты CA и server. Открываем C:Program FilesOpenVPNsample-config и оттуда копируем файл server.ovpn в C:Program FilesOpenVPNconfig.
Перезаписываем содержимое like this:
port 1194
proto udp
dev tunca ca.crt
cert server.crt
key server.key
dh dh2048.pem
# виртуальная сеть нашего VPN
server 172.10.10.0 255.255.255.0ifconfig-pool-persist ipp.txt
keepalive 10 120tls-auth ta.key 0 # This file is secret
cipher AES-256-CBCmax-clients 100
persist-key
persist-tundev-node «HomeVPN»
#HomeVPN — это TAP, созданный при установке OpenVPN. Я его переименовал для удобства
#это нужно чтобы все клиенты могли маршрутизироваться без напрягов
push «route 0.0.0.0 0.0.0.0»#указываем свои DNS, но это не обязательно
push «dhcp-option DNS 8.8.8.8»
push «dhcp-option DNS 8.8.4.4»verb 3
explicit-exit-notify 1
Сохраняем.
Настройка сервера завершена. Выбираем server.ovpn, открываем контекстное меню, выбираем пункт Start OpenVPN on this config file.
После этого откроется терминал и пойдет процесс загрузки. Если все сделано правильно, то увидите в конце надпись Initialization Sequence Complete.
Теперь чтобы не было проблем с подключениями клиентов нужно сделать одну вещь (на выбор), либо в Windows Firewall пишем правила для пропуска трафика OpenVPN и разрешаем порт 1194, либо просто выключаем Firewall. Я выбрал второй пункт.
Теперь нужно создать конфигурацию клиента. Предполагается что на вашем клиенте (Android) установлен OpenVPN Client и в наличии все нужные сертификаты и ключи, в том числе клиентский.
Конфигурация клиента такая:
client
dev tun
proto udp
remote ххх-хх-ххх-ххх-ххх.us-west-2.compute.amazonaws.com 1194
resolv-retry infinite
route-method exe
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA1
verb 3
route 0.0.0.0 0.0.0.0 vpn_gateway
В OpenVPN для андройд импортируем конфигурацию. На вкладке Основные ставим тип аутентификации Сертификаты, т.к. пароля у нас в принципе нет. Проверяем вкладку Список серверов, должен быть указан ваш сервер Amazon, порт 1194 и тип UDP. На вкладке IP-адрес и DNS должна быть установлена опция Запрашивать параметры.
На вкладке Маршрутизация для IPv4 должна быть установлена опция Использовать маршрут по-умолчанию.
Сохраняем конфигурацию.
Пробуем подключиться к своему серверу. Если соединение не устанавливается, проверяем Network & Security → Security Groups и фаерволл. Если всё ОК, то появится надпись SUCCESS и вы получите какой-либо из IP сети VPN. В моем случае это 172.10.10.6/30.
На клиенте пробуем открыть какой-нибудь сайт… Соединение вроде есть, а сайты не открываются.
В чем же дело? Дело в NAT.
В сети есть мануалы, как настроить NAT на Amazon, с созданием дополнительного AMI, Internet Gate, IP Elastic и прочим фуфлом. Ничего этого делать не нужно.
Всё гораздо проще.
Возвращаемся на наш сервер, создаем роль Network Police and Access Services. В нее входит роль Routing and Remote Access. Открываем контекстное меню, выбираем Configure and Enable.
Выбираем последний пункт, чтобы создать свою конфигурацию. На следующем шаге выбираем два последних пункта, NAT и LAN routing.
После раскрываем роль Routing and Remote Access → IPv4 → NAT. Создаем интерфейс: LAN1 — тот, что смотрит в интернет. В свойствах ставим Public interface и Enable NAT on this interface. Открываем вкладку Address Pool. Нажимаем Add.
Тут нам нужно добавить IP-адрес нашей машины, не своей сети, а именно машины (ipconfig /all)
Напоминаю, что моя сеть 10.100.11.0/24, сеть VPN 172.10.10.0/24, адрес машины 10.100.11.20. Start address указываем 10.100.11.20 и End address указываем его же. Маска 255.255.255.0
Сохраняем.
Теперь в этом же режиме нажимаем кнопку Reserve Addresses. Нам нужно «соединить» адрес клиента VPN (он при подключении был 172.10.10.6/30) с адресом машины.
Нажимаем Add
Reserve this public IP ставим 10.100.11.20, а графой ниже пишем 172.10.10.6
Опцию Allow incoming не ставим.
Сохраняем.
Теперь остался последний шаг — в NAT добавляем еще один интерфейс — TAP. Я его назвал у себя HomeVPN. Для него настроек нет, он Private Interface. NAT для него не ставим.
Таким образом получилась «переадресация» из VPN в LAN: 172.10.10.6 → 10.100.11.20.
На клиенте делаем реконнект, ждем когда VPN-поднимется, открываем ipleak.net и смотрим.
IP-адрес на клиенте будет в регионе USA/Oregon, а IP-адрес WebRTC должен будет показать IP адрес нашего VPN-сервера, т.е. 172.10.10.6.
Если всё так, значит у вас получилось. Если не так, значит на каком-то шаге вы ошиблись, либо поспешили.
В заключении, идем в Dashboard → раздел Network & Security → Security Groups. Выбираем группу, которая ассоциирована с нашим инстансом. На вкладках Inbound,Outbound убираем разрешения на пропуск всего трафика. Оставляем RDP, и кто не сделал ранее, добавляем правила для порта 1194 и разрешаем ICMP.
За сим — всё. Благодарю.
P.S. На Windows-клиентах не тестировал, но думаю, всё должно быть также, как на android.
Автор: BlackJackBander