Artikkel sellest, kuidas ma suutisin käivitada VPN-serveri NAT'i taga kodu pakkuja (ilma avaliku IP-aadressita). Juhin kohe tähelepanu: käesoleva lahenduse töökindlus sõltub otseselt teie pakkuja kasutatavast NAT tüübist ja ka ruuterist.
Seega tekkis mul vajadus ühendada oma Android-smartfon koduarvutiga, kusjuures mõlemad seadmed on ühendatud internetti läbi pakkuja NAT'ide, pluss arvuti on ühendatud kodu ruuteri kaudu, mis samuti NAT'ib ühendusi.
Klassikalist skeemi, kus kasutatakse renditud VPS/VDS-i koos avaliku IP-aadressiga, ja samas ka avaliku IP-aadressi rentimine pakkujalt, ei kaalutud mitmel põhjusel.
Arvestades eelnevaid artiklite kogemusi, tehes mitu katset STUNide ja pakkujate NAT’idega. Otsustasin väikese eksperimendi teha, käivitades käsku kodu ruuteris, mis töötab OpenWRT firmware'iga:
$ stun stun.sipnet.rusain tulemuse:
STUN kliendi versioon 0.97
Peamine: Iseseisev kaardistamine, iseseisev filter, juhuslik port, jätkab ühendust
Tagastatud väärtus on 0x000002
Sõnaline tõlge:
Iseseisev kaardistamine — iseseisev kaardistamine
Iseseisev filter — iseseisev filter
juhuslik port — juhuslik port
jätkab ühendust — toimub ümberjuhtimine
Tehesin sarnase käsu oma arvutis, sain:
STUN kliendi versioon 0.97
Põhi: Iseseisev kaardistus, pordist sõltuv filter, juhuslik port, juuksepin
Tagastatud väärtus on 0x000006
Pordist sõltuv filter
Käskude väljundi tulemuste erinevus näitas, et kodune ruuter andis oma panuse pakettide edastamise protsessis; seda väljendas see, et arvuti käsu täitmisel:
stun stun.sipnet.ru -p 11111 -vsain tulemuse:
…
MappedAddress = XX.1XX.1X4.2XX:4398
…
sel hetkel avanes hetkeks UDP-seanss; kui sel hetkel saata UDP-päring (näiteks: netcat XX.1XX.1X4.2XX 4398 -u), siis päring jõudis kodusele ruuterile, mida kinnitas TCPDump, mis seal töötas, kuid päring ei jõudnud arvutini — IPtables ruuteri NAT-tõlgina jättis selle kõrvale.

Kuid isegi UDP-päringu läbimine teenusepakkuja NAT-i kaudu andis lootust edule. Kuna ruuter on minu jurisdiktsioonis, lahendasin probleemi UDP/11111 pordi suunamisega arvutisse:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXXSellega sain võimaluse alustada UDP-seanssi ja vastu võtta päringuid Internetist igast IP-aadressist. Sel ajal käivitasin OpenVPN-serveri (enne seadistamist), kuuldes UDP/11111 porti, märkisin oma nutitelefonis välise IP-aadressi ja porti (XX.1XX.1X4.2XX:4398) ning ühendasin edukalt nutitelefonist arvutiga. Kuid selle teostuse juures tekkis probleem, et kuidagi tuli toetada UDP-seanssi kuni OpenVPN-kliendi ühendamiseni serveriga, perioodilise STUN-kliendi käivitamise variant ei meeldinud mulle — ei tahtnud STUN-servereid asjata koormata.
Vaatasin ka tähelepanelikult üleskirjutust «jätkab ühendust — toimub ümberjuhtimine«, see režiim
Hairpinning võimaldab ühel seadmel lokaalses võrgus NAT-i kaudu pääseda teisele seadmele samas võrgus välise marsruuteri aadressi kaudu.

Lõpuks lahendasin UDP-seanssi toetamise probleem lihtsalt — käivitasin kliendi samal arvutil serveriga.
See toimis järgmiselt:
- käivitasin STUN-kliendi lokaalse portiga 11111
- sain vastuse välise IP-aadressiga ja portiga XX.1XX.1X4.2XX:4398
- saatsin andmed välise IP-aadressi ja portiga emailile (võimalik on kasutada ka mõnda muud teenust), mis oli seadistatud nutitelefoni
- käivitasin OpenVPN serveri arvutis, mis kuulab UDP/11111 porti
- käivitasin OpenVPN kliendi arvutis, määrates XX.1XX.1X4.2XX:4398 ühendamiseks
- igast ajast käivitasin OpenVPN kliendi nutitelefonis, määrates IP aadressi ja porti (minu puhul IP aadress ei muutunud) ühendamiseks

Nii sain võimaluse ühendada oma arvuti nutitelefoniga. See lahendus võimaldab ühendada mis tahes OpenVPN kliendi.
Praktika
Vajalikud asjad:
# apt install openvpn stun-client sendemailKirjutades paar skripti, paar konfiguratsioonifaili ja genereerides vajalikud sertifikaadid (sest nutitelefonis töötav klient töötab ainult sertifikaatidega) sain tavalise OpenVPN serveri rakenduse.
Peamine skript arvutis
# 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
doneSkript andmete saatmiseks e-postile:
# 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"Serveri konfiguratsioonifail:
# 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 20Kliendi konfiguratsioonifail:
# 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-clent.log
verb 3
mute 20
ping 10
ping-exit 30Sertifikaatide genereerimine toimus selles artiklis.
Skripti käivitamine:
# ./vpn11.shEelnevalt tehes selle käivitatavaks
# chmod +x vpn11.shNutitelefoni poolest
Paigaldades rakenduse OpenVPN Androidile, kopeerides konfiguratsioonifailid, sertifikaadid ja seadistades selle, sai selline tulemus:
Kontrollin e-kirju nutitelefonis
Muudan sadama numbrit seadetes
Käivitan kliendi ja ühendun
Artikli kirjutamise ajal kandsin konfiguratsiooni arvutist Raspberry Pi 3 peale ja proovisin kõik see LTE modemiga käivitada, kuid ei saanud hakkama! Komandi tulemus
# stun stun.ekiga.net -p 11111STUN kliendi versioon 0.97
Põhi: Iseseisev kaardistus, pordist sõltuv filter, juhuslik port, juuksepin
Tagastatud väärtus on 0x000006
väärtus Port Sõltuv Filter ei lubanud süsteemil töötada.
Kuid kodune teenusepakkuja lasi süsteemil Raspberry Pi 3 peal probleemideta töötada.
Koos veebikaameraga, VLC-ga
RTSP voogude loomine veebikaamerast
$ 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-keepja VLC nutitelefoni kaudu vaatamiseks (voog rtsp://10.2.0.1:8554/), olen saanud korraliku kaugsalvestuse süsteemi, samuti saab üles tõsta Samba, suunata liiklust VPNi kaudu, hallata arvutit kaugelt ja veel palju muud…
Kokkuvõte
Kuidas praktika on näidanud, on VPN-serveri korraldamiseks võimalik ka ilma välise IP-aadressita, mille eest tuleb maksta, samuti nagu üüritava eest. VPS/VDS. Kuid kõik sõltub teenusepakkujast. Muidugi tahaksin saada rohkem teavet erinevate teenusepakkujate ja kasutatavate NAT-tüüpide kohta, kuid see on alles algus…
Aitäh tähelepanu eest!
Allikas: habr.com
