Стартиране на VPN сървър зад NAT на доставчик

Статия за това как успях да стартирам VPN сървър зад NAT на домашен доставчик (без бял IP адрес). Веднага да ви кажа: производителността на тази реализация директно зависи от вида на NAT, използван от вашия доставчик, както и от рутера.
И така, имах нужда да се свържа от моя смартфон с Android към домашния си компютър, и двете устройства са свързани към интернет чрез NAT на доставчика, плюс компютърът е свързан чрез домашен рутер, който също има NAT връзки.
Класическата схема, използваща нает VPS / VDS с бял IP адрес, както и наемането на бял IP адрес от доставчика, не беше разгледана по няколко причини.
Като се вземат предвид опит от минали статии, след като проведе няколко експеримента със STUN и NAT на доставчици. Реших да направя малък експеримент, като изпълних командата на домашен рутер, работещ с OpenWRT фърмуер:

$ stun stun.sipnet.ru

получих резултата:

STUN клиент версия 0.97
Основно: независимо картографиране, независим филтър, произволен порт, ще се закрепи
връщаната стойност е 0x000002

Буквален превод:
Independent Mapping - независимо показване
Independent Filter - независим филтър
random port - произволен порт
ще фиби - ще има фиби
След като изпълних подобна команда на моя компютър, получих:

STUN клиент версия 0.97
Основно: независимо картографиране, зависим от порта филтър, произволен порт, ще се закрепи
връщаната стойност е 0x000006

Port Dependent Filter - зависим от порта филтър
Разликата в резултатите от изхода на командите показва, че домашният рутер е направил "своя принос" в процеса на излъчване на пакети от Интернет, това се проявява във факта, че когато командата е изпълнена на компютъра:

stun stun.sipnet.ru -p 11111 -v

получих резултата:

...
MappedAddress = XX.1XX.1X4.2XX:4398
...

в този момент UDP сесия е отворена за известно време, ако в този момент е изпратена UDP заявка (например: netcat XX.1XX.1X4.2XX 4398 -u), тогава заявката дойде до домашния рутер, който беше потвърдено от работещ на него TCPDump, но заявката не е стигнала до компютъра - IPtables като NAT транслатор на рутера го е изпуснал.
Стартиране на VPN сървър зад NAT на доставчик
Но самият факт на преминаване на UDP заявка през NAT на доставчика даде надежда за успех. Тъй като рутерът е в моята юрисдикция, реших проблема, като пренасочих UDP / 11111 порта към компютъра:

iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX

Така получих възможността да инициирам UDP сесия и да получавам заявки от интернет от всеки IP адрес. В този момент стартирах OpenVPN-сървър (след като го конфигурирах), слушайки UDP/11111 порт, посочих външния IP адрес и порт (XX.1XX.1X4.2XX:4398) на смартфона и успешно се свързах от смартфона към компютър. Но при тази реализация възникна проблем, беше необходимо по някакъв начин да се поддържа UDP сесията, докато OpenVPN клиентът се свърже със сървъра, не ми хареса опцията за периодично стартиране на STUN клиента - не исках да зареждам STUN сървъри напразно.
Също така обърна внимание на записа "ще фиби - ще има фиби“, този режим

Hairpinning позволява на една машина в локална мрежа зад NAT да има достъп до друга машина в същата мрежа на външния адрес на рутера.

Стартиране на VPN сървър зад NAT на доставчик
В резултат на това реших проблема с поддържането на UDP сесия просто - стартирах клиента на същия компютър със сървъра.
Работеше така:

  • стартира STUN клиент с локален порт 11111
  • получен отговор с външен IP адрес и порт XX.1XX.1X4.2XX:4398
  • изпратени данни с външен IP адрес и порт към пощата (възможна е всяка друга услуга), конфигурирана на смартфона
  • стартира OpenVPN сървър на компютър, слушащ UDP/11111 порт
  • стартира OpenVPN клиент на компютър, указващ XX.1XX.1X4.2XX:4398 за свързване
  • по всяко време стартира OpenVPN клиента на смартфона, като посочи IP адреса и порта (в моя случай IP адресът не се промени), за да се свържете

Стартиране на VPN сървър зад NAT на доставчик
Така получих възможност да се свържа с компютъра си от смартфон. Тази реализация ви позволява да свържете всеки OpenVPN клиент.

Практика

Вие ще трябва:

# apt install openvpn stun-client sendemail

След като написахме няколко скрипта, няколко конфигурационни файла, генерирайки необходимите сертификати (тъй като клиентът на смартфона работи само със сертификати), получихме обичайната реализация на OpenVPN сървъра.

Основен скрипт на компютъра

# cat vpn11.sh

#!/bin/bash
until [[ -n "$iftosrv" ]]; do echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`; sleep 5; done
ABSOLUTE_FILENAME=`readlink -f "$0"`
DIR=`dirname "$ABSOLUTE_FILENAME"`
localport=11111
until [[ $a ]]; do
	address=`stun stun.sipnet.ru -v -p $localport 2>&1 | grep "MappedAddress" | sort | uniq | head -n 1 | sed 's/:/ /g' | awk '{print $3" "$4}'`
        ip=`echo "$address" | awk {'print $1'}`
        port=`echo "$address" | awk {'print $2'}`
	srv="openvpn --config $DIR/server.conf --port $localport --daemon"
	$srv
	echo "$(date) Сервер запущен с внешним адресом $ip:$port"
	$DIR/sendemail.sh "OpenVPN-Server" "$ip:$port"
	sleep 1
	openvpn --config $DIR/client.conf --remote $ip --port $port
	echo "$(date) Cоединение клиента с сервером разорвано"
	for i in `ps xa | grep "$srv" | grep -v grep | awk '{print $1}'`; do
		kill $i && echo "$(date) Завершен процесс сервера $i ($srv)"
		done
	echo "Жду 15 сек"
	sleep 15
	done

Скрипт за изпращане на имейл:

# cat sendemail.sh 

#!/bin/bash
from="От кого"
pass="Пароль"
to="Кому"
theme="$1"
message="$2"
server="smtp.yandex.ru:587"
sendEmail -o tls=yes -f "$from" -t "$to" -s "$server" -xu "$from" -xp "$pass" -u "$theme" -m "$message"

Конфигурационен файл на сървъра:

# cat server.conf

proto udp
dev tun
ca      /home/vpn11-srv/ca.crt
cert    /home/vpn11-srv/server.crt
key     /home/vpn11-srv/server.key
dh      /home/vpn11-srv/dh2048.pem
server 10.2.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
tls-server
tls-auth /home/vpn11-srv/ta.key 0
tls-timeout 60
auth    SHA256
cipher  AES-256-CBC
client-to-client
keepalive 10 30
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-server.log
verb 3
mute 20

Конфигурационен файл на клиента:

# cat client.conf

client
dev tun
proto udp
ca      "/home/vpn11-srv/ca.crt"
cert    "/home/vpn11-srv/client1.crt"
key     "/home/vpn11-srv/client1.key"
tls-client
tls-auth "/home/vpn11-srv/ta.key" 1
auth SHA256
cipher AES-256-CBC
auth-nocache
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-clent.log
verb 3
mute 20
ping 10
ping-exit 30

Сертификатите са генерирани съгласно тази статия.
Изпълнение на скрипта:

# ./vpn11.sh

Първо да го направим изпълним

# chmod +x vpn11.sh

От страна на смартфона

Чрез инсталиране на приложението Отворете VPN за Android, копиране на конфигурационния файл, сертификати и конфигуриране, се оказа така:
Проверявам имейл на моя смартфонСтартиране на VPN сървър зад NAT на доставчик
Редактирам номера на порта в настройкитеСтартиране на VPN сървър зад NAT на доставчик
Стартирам клиента и се свързвамСтартиране на VPN сървър зад NAT на доставчик

В процеса на писане на статията прехвърлих конфигурацията от компютъра на Raspberry Pi 3 и се опитах да стартирам всичко на LTE модем, но не се получи! резултат от командата

# stun stun.ekiga.net -p 11111

STUN клиент версия 0.97
Основно: независимо картографиране, зависим от порта филтър, произволен порт, ще се закрепи
връщаната стойност е 0x000006

значение Порт зависим филтър попречи на стартирането на системата.
Но домашният доставчик остави системата да работи на Raspberry Pi 3 без никакви проблеми.
Във връзка с уеб камера, с VLC за
създаване на RTSP поток от уеб камера

$ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep

и VLC на смартфон за гледане (поток rtsp://10.2.0.1:8554/), не се оказа лоша система за видеонаблюдение от разстояние, можете също да настроите Samba, да маршрутизирате трафика през VPN, да управлявате дистанционно компютър и още много ...

Продукция

Както показа практиката, за да организирате VPN сървър, можете да направите без външен IP адрес, за който трябва да платите, както и за нает VPS / VDS. Но всичко зависи от доставчика. Разбира се, исках да получа повече информация за различните доставчици и видове използвани NAT, но това е само началото ...
Спасибо за внимание!

Източник: www.habr.com

Добавяне на нов коментар