Artikulli për mënyrën se si arrita të lidhem VPN nën NAT-in e ofruesit të internetit të shtëpisë (pa një IP të bardhë). Të them të drejtën: funksionaliteti i kësaj realizimi varet drejtpërdrejt nga lloji i NAT që përdor ofruesi juaj, si dhe nga routeri.
Kështu, ndjeva nevojën për t'u lidhur nga smartfoni im Android me kompjuterin e shtëpisë, të dy pajisjet janë të lidhura me internetin përmes NAT-eve të ofruesit, plus kompjuteri është lidhur përmes një routeri shtëpiak, i cili gjithashtu NAT-izonte lidhjet.
Skema klasike me përdorimin e një VPS/VDS të njëjtë me një IP të bardhë, si dhe marrja e një IP të bardhë nga ofruesi nuk u mor në konsideratë për disa arsye.
Duke marrë parasysh ekspertizën e artikujve të mëparshëm, duke realizuar disa eksperimente me STUN dhe NAT-e të ofruesve. Vendosa të bëj një eksperiment të vogël, duke ekzekutuar komandën në routerin tim të shtëpisë që punon me firmuerin OpenWRT:
$ stun stun.sipnet.rumora rezultatin:
Versioni i klientit STUN 0.97
Primar: Hartim të Pavarur, Filtrim të Pavarur, port të rastësishëm, do të kthehet
Vlera e kthimit është 0x000002
Përkthimi i drejtpërdrejtë:
Hartim i Pavarur — hartim i pavarur
Filtrim i Pavarur — filtrimi i pavarur
port të rastësishëm — port i rastësishëm
do të kthehet — do të jetë kënd
Duke ekzekutuar një komandë të ngjashme në PC-në time, mora:
Versioni i klientit STUN 0.97
Primar: Hartim i Pavarur, Filtri i Varësisë së Portit, port i rastësishëm, do të hairpin
Vlera e kthimit është 0x000006
Filtri i Varur nga Porti — filtrimi i varur nga porti
Dallimi në rezultatet e komandave tregonte se routeri shtëpiak kishte 'kontributin' e tij në procesin e translacionit të paketimeve nga interneti, kjo u shfaq në atë që, kur ekzekutova komandën në kompjuter:
stun stun.sipnet.ru -p 11111 -vmora rezultatin:
…
MappedAddress = XX.1XX.1X4.2XX:4398
…
në këtë moment hapej për një kohë të shkurtër një seancë UDP, nëse në atë moment dërgoja një kërkesë UDP (p.sh.: netcat XX.1XX.1X4.2XX 4398 -u), kërkesa arrinte në routerin e shtëpisë, çka u konfirmua nga TCPDump që ishte aktivizuar në të, por kërkesa nuk arrinte në kompjuter — IPtables si një translator NAT në router e bllokonte atë.

Por vetë fakti i kalimit të kërkesës UDP përmes NAT-it të ofruesit ofronte shpresa për sukses. Pasi routeri ishte në juridiksionin tim, e zgjida problemin duke redirektuar portin UDP/11111 në kompjuter:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXXKështu fitova mundësinë për të inicuar një seancë UDP dhe të merrja kërkesa nga interneti me çdo IP adresë. Në këtë moment aktivizova OpenVPN-serverin (pas konfigurove paraprakisht) duke dëgjuar portin UDP/11111, specifikova në smartfonin tim IP-në e jashtme dhe portin (XX.1XX.1X4.2XX:4398) dhe u lidha me sukses nga smartfoni me kompjuterin. Por në këtë realizim lindi një problem, duhej ndonjë mënyrë për të mbajtur seancën UDP deri në momentin e lidhjes së klientit OpenVPN me serverin, varianti me aktivizimin periodik të klientit STUN nuk më pëlqente — nuk doja ta ngarkoja kot serverët STUN.
Gjithashtu vura re regjistrimin «do të kthehet — do të jetë kënd«, ky mod
Hairpinning lejon një makinë në rrjetin lokal nën NAT të qaset në një tjetër makinë në të njëjtin rrjet përmes adresës jashtme të routerit.

Në fund, problemin e ruajtjes së seancës UDP e zgjodha thjesht — aktivizova klientin në të njëjtin kompjuter me serverin.
Kjo funksiononte kështu:
- aktivizova klientin STUN me portin lokal 11111
- mora përgjigje me IP-në e jashtme dhe portin XX.1XX.1X4.2XX:4398
- dërgova të dhënat me IP-në e jashtme dhe portin në email (mund të përdoret çdo shërbim tjetër), i konfiguruar në smartfonin tim
- aktivizova OpenVPN-serverin në kompjuter duke dëgjuar portin UDP/11111
- aktivizova klientin OpenVPN në kompjuter duke specifikuar XX.1XX.1X4.2XX:4398 për lidhjen
- në çdo moment aktivizova klientin OpenVPN në smartfon duke specifikuar adresën IP dhe portin (në rastin tim, adresa IP nuk ndryshonte) për lidhjen

Kështu fitova mundësinë për të u lidhur me kompjuterin tim nga smartfoni. Kjo realizim lejon lidhjen e çdo klienti OpenVPN.
Praktika
Do të nevojitet:
# apt install openvpn stun-client sendemailPas shkruarjes disa skriptash, disa skedarë konfigurimi, dhe gjenerimit të certifikatave të nevojshme (pasi klienti në smartfon funksionon vetëm me certifikata) u krijua një realizim i zakonshëm i serverit OpenVPN.
Skripta kryesore në kompjuter
# 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
doneSkripta e dërgimit të të dhënave me email:
# 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"Skedari i konfigurimit të serverit:
# cat server.confproto 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 20Skedari i konfigurimit të klientit:
# cat client.confclient
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-client.log
verb 3
mute 20
ping 10
ping-exit 30Generimi i certifikatave u bë sipas këtë artikull.
Aktivizimi i skriptës:
# ./vpn11.shDuke e bërë atë fillimisht ekzekutues
# chmod +x vpn11.shNë anën e smartfonit
Duke instaluar aplikacionin OpenVPN për Android, duke kopjova konfiguracionin, certifikatat dhe e konfiguroni, rezultati ishte kështu:
Po kontrolloj postën në smartphone
Po ndryshoj numrin e portit në cilësimet
Po filloj klientin dhe lidhem
Në procesin e shkrimit të artikullit kam transferuar konfigurimin nga kompjuteri në Raspberry Pi 3 dhe provova ta nisja gjithçka në një modem LTE, por nuk arrita! Rezultati i komandës
# stun stun.ekiga.net -p 11111Versioni i klientit STUN 0.97
Primar: Hartim i Pavarur, Filtri i Varësisë së Portit, port i rastësishëm, do të hairpin
Vlera e kthimit është 0x000006
vlerën Filtri në varësi të portit nuk e lejohet sistemin të nisë.
Por ofruesi i internetit në shtëpi e lejoj sistemin të nisë pa probleme në Raspberry Pi 3.
Në kombinim me kamerën e internetit, me VLC për
krijimin e një rrjedhe RTSP nga kamera e internetit
$ 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-keepdhe VLC në smartphone për të parë (rrjedha rtsp://10.2.0.1:8554/), krijova një sistem të kënaqshëm të videovëzhgimit nga distanca, gjithashtu mund të ngre Samba, të ruterizoj trafikun përmes VPN, të menaxhoj kompjuterin nga larg dhe shumë gjëra të tjera...
Përfundim
Përvoja tregoi se për të organizuar një server VPN, mund të kalojmë edhe pa një adresë IP të jashtme për të cilën duhet paguar, ashtu si dhe për një të marrë me qira VPS/VDS. Por gjithçka varet nga ofruesi. Sigurisht dëshiroja të merrja më shumë informata për ofruesit e ndryshëm dhe llojet e NAT-it të përdorur, por për këtë është vetëm fillimi...
Faleminderit për vëmendjen!
Burimi: habr.com
