VPN на своём сервере с IP адресом из США за 1$ в месяц
После этого коммента на меня подписалось 10 человек, так что пост специально для вас и для @bugagaggi, @Bs1234, @SvinkiPilki.
Дисклеймер:
-
Этот пост для тех, кто знает, зачем ему VPN на своём серваке. Если вас устраивает браузерное расширение, опера турбо и прочие способы, никто не заставляет вас платить за свой сервак и настраивать его.
-
Предполагается, что вы умеете пользоваться серваком на ubuntu на минимальном уровне и непонятные для себя вещи можете нагуглить сами.
-
Пост содержит ряд рискованных шагов, автор не несет ответственности за ваши действия с деньгами, вы всё делаете на свой страх и риск, перепроверяйте каждую операцию и не верьте наслово.
Этот пост - не совсем гайд, просто делюсь опытом на какие грабли наткнулся на своём пути. Так что будет многобуков.
Предыстория
Год назад, когда появились первые слухи о закрытии ютуба, мне захотелось сделать свой собственный сервак с VPN, чтобы иметь стабильный доступ к ютубу без ограничений. Браузерные расширения типа антизапрета конечно работали и работают до сих пор, но:
-
скорость там сильно хромает и бывает нестабильной. это - главная причина, мне всегда хотелось VPN, все мощности которого будут лично для меня, и его не придется делить с тысячами других юзеров;
-
когда придёт время, власти будут вырубать наиболее популярные решения, и такие расширения пойдут под нож первыми;
-
непонятно, что там с безопасностью.
Поэтому было решено пилить свой собственный сервак.
Был арендован самый дешевый VPS от FirstByte в Амстердаме, на него установлен Wireguard, всё работает, блокировки от РКН обходятся. Но быстро выяснилось, что кроме блокировок с нашей стороны есть ещё и ограничения на пользователей из РФ от западных компаний. Например, в этом были замечены https://redis.com и https://www.perforce.com/
Но как они определяют, что мы из России, если сервак в Нидерландах и, судя по сайту https://2ip.io/ru/privacy/ IP адрес тоже нидерландский? Знающие люди подсказали мне, что проверять надо не на 2ip, а тут:
А они показывают Россию. Выяснилось, что при проверке ip адреса через https://www.ripe.net/ можно установить владельца адреса - компанию firstbyte, и именно отсюда они знают, что мы из РФ. Сейчас, год спустя, при проверке firstbyte выходят ip адреса Cloudflare. Кроме того, здесь в комментарии #comment_269943379 человек пишет, что его VPN на VPS от firstbyte, расположенный в Финляндии, определяется как финский, так что, возможно, сейчас имеет смысл попробовать firstbyte, т.к. там доступны российские методы оплаты.
Тем не менее, год назад ничего этого не было, и передо мной встала задача найти VPS за рубежом и каким-то образом оплатить его из РФ.
Был найден хостинг в США - racknerd, который можно было оплатить через WebMoney. Оплата прошла, сервак в Ashburn (рядом с Вашингтоном), VPN работает, блокировок нет ни с нашей, ни с их стороны, скорость высокая, пинг так себе. Прекрасно.
Прошел год, неделю назад пришло время расплаты оплаты. Внезапно, WebMoney не принимается. Из доступных способов - только крипта. Спросил совета тут: Вопрос - как совершить оплату криптой? Кароче, как оказалось - ничего сложного в крипте нет, сервак в порядке, VPN будет работать ещё год, так что далее рассказываю как всё это делается.
Регистрация на хостинге и оплата VPS
Сначала регаемся на хостинге.
Кто хочет сказать "спасибо" за этот пост - вот моя реферал очка: https://my.racknerd.com/aff.php?aff=4692
Для идеологических противников рефералок - сюда: racknerd.com
Но не спешите покупать сервак - обычный тариф стоит $23 за год. Чтобы получить скидку, нужно тыкать на розовый баннер вверху "NEW YEAR 2023 DEALS", либо сразу переходить по ссылке https://www.racknerd.com/NewYear/
В принципе, если на нашей VPS будет только VPN, то подойдет любой тариф. Главное, что тут нас должно воловать - это ограничение трафика. Год назад я не знал, сколько моя семья потребляет трафика на инсту и прочие заблокированные сайты, и поэтому для подстраховки выбрал второй тариф. Теперь уже есть статистика и выяснилось, что мы редко выходим за пределы 100гб в месяц. Кароче, если вы не собираетесь качать торренты, то можно смело брать самый дешевый тариф и не париться. Таким образом, VPN на VPS в США обойдется нам дешевле чем в 1$ в месяц. По сравнению с тем что предлагают в других постах по 500р в месяц, это - вообще ни о чем.
Внимание: если хотите накатить ubuntu 22.04, рекомендуется взять тариф с 1гб ОЗУ. Если вас устраивает ubuntu 20.04, можно брать тариф с 512мб ОЗУ. Для наших целей никакой разницы, всё равно 20.04 будет поддерживаться аж до 2025г, а до него ещё дожить надо.
Выбираем в поле Operating System ubuntu 20.04. Локации без разницы, они близко друг к другу расположены и мало отличаются по пингу до РФ. Жмем Contunue.
На следующей странице жмем Checkout, заполняем данные о себе. Нужно ввести адрес проживания, и в этом месте я на всякий случай ввел фейковый адрес из США чтоб мой аккаунт не снесли за то что я из России. Возможно, так делать не следовало, но пока что проблем не было. Для генерации фейкового адреса можно воспользоваться онлайн-генераторами, например https://www.fakepersongenerator.com/Random/generate_address
В Payment Details выбираем Crypto (BTC, LTC, USDT) и переходим к оплате.
Обращаем внимание, что оплатить можно не всякой криптой, а только опделенными валютами в определенных сетях:
For crypto payments, we currently support Bitcoin network, Bitcoin Cash network, Litecoin network, Dogecoin network and ETH network (ERC20), Binance network is NOT supported.
Жмём Pay Now и нам предлагается одна из криптовалют на выбор. Я выбрал Litecoin (LTC) т.к. там наименьшие комиссии. Нам дают адрес крипто-кошелька, на котором ожидается перевод оплаты за хостинг. Нужно успеть совершить оплату за 2 часа.
Чтобы совершить оплату криптой, никаких терабайтов блокчейнов качать не нужно, и даже заводить свой крипто-кошелек нет необходимости, и тем более нет смысла регаться на крипто-бирже. Достаточно через обменник найти человека, которому мы на счет переводим рубли, а он по указанному адресу переводит крипту.
Существует множество разных обменников с разной репутацией и возможностями. Чтобы ориентироваться среди них, идём на агрегатор обменников (на пикабу этот домен запрещен, гуглите бэстчендж).
В левой колонке таблица, прокручиваем её до раздела "Интернет-банкинг", слева жмём кнопку Сбербанк RUB или выбираем свой банк. Справа выбираем Litecoin LTC.
Теперь в таблице справа отображаются подходящие нам обменники. Жмем вкладку "Калькулятор", переключаем в режим "Получаете", вставляем сюда ту сумму которую нам показала платёжка (на странице с адресом кошелька) и жмем "Рассчитать".
Теперь черным выделены те обменники, на которых можно такой обмен. Из предложенных выбираем один, ориентируемся в первую очередь на отзывы (крайний правый столбец) и на условия оплаты (круглешки в крайнем левом столбце):
Я обменивался через multichange, проблем не возникло. Для верификации попросили фото карты на фоне их сайта (с одной стороны, конечно). Вставляете сюда адрес LTC и точную сумму с сайта платёжки, они показывают реквизиты, скидываешь на них сумму в рублях, на указанный адрес приходит крипта.
Готово, VPS оплачен на год:
Настройка VPS
Далее жирным текстом указаны команды для выполнения в локальной консоли или на сервере.
Первым делом надо отключить авторизацию по логину и паролю, чтобы боты не сбрутили пароль и не проникли на сервак.
Сначала генерим у себя локально пару ssh ключей
ssh-keygen
Через консоль (на линуксе) или ssh-клиент putty (на винде) заходим по тому паролю, что нам предоставил хостер, где 123.123.123.123 - ip адрес VPS.
ssh root@123.123.123.123
Копируем публичный ключ на сервер (UPD: для пользователей Windows - смотрите пункт 2 в комментарии #comment_271568783)
ssh-copy-id root@123.123.123.123
Меняем настройки ssh
sudo nano /etc/ssh/sshd_config
Откроется текстовый редактор, в нём находим следующие строки и прописываем
Port 2342
PasswordAuthentication no
Вместо 2342- любой нестандартный номер порта по вашему усмотрению.
Сохраняем, выходим из текстового редактора.
Перезагружаем ssh сервис чтобы изменения вступили в силу
sudo service ssh restart
После этого для входа по ssh придется указывать порт ключом -p
ssh root@123.123.123.123 -p 2342
Обновляем сервер
apt update && apt upgrade -y
Далее, необходимо закрыть все порты, кроме тех что нам нужны. Для этого воспользуемся утилитой ufw. Будьте внимательны при использовании ufw, т.к. при первом запуске без настроек он блокирует вообще всё, и после выхода с сервера обратно мы залогиниться не сможем. Если таки это произошло - не беда, идём в панель управления сервера и делаем сброс, но лучше чтобы всё получилось с первого раза.
Устанавливаем ufw
apt install ufw
Открываем конфиг ufw в текстовом редакторе
nano /etc/ufw/before.rules
Прокручиваем до раздела "ok icmp codes for INPUT"
Закомментируем строку "-A ufw-before-input -p icmp —icmp-type echo-request -j ACCEPT"
И добавляем туда новую строку
-A ufw-before-input -p icmp —icmp-type echo-request -j DROP
Это нужно для успешного прохождения теста Определение туннеля (двусторонний пинг) https://2ip.io/ru/privacy/
(не помню, на кой ляд оно нужно, но я зачем-то сохранил это у себя в заметках)
Открываем порты:
ufw allow 80
ufw allow 443
ufw allow 2342
ufw allow 54321
2342- ранее мы его указывали как порт для ssh
54321 - любой нестандартный порт для wireguard (понадобится позднее)
Перезапускаем ufw для применения изменений
ufw disable && ufw enable
Включаем автоматические обновления безопасности.
apt-get install unattended-upgrades
nano /etc/apt/apt.conf.d/20auto-upgrades
В конфиге прописываем следующие опции
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
Выбор софта для VPN
Существует множество различных технологий для реализации VPN сетей. Наиболее популярными являются OpenVPN и Wireguard. Вместе с OpenVPN можно сделать Shadowsocks для маскировки трафика под https, если требуется обход блокировок VPN. Есть также готовый софт, который всё сделает для вас, и автоматически выбирает наиболее подходящие технологии - SoftEther, Amnezia и тд. Но т.к. у нас пока никакие технологии не запрещены, я взял самую простую и быструю - Wireguard. Когда её заблокируют, тогда можно будет накатить что-нибудь посложнее. Вы можете выбрать любую другую технологию, наиболее простая в установке и использовании это, наверное, Amnezia VPN, но сам я не пробовал.
Установка Wireguard на сервере
Для упрощения установки воспользуемся готовым скриптом отсюда:
https://github.com/angristan/wireguard-install
Конечно же, готовые скрипты - это всегда источник уязвимости, надо проверять что в них написано, и тд.
Устанавливаем качалку
apt install -y curl
Качаем скрипт
curl -O https://raw.githubusercontent.com/angristan/wireguard-instal...
Делаем его исполняемым
chmod +x wireguard-install.sh
Запускаем автоматическую установку. В процессе нас спросят, через какой порт будет работать wireguard - пишем тот что ранее открыли в ufw (в примере он указан как 54321). Также нам предложат прописать адреса днс, если хотите adguard - оставьте дефолтные, в ином случае пропишите адреса cloudflare 1.1.1.1 и гугла 8.8.8.8.
Далее нужно добавить новых юзеров, отдельно для каждого устройства на котором собираетесь использовать VPN. Повторно запускаем ту же команду. Для смартфона будет показан qr-код, который надо отсканировать с приложения, для ПК будет сгенерирован конфиг, который необходимо будет скачать к себе.
Настройка Wireguard на клиенте
Эту тему уже миллиард раз везде разбирали, не буду повторяться и сошлюсь на этот пост, тут в конце есть настройка на винде и смартфонах, со скриншотами: VPN на собственном сервере без настройки
Для тех кто сам разберется - ссылка на официальный сайт: https://www.wireguard.com/install/
А вот чего я нигде не видел - как сделать автоматическое переключение на wireguard только для заблокированных сайтов, а на обычные сайты ходить напрямую, чтобы не дергать постоянно переключатель подключений.
Описываю как сделать это на линуксе.
Итак, вот мы создали на серваке юзера и получили его конфиг, допустим WireGuard.conf
Добавляем его в систему
sudo nmcli connection import type wireguard file WireGuard.conf
Отключаем автозапуск
sudo nmcli connection modify WireGuard connection.autoconnect no
Далее воспользуемся утилитой Wireproxy.
https://github.com/pufferffish/wireproxy
Она поднимает локальный socks5-proxy и весь трафик оттуда перенаправляет на VPN. Таким образом в системе VPN выключен, но локально в этом прокси он включен.
Остаётся лишь подключиться к этому socks5-proxy и направить в него трафик.
Устанавливаем wireproxy в дистр любым удобным способом.
Создаём конфиг wireproxy.conf со следующим содержимым.
В первой строке
WGConfig = WireGuard.conf
Это мы ссылаемся на конфиг wireguard нашего юзера.
[TCPClientTunnel]
BindAddress = 127.0.0.1:25565
Target = localhost:25565
[TCPServerTunnel]
ListenPort = 3422
Target = localhost:25545
[Socks5]
BindAddress = 127.0.0.1:25344
Единственное, что нас тут интересует - адрес и порт в последней строке.
Запускаем wireproxy через консоль. Можно добавить его в автозапуск и он будет работать в фоне.
Ставим в браузере расширение SwitchyOmega
https://github.com/FelisCatus/SwitchyOmega
Для хрома: https://chrome.google.com/webstore/detail/proxy-switchyomega...
Для лисы: https://addons.mozilla.org/en-US/firefox/addon/switchyomega/
Создаём там New Profile - Proxy profile - прописываем имя - Create.
В настройках Protocol - SOCKS5, сервер 127.0.0.1, порт 25344 (всё как в конфиге).
Применяем изменения кнопкой Apply Changes.
Теперь, при заходе на любой сайт у расширения появится счетчик ошибок загрузки. Жмем на кнопку расширения, а там - N failed resources.
Затем выбираем, какие сайты должны всегда ходить по VPN:
Перезагружаем страницу (иногда необходимо несколько раз перезагрузить) и сайт прогрузится через VPN.
Работает идеально, за исключением инсты и фейсбука. Там лучше не добавлять условия в это расширение, а переключать VPN на уровне системы.
Заключение
Гайд получился объемным, я мог что-то упустить, так что задавайте вопросы, делитесь своим опытом, что можно улучшить, дополнить, оптимизировать и тд.
Душно? Да, душно, сложно, много жопочасов уходит на настройку всего этого. Зато оно своё, работает как часы, за год использования вообще не потребовало внимания и не падало, скорость максимальная. Кароче, лично я доволен.
Дополнение из комментария
Я один из тех, кто решил воспользоваться гайдом автора и в итоге настроил VPN, выскажу некоторые замечания, т.к в итоге получилось у меня само собой далеко не с первого раза.
1. С регистрацией на racknerd.com и оплатой криптой проблем не возникло
2. Первые проблемы начались с переносом ключей на VPS, тот способ который описал автор под винду не работает. А я больше чем уверен что у большинства людей кого заинтересует этот гайд – винда. От себя добавлю, просто выполните ssh-keygen, перейдите в c:\Users\ЮЗЕРНЕЙМ\.ssh\ откройте блокнотом файл id_rsa.pub, скопируйте все содержимое в буфер. Далее подключитесь на сервер как написано у автора и в папке root создайте папку .ssh (mkdir .ssh), перейдите в каталог (cd .ssh), создайте файл authorized_keys (touch authorized_keys), откройте его sudo nano authorized, вставьте содержимое из буфера обмена, сохраните и закройте. Готово. Можно подключатся без пароля. (ПРАВА НА КАТАЛОГ .ssh и файл должны быть ОБЯЗАТЕЛЬНО 0600)
3. Не спешите отключать вход по паролю, еще успеете его выключить когда все будет работать, он может еще понадобится для скачивая файлов конфигурации через WinSCP.
4. Самый мощный фейл ганда (на мой взгляд) заключается в том, что если все делать по пунктам то все встанет жестким колом на пункте с установкой curl. А все, потому что мы закрыли все порты и включили файрволл ufw, а в таком режиме он не может установить curl. Отключите на время ufw командой sudo ufw disable (в конце включите sudo ufw enable)
5. Если возникнут проблемы со скачиванием конфигурационных файлов с сервера на свой комп, нет желания заморачиваться со скачиванием файла через командную строку. А там придется попотеть, то можно воспользоваться программой WinSCP, или перенести содержимое руками через буфер обмена (есть вариант хапануть лишнего), или через qr-код.
6. А так в целом все работает, прикладываю замеры скорости.
Для работы настройки VPN клиента (установка nwcli)
What is nmcli?
nmcli stands for Network Management Command-Line Interface, and is a tool for managing the NetworkManager application and reporting on the status of the network. It can be utilized as a substitution for nm-applet or other similar graphical clients. nmcli is used to display, create, delete, edit, activate, deactivate network connections, and control and display network device status.
Typical uses include:
- Scripts: Utilize NetworkManager via nmcli rather than managing network connections manually. nmcli supports a terse output format that is healthier fitted to the script process. Note that NetworkManager can even execute scripts, referred to as “dispatcher scripts,” responding to network events.
- Servers, headless machines, and terminals: nmcli tool can be used to control NetworkManager without a graphical user interface, including creating, deleting, editing, starting and stopping network connections as well as viewing network status.
Prerequisites
Before every installation, apply all available upgrades of all packages.
apt-get update && apt-get upgrade
Installation
After the system is updated, we will run this command to install nmcli.
apt-get install network-manager
Press “y” when prompted with “Do you want to continue? [Y/n]”. After the installation has completed, we can start the Network Manager with this command.
systemctl start NetworkManager.service
Next, we will enable Network Manager to start on system boot with using the systemctl command below.
systemctl enable NetworkManager.service
We will cover more of the basic nmcli commands further along in this article, but the complete reference can be found in the nmcli man page using the “man nmcli” command.
Syntax
nmcli [option] [command] [arguments]
Commands
The main nmcli command are broken down into several objects and subcommands.
- General
- Networking
- RTC (Radio Transmission Control)
- Activity Monitoring
- Connection Management
- Device Management
- Secret Agent
General Commands
Here is a list of the general commands available for nmcli.
- Status - This shows the state of the network manager. We can check our network devices status using this command
- Hostname - This command views and modifies the server hostname.
- Permissions - This command shows the permissions of a user to enact a procedure.
- Logging - This command views and modifies logging levels.
Syntax
The specific syntax of these commands are shown below.
nmcli device status
nmcli general hostname
nmcli general permissions
nmcli general logging
Networking
Syntax
nmcli networking { on | off | connectivity } [ARGUMENTS...]
The networking commands use nmcli to check network status, or to enable or disable networking components.
on, off - This command enables or disables various network connections via nmcli.
Connectivity [check] - nmcli gets the connection state and retains individual network configuration types as connections which contain the associated info on each kind of network connection.
nmcli connection { show | up | down | modify | add | edit | clone | delete | monitor | reload | load | import | export } [ARGUMENTS...]
RTC (Radio Transmission Control)
The RTC or radio command show the status of the radio switches, and enable and disable the switches.
Syntax
nmcli radio { all | wifi | wwan } [ARGUMENTS…]
Activity Monitoring
The monitor command observes changes in the connectivity state of a device or in the connection profiles.
Syntax
nmcli monitor
Connection Management
The connection command in nmcli stores the network configurations as "connections", that depicts how to create or connect to a network.
Syntax
nmcli connection { show | up | down | modify | add | edit | clone | delete | monitor | reload | load | import | export } [ARGUMENTS...]
Device Management
The device command shows and manages all the network interfaces.
Syntax
nmcli device { status | show | set | connect | reapply | modify | disconnect | delete | monitor | wifi | lldp } [ARGUMENTS…]
Secret Agent
The agent command runs as secret agent, or polkit agent. If the command keeps nmcli running and if a password is required asks the user for it.
Syntax
nmcli agent { secret | polkit | all }
Configuration
The nmcli configuration profiles are located in /etc/NetworkManager/system-connections/. Since that folder is empty by default after install, we will need to create a connection profile file called “dhcp-home” and assign it to the device ens33. Since there is only one network card, we will have to switch connection profiles.
root@ubuntu: nmcli con add type ethernet con-name dhcp-home ifname ens33 ipv4.method auto
Connection 'dhcp-home' (0611c2c8-83ad-40f7-b7bb-b57668af203d) successfully added.
We can look into that configuration profile with this command.
cat /etc/NetworkManager/system-connectionsdhcp-home
Notice that the values we configured via the nmcli command like id, type, interface-name, ipv4 method. This type of connection profile will use an IP address provided by the dhcp server.
[connection]
id=dhcp-home
uuid=0611c2c8-83ad-40f7-b7bb-b57668af203d
type=ethernet
interface-name=ens33
permissions=
[ethernet]
mac-address-blacklist=
[ipv4]
dns-search=
method=auto
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto
Now, to activate new connection profile run this command.
root@ubuntu:~# nmcli con up dhcp-home
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/1)
Here, we explain how to create a connection profile with a dynamic IP address acquired from the dhcp server. Now let’s see how to create a connection profile with a static IP address. The profile will be named static-home, and it will be assigned to the same ens33 device.
root@ubuntu:~# nmcli con add type ethernet con-name static-home ifname ens33 ip4 192.168.253.12/24 gw4 192.168.253.2
Connection 'static-home' (b7e6531d-b183-4791-84c1-9de0c249b583) successfully added.
Now, let’s modify the static-home connection profile and add the DNS server with “nmcli con mod static-home ipv4.dns 8.8.8.8” and check the configuration file again. This time we will grep for dns from the configuration file.
root@ubuntu:~# nmcli con mod static-home ipv4.dns 8.8.8.8
root@ubuntu:~# grep dns /etc/NetworkManager/system-connections/static-home
dns=8.8.8.8;
We can check if the connection profile with the static IP is configured correctly by pinging liquidweb.com or google.com.
root@ubuntu:~# ping liquidweb.com
PING liquidweb.com (67.225.187.61) 56(84) bytes of data.
64 bytes from 67.225.187.61 (67.225.187.61): icmp_seq=1 ttl=128 time=142 ms
64 bytes from 67.225.187.61 (67.225.187.61): icmp_seq=2 ttl=128 time=142 ms
PING google.com (216.58.201.110) 56(84) bytes of data.
64 bytes from prg03s02-in-f14.1e100.net (216.58.201.110): icmp_seq=1 ttl=128 time=25.3 ms
Please note that the IP address and gateway properties have different names when we add or modify a connection. When we are adding connections, we would use “ip4” and “gw4”, after they are modified, you should use “ipv4” and “gwv4”.
To confirm that the IP address of ens33 device is the same as in the configuration file, we can run “ip addr show | grep ens33” and compare it to the address value in the configuration profile file.
In this tutorial, we explained what nmcli is, and how to install and configure it. This covers the basics of NetworkManager or nmcli. I strongly encourage our readers to check “man nmcli” for a more in-depth review of its usage.
Our Support Teams are filled with talented Linux technicians and System administrators who have intimate knowledge of multiple web hosting technologies, especially those discussed in this article.
If you are a Fully Managed VPS server, Cloud Dedicated, Private Cloud powered by VMware, Private Parent server or a Dedicated server owner and you are uncomfortable with performing any of the steps outlined, we can be reached via phone @800.580.4985, a chat or support ticket to assist you with this process.









