Получаем белый IP пробросом портов с VPS на свой домашний сервер.
Чтобы ваш сайт или сервис был публичным (видимым глобально) в интернете, ему нужен белый (публичный) IP-адрес. Например, у вас есть ftp- или веб-сервер с сайтом дома, и вы хотите, чтобы он был виден любому пользователю интернета. Или вы хотите поиграть в игры и хотите дать доступ другу к вашему игровому серверу. Но как быть, если ваш провайдер вам выдал серый (непубличный IP) и нет возможности получить белый IP-адрес?
Замечание: «серые» IP-адреса легко отличить по принадлежности к следующим диапазонам:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Если у вас IP одного из этих типов, то ваш компьютер недоступен снаружи локальной сети вашего провайдера. Как же быть, чтобы увидеть его снаружи? Ответ прост: получить белый IP у вашего провайдера. Это, конечно, стоит дополнительных денег. И зачастую, многие провайдеры не выдают простым пользователям таких адресов. Примерами могут быть большинство операторов сотовых сетей, да и многие обычные проводные провайдеры тоже.
А вот для хостеров сайтов выдача белых IP-адресов является обычным делом. Есть обычные хостеры, у которых на веб-серверах размещается большое количество сайтов (shared hostings или виртуальные хостинги). На таких хостингах на одном IP хостится много сайтов.
Обычно, для того, чтобы заиметь отдельный IP под свой сервер, надо было арендовать выделенный сервер. Но последнее время, все стало проще. Можно арендовать не отдельный физический сервер, а виртуальную машину, или VPS/VDS (virtual private server / virtual dedicated server). VPS с минимальной конфигурацией обычно стоит в районе $2-$10 в месяц, и доступны обычному пользователю.
Так что, заполучить себе личную VPS-ку с выделенным белым IP достаточно просто и дешево. Поэтому возникает идея, а как бы IP от VPS-ки использовать для открытия доступа к домашнему серверу с серым IP?
Оказывается, такое можно сделать. Достаточно установить на VPS-ке сервер VPN и чтобы домашний сервер соединялся с VPN-сервером на VPS-ке, и далее, просто настроить проброс портов с VPS-ки на домашний сервер. Тогда домашний сервер как бы, «прячется» за VPS-кой. Коннектясь к порту, скажем 80 (www), пользователь перенаправляется соответствующий порт на домашнем сервере. оба сервера доступны друг другу напрямую, входя в общую сеть VPN. VPN нужен для обеспечения прямой связи между сервером и VPS (иначе, домашний сервер будет иметь отдельную от VPS адресацию, и с VPS до сервера не будет прямого коннекта).
Самый ходовой и дешевый вариант для ОС VPS-ки это Linux. Поэтому будем считать, что у нас линуксовая VPS-ка. Для проброса портов будем использовать iptables, а в качестве VPN будем использовать openvpn.
Хорошим бюджетным хостингом VPS-ок является hostsailor.com. Он, также, принимает большое количество платежных систем, включая криптовалюты. Это очень важно в наше время, когда пользователей из России отключили от зарубежных платежных платформ. А вот отключить от криптовалют они вряд ли смогут.
Качаем скрипт openvpn-install. Он автоматически установит OpenVPN, создаст конфиги и сертификаты.
# cd /root
# wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
Welcome to this OpenVPN road warrior installer!
Which IPv4 address should be used?
1) 173.249.34.22
2) 10.8.100.1
3) 10.8.0.2
IPv4 address [1]:
Which protocol should OpenVPN use?
1) UDP (recommended)
2) TCP
Protocol [1]: 2
What port should OpenVPN listen to?
Port [1194]: 443
Select a DNS server for the clients:
1) Current system resolvers
2) Google
3) 1.1.1.1
4) OpenDNS
5) Quad9
6) AdGuard
DNS server [1]: 2
Enter a name for the first client:
Name [client]:
Выбираем внешний IP сервера, протокол (TСP), порт (443) и DNS Google. Порт 443 обычно используется для https, поэтому логично использовать этот же порт для маскировки любого другого шифрованного трафика (например, VPN). Обычно этот порт не закрыт на файрволле системным администратором, т.к. это бы поломало просмотр вер-страниц.
Будут сгенерированы сертификаты ca (центра авторизации), cert (собственно сертификат сервера) и key (ключ сертификата сервера). И будет добавлен клиент client с конфигом client.ovpn. Главное что делает скрипт openvpn-install.sh, это генерит все сертификаты, как надо. Нам не нужно это делать вручную. А конфиг сервера мы заменим на свой:
port 443
proto tcp
dev tun
tls-server
server 10.8.0.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
push redirect-gateway
push "route 10.8.0.0 255.255.255.0"
duplicate-cn
#comp-lzo
mssfix 0
auth-nocache
auth SHA512
cipher AES-256-CBC
client-config-dir /etc/openvpn/ccd
topology subnet
client-to-client
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
verb 3
Строчка topology subnet задает топологию «сеть», т.е. будет сеть 10.8.0.0/24, все IP в которой пингуют друг друга. Есть еще две других топологии, которые нам не подойдут, например, point-to-point, которая состоит из клиента и сервера, котрые пингуют друг друга, остальные клиенты не пингуются.
Строка client-config-dir задает директорию с конфигами для каждого отдельного клиента (каждый конфиг имеет имя, совпадающее с именем файла сертификата).
И строка client-to-client указывает, что клиенты могут связываться с друг другом. Без этой опции клиенты друг друга не пингуют, а могут пинговать только сервер VPN.
Теперь создадим файл /etc/openvpn/ccd/client (по имени дефолтного клиента, который создал скрипт) содержащий всего одну строчку:
ifconfig-push 10.8.0.2 255.255.255.0
Эта строка назначит клиенту client постоянный IP адрес: 10.8.0.2. Сервер же всегда будет иметь IP 10.8.0.1 (адрес и маска подсети задается строкой "server 10.8.0.0 255.255.255.0" в конфиге сервера).
Теперь можно скопировать конфиг клиента client.ovpn на домашний сервер (который у нас будет клиентом VPN) и убедиться, что связь есть, пропинговав сервер и клиент друг с друга.
Если домашний сервер тоже работает под ОС Linux, то можно скопировать client.ovpn в /etc/openvpn/client.conf, прописать запуск в systemd и запустить:
# systemctl enable openvpn@client
# systemctl start openvpn@client
Клиент должен подняться. Пропингуем сервер:
# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=63 time=65.1 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=63 time=63.5 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=63 time=57.6 ms
64 bytes from 10.8.0.1: icmp_seq=4 ttl=63 time=55.8 ms
Все ОК, связь есть. Теперь надо настроить собственно, портмаппинг. Портмаппинг настраивается аналогично статье «Скрытие одного сервера за другим при помощи портмаппинга«, надо только IP 1.1.1.1:8080 заменить на 10.8.0.2:8080, и 2.2.2.2:80 на белый IP VPS-ки с сервером VPN и порт 80. (Замените порты 8080 и 80 на порты в вашем конкретном случае).
Все, можем пробовать коннектиться к <VPS IP>:80, должно работать.
Filed under: Linux,Open Source,Системное администрирование,Софт - @ 11.05.2022 17:13
Метки: comp, vpn vps portmap openvpn проброс