К основному контенту

Делаем себе бесплатный VPN на Amazon EC2

Читать этот пост в Telegraph. Другие посты в канале в Telegram.

Кто только не расписывал уже пошаговые инструкции по этой теме. Однако, время идёт, ПО меняется, инструкции нуждаются в обновлении, а люди в современной России всё больше нуждаются в применении VPN.

Я собираюсь описать все шаги для создания бесплатного сервера на Amazon EC2 с операционной системой Linux и необходимые команды для настройки VPN сервера на нём. Чтобы не повторяться о деталях, которые были много раз описаны на русскоязычных и англоязычных ресурсах, по ходу статьи я просто приведу целую кипу ссылок, где можно почерпнуть необходимую информацию, а где информация устарела - опишу подробнее что нужно сдеать. В итоге, сервер будет доступен для вас из любой точки планеты, с любой операционной системы, и бесплатно (с определёнными ограничениями по трафику).

Шаг первый - Регистрируемся на Amazon AWS

Нужно зайти на сайт https://aws.amazon.com/ru и сразу перейти к Регистрации, нажав одноимённую кнопку. При регистрации вам предстоит ввести базовую информацию о себе на английском языке (или латинице) и, помимо прочего, ввести данные о пластиковой карте. Карта нужна для съёма денег в случае, если вы превысили пороговые значения трафика, предоставляемого бесплатно. Сервис выполнит проверку её работоспособности сняв 1 доллар, который позже вернут вам обратно.

Так же не стоит пугаться того, что подтверждение регистрации производится голосом по телефону (вам на экран высветится PIN-код, который надо будет ввести во время звонка) или текстом по SMS. Я обычно пользуюсь первым способом.

После того, как регистрация пройдет, вам придётся подождать около 1 часа (может быть и до суток, но это редкость) до того, как консоль управления вашими серверами станет вам доступна.

 

 

Шаг второй - Выбор бесплатного сервера

Попав в консоль управления Amazon AWS вам нужно перейти в панель управления облачными серверами EC2. Для этого можно вбить название в поиске и перейти по приведенной ссылке. Далее, нужно нажать кнопку Launch Instance, которая приведёт вас в пошаговый визард.

На первом шаге вы увидите список доступных ОС, под которыми будут надписи вроде "Free tier eligible" (можно сразу отфильтровать их галочкой "Free tier only"), что означает, что для этих ОС доступны бесплатные конфигурации.

Выбирайте Ubuntu (нажав Select) и переходите к выбору инстанса. Понятно, что бесплатно доступные сервера являются не очень производительными, но для нужд VPN нам хватит. Выбираем тот, под которым написано "Free tier eligible".

3й, 4й и 5й шаги можно пропустить (воспользуётесь этой статьёй, если хотите в них разобраться детальнее), а на 6-м шаге предлагается настроить межсетевой экран безопасности. По умолчанию там открыт на доступ только TCP порт 22 для службы SSH, через которую вы и будете заходить на свой сервер для выполнения команд, установок, настройки. Нажав Add Rule в настройках межсетевого экрана нужно добавить правила разрешения выполнения входящих соединений на TCP и UDP порты 1194 для программы OpenVPN, через которую вы и сможете подключать себе VPN .

На этом этапе не обязательно расширять список портов, это можно сделать и позже, главное не забыть.

На последнем шаге Review выполняется перепроверка настроек и в итоге запуск сервера кнопкой Launch. Тут тоже придётся немного подождать.

Теперь для входа на сервер переходим в Консоль Управления EC2 на сайте Amazon и там жмём кнопку Connect. В диалоге будет описано что необходимо для соединения. Вам просто нужно скачать файл пароля *.pem, а также скопировать имя сервера. Далее, переходим в папку, где лежит файл пароля и коннектимся на наш Amazon-сервер с помощью SSH командой из консоли:

$> ssh -Xi MyPasswordFile.pem ubuntu@ec2-52-19-149-87.eu-central-1.compute.amazonaws.com

...где MyPasswordFile.pem - имя файла пароля, а вместо моего адреса ubuntu@ec2-52-19-149-87.eu-central-1.compute.amazonaws.com вам нужно ввести свой.

 

 

Шаг третий - Настройка VPN на сервере

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

Попав на сервер, первое что нам необходимо, это установить необходимое ПО для VPN и для генерации сертификатов безопасности - мы будем использовать OpenVPN и easy-rsa. Итак, инсталлируем указанные пакеты:

$> sudo su

$> apt-get install openvpn

$> apt-get install easy-rsa

Всё было бы просто, если бы не мир Linux :D. Раньше утилита easy-rsa входила в OpenVPN, но начиная с версии 2.3 эту утилиту из пакета "выпилили", поэтому придется скачать и собрать её самостоятельно следующими командами:

$> cd /tmp

$> wget https://github.com/OpenVPN/easy-rsa/archive/master.zip

$> apt-get install unzip

$> unzip master.zip

$> cd easy-rsa-master

$> ./build/build-dist.sh

$> tar xvzf ./EasyRSA-git-development.tgz

$> cd EasyRSA-git-development

Далее, переходим в папку с готовыми исполняемыми файлами easy-rsa и создадим сертификат удостоверяющего центра  CA и ключ. Нас попросят ввести даные о сертификате. Тут выбирать вам, можете ввести любые фиктивные данные, а можете реальные.

$> сd /usr/share/easy-rsa

$> source ./vars

$> ./build-ca

$> ./build-key-server server

Опять таки, о том, что такое удостоверяющий центр, корневой сертификат, процесс генерации сертификата и о прочем интересующийся читатель может узнать по ссылкам.

Сгенерируем ключи для шифрования SSL/TSL соединения и создадим ключи для себя:

$> ./build-dh

$> ./build-key myname

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

$> ./easyrsa init-pki

$> ./easyrsa build-ca

$> ./easyrsa build-server-full server

$> ./easyrsa build-client-full client1

$> ./easyrsa gen-dh

Переносим полученные ключи и сертификаты в каталог программы OpenVPN (/etc/openvpn/), откуда она легко сможет их использовать:

$> mv ./pki/dh.pem /etc/openvpn/dh.pem

$> mv ./pki/private/client1.key /etc/openvpn/

$> mv ./pki/private/server.key /etc/openvpn/

$> mv ./pki/ca.crt /etc/openvpn/

$> mv ./pki/issued/client1.crt /etc/openvpn/

$> mv ./pki/issued/server.crt /etc/openvpn/

В папке …/keys теперь есть все необходимые ключи, для авторизации нам нужны только myname.crt, myname.key (свои сертификат с ключом) и ca.crt (сертификат удостоверяющего центра CA). Создадим и отредактируем вашим любимым текстовым редактором конфиг /etc/openvpn/tun.conf:

 server  
 port 1194  
 proto tcp  
 dev tun  
 ca      /usr/share/easy-rsa/keys/ca.crt  
 cert    /usr/share/easy-rsa/keys/server.crt  
 key     /usr/share/easy-rsa/keys/server.key  
 dh      /usr/share/easy-rsa/keys/dh2048.pem  
 server 192.168.1.0 255.255.255.0  
 ifconfig-pool-persist ipp.txt  
 push "dhcp-option DNS 8.8.8.8"  
 push "redirect-gateway def1 bypass-dhcp"  
 keepalive 10 120  
 comp-lzo  
 persist-key  
 persist-tun  
 status /var/log/openvpn-status.log  
 log /var/log/openvpn.log  
 verb 4  

 

 

Шаг четвёртый - проверочный запуск

Попробуем запустить OpenVPN. При запуске от вас будет требоваться ввести пароль.

$> service openvpn start

Проверяем:

$> netstat -tuwpan

Сервер должен слушать порт 1194. Если это не так, курим /var/log/syslog.

Если всё успешно, то мы сможем подключиться к серверу, используя скачанные выше сертификаты и ключи. А если нет, то в логах скорее всего будет что-то вроде:

Note: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory

Это означает, что нам не включили tun модуль (обратитесь в техподдержку). А если всё хорошо, мы сможем пинговать VPS по Public IP, указанному в Консоли Управления EC2, но интернета ещё не будет, для этого нам нужно настроить NAT.

 

 

Шаг пятый - настройка NAT

Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…

$> iptables -F

$> iptables -t nat -F

$> iptables -t mangle -F

Тут указываются настройки ваших сетевых интерфейсов:

$> nano /etc/network/interfaces

Перезапускаем сетевые сервисы:

$> service network restart

Разрешаем IP-форвардинг в системе:

$> echo '1' > /proc/sys/net/ipv4/ip_forward

$> echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

Перезагружаем конфиг:

$> sudo sysctl -p

NAT настраивается при помощи iptables. Сначала отредактируем его настройки в файле /etc/sysconfig/iptables-config, включив параметры IPTABLES_SAVE_ON_STOP="yes" и IPTABLES_SAVE_ON_RESTART="yes", чтобы не приходилось менять настройки при каждой перезагрузке:

$> nano /etc/sysconfig/iptables-config

Смотрим список сетевых интерфейсов в системе:

$> ifconfig

В списке должен быть стандартный Ethernet интерфейс eth0, Loopback интерфейс lo, а так же tun0.

Разрешаем IP-форвардинг в системе для eth0:

$> sudo touch /etc/sysconfig/iptables

$> sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Чтобы наше правило не пропало после перезагрузки, нужно добавить его сразу в конфиг /etc/rc.local после строки "exit 0":

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Если вы выбрали другую подсеть, то укажите её вместо 192.168.1.0/24. Теперь можно сохранить настройки iptables:

$> iptables-save > /etc/iptables.rules

В /etc/rc.local:

$> iptables-restore < /etc/iptables.rules

Поставить на автозагрузку openvpn и перезагрузить openvpn сервер:

$> update-rc.d openvpn defaults

$> service openvpn restart

Проверяем, что в файле /etc/network/interfaces есть строчка:

$> pre-up iptables-restore < /etc/iptables.rules

Убеждаемся, что все нужные сервисы запустятся после перезагрузки, если такая потребуется:

$> chkconfig named on

$> chkconfig iptables on

$> chkconfig openvpn on

Перезапускаем/запускаем сервисы:

$> service iptables restart

$> service named start

$> service openvpn start

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

$> exit

На своей клиентской машине, не важно с какой ОС, необходимо создать текстовый файл для конфигурирования клиента OpenVpn, вида:

      client  
      dev tun  
      proto tcp  
      remote ec2-52-19-149-87.eu-central-1.compute.amazonaws.com 1194  
      resolv-retry infinite  
      nobind  
      comp-lzo  
      persist-key  
      persist-tun  
      ca "X:\\SecretStorage\\ca.crt"  
      cert "X:\\SecretStorage\\myname.crt"  
      key "X:\\SecretStorage\\myname.key"  
      verb 3  

В этом конфиге вам нужно только аккуратно прописать свои пути к файлам сертификатов и ключа, а также заменить адрес сервера на свой.

 

 

Подключаемся к VPN серверу с Windows

На свой компьютер скачиваем и устанавливаем OpenVPN клиент.

В папке C:/Program Files/OpenVpn/ создаём файл client.ovpn и любым редактором вставляем текст конфигурации клиента, созданный по примеру выше.

Запускаем OpenVPN клиента - возле часиков появится иконка серого мониторчика. Правой кнопкой на иконку мониторчика и выбираем Connect. Надо чуть-чуть подождать и когда мониторчик загорится зелёным цветом - это означает успешное подключение. В обратном случае, он может гореть жёлтым или серым, в этом случае нужно смотреть в логи и проверять там наличие ошибок.

После успешного соединения идём в браузер и проверяем, что недоступное вновь нам доступно :).

 

 

Подключаемся к VPN серверу с MacOS

Скачиваем и устанавливаем Home brew. После чего устанавливаем openvpn:

$> brew install openvpn

Переходим в папку с openvpn (версия может поменяться на момент чтения):

$> cd /usr/local/Cellar/openvpn/2.3.11/sbin

В папке создаём файл client.conf и вставляем текст конфигурации клиента, созданный по примеру выше. В итоге, выполняем подключение:

$> sudo ./openvpn --config client.conf

Теперь идём в браузер и проверяем, что недоступное вновь нам доступно :).

 

 

Полезные ссылки:

Создание «островка сетевой свободы» на основе VPS за 30 минут

Установки и настройка OpenVPN в Ubuntu Linux за 5 минут

Основы iptables на примере Debian глазами младенца

Практика: настраиваем VPN, работающий через Amazon EC2

Бесплатный VPN от Amazon

 

 

Комментарии

Популярные сообщения из этого блога

В помощь программисту: инструкции по работе с Ubuntu сервером

Программистам чаще приходится писать код и заботиться о его чистоте, правильных абстракциях в коде, корректных зависимостях и прочих сложностях профессии. При этом, настройка и обслуживание серверов, хоть и связанная область - это отдельный навык, необходимый не каждому, и помнить о котором в деталях сложно. Поэтому, я делаю ряд микро-инструкций, которыми буду пользоваться и сам, когда необходимо. Это не статьи, а пошаговые помощники, которые я буду дополнять и наполнять по мере надобности. Делаем бесплатный VPN на Amazon EC2 Создание ключей SSH Подключение к серверу через SSH Передача файла с Linux сервера наWindows машину Делаем VPN сервер на Ubuntu 20.04 используя OpenVPN и EasyRSA  Отображение GUI с Linux сервера на Windows машине

Выбираем все плюсы из трех парадигм Entity Framework

Между парадигмами разработки с Entity Framework (Code First, Model First, Database First) я выбрал промежуточную, потому что ни одна меня не устраивала полностью. В Code First меня радуют чистые POCO классы, но не устраивает невозможность моделирования базы. В Database First и Model First мне не нравится генерация EDMX и другого всего лишнего. Таким образом, я нашел для себя такое решение: 1. Я моделирую схему в любой удобной программе (тут любая внешняя программа моделирования, генерирующая SQL Server-совместимые скрипты генерации базы) Рис. Смоделированная схема БД. 2. Создаю базу в SQL Management Studio 3. Делаю Reverse Engineering базы в POCO классы (как в Code First) с помощью плагина Entity Framework Power Tools Рис. Установленный плагин для Reverse Engineer. Рис. Вот так делается Reverse Engineer базы данных в POCO классы. Рис. Результат генерации POCO классов на основе базы данных: папочка Models с готовым контекстом, классами объектов и маппинг-классами.