Водење на VPN сервер зад NAT на провајдерот

Статија за тоа како успеав да стартувам VPN сервер зад NAT на мојот домашен провајдер (без бела IP адреса). Веднаш да направам резервација: тоа перформансите на оваа имплементација директно зависи од типот на NAT што го користи вашиот провајдер, како и од рутерот.
Така, требаше да се поврзам од мојот Android смартфон со мојот домашен компјутер, двата уреди се поврзани на Интернет преку NAT-и на провајдерите, плус компјутерот е поврзан преку домашен рутер, кој исто така се поврзува со NAT.
Класичната шема со користење на изнајмен VPS/VDS со бела IP адреса, како и изнајмување бела IP адреса од провајдер, не беше разгледана од неколку причини.
Земајќи ги во предвид искуство од минатите статии, откако изврши неколку експерименти со STUN и NAT на давателите на услуги. Решив да направам мал експеримент со извршување на командата на домашен рутер со фирмвер OpenWRT:

$ stun stun.sipnet.ru

го доби резултатот:

STUN клиент верзија 0.97
Примарно: Независно мапирање, Независен филтер, случајна порта, ќе биде фиба
Повратната вредност е 0x000002

Буквален превод:
Независно мапирање - независно мапирање
Независен филтер - независен филтер
случајна порта - случајна порта
ќе фиба - ќе има фиба
Извршувајќи слична команда на мојот компјутер, добив:

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.
Го забележав и записот „ќе фиба - ќе има фиба“, овој режим

Косањето на косата овозможува една машина на локална мрежа зад 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

На страната на паметниот телефон

Со инсталирање на апликацијата OpenVPN за 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

Додадете коментар