'n Artikel oor hoe ek dit reggekry het om 'n VPN-bediener agter die NAT van 'n tuisverskaffer te bestuur (sonder 'n wit IP-adres). Laat ek jou dadelik vertel: die prestasie van hierdie implementering hang direk af van die tipe NAT wat deur jou verskaffer gebruik word, sowel as die roeteerder.
So, ek het 'n behoefte gehad om van my Android-slimfoon na my tuisrekenaar te koppel, beide toestelle is aan die internet gekoppel deur verskaffer NAT's, plus die rekenaar is gekoppel deur 'n tuisroeteerder, wat ook NAT's verbind.
Die klassieke skema wat 'n gehuurde VPS / VDS met 'n wit IP-adres gebruik, sowel as die huur van 'n wit IP-adres van die verskaffer, is om verskeie redes nie oorweeg nie.
Neem in ag
$ stun stun.sipnet.ru
het die resultaat gekry:
STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, onafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000002
Letterlike vertaling:
Onafhanklike kartering - onafhanklike vertoning
Onafhanklike filter - onafhanklike filter
ewekansige poort - ewekansige poort
sal haarspeld - daar sal 'n haarnaald wees
Nadat ek 'n soortgelyke opdrag op my rekenaar uitgevoer het, het ek:
STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, poortafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000006
Poortafhanklike filter - poortafhanklike filter
Die verskil in die resultate van die uitvoer van die opdragte het aangedui dat die tuisroeteerder "sy bydrae" gemaak het tot die proses om pakkies vanaf die internet uit te saai, dit het gemanifesteer in die feit dat wanneer die opdrag op die rekenaar uitgevoer is:
stun stun.sipnet.ru -p 11111 -v
ek het die resultaat gekry:
...
Gekaartadres = XX.1XX.1X4.2XX:4398
...
op daardie oomblik is 'n UDP-sessie vir 'n rukkie oopgemaak, as op daardie oomblik 'n UDP-versoek gestuur is (byvoorbeeld: netcat XX.1XX.1X4.2XX 4398 -u), dan het die versoek na die tuisroeteerder gekom, wat was bevestig deur TCPDump wat daarop loop, maar die versoek het nie die rekenaar bereik nie - IPtables as 'n NAT-vertaler op die router het dit laat val.
Maar die feit om 'n UDP-versoek deur die verskaffer se NAT te stuur, het hoop op sukses gegee. Aangesien die router in my jurisdiksie is, het ek die probleem opgelos deur die UDP / 11111-poort na die rekenaar te herlei:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Ek het dus die geleentheid gekry om 'n UDP-sessie te begin en versoeke vanaf die internet vanaf enige IP-adres te ontvang. Op hierdie oomblik het ek OpenVPN-bediener geloods (nadat ek dit gekonfigureer het) terwyl ek na UDP/11111-poort luister, die eksterne IP-adres en poort (XX.1XX.1X4.2XX:4398) op die slimfoon aangedui en suksesvol van die slimfoon aan die rekenaar. Maar in hierdie implementering het 'n probleem ontstaan, dit was nodig om die UDP-sessie op een of ander manier te onderhou totdat die OpenVPN-kliënt aan die bediener gekoppel is, ek het nie gehou van die opsie om die STUN-kliënt periodiek te begin nie - ek wou nie STUN-bedieners laai nie verniet.
Het ook die aandag gevestig op die inskrywing "
Haarspeld laat een masjien op 'n plaaslike netwerk agter NAT toegang tot 'n ander masjien op dieselfde netwerk by die router se eksterne adres.
Gevolglik het ek die probleem opgelos om 'n UDP-sessie te onderhou eenvoudig - ek het die kliënt op dieselfde rekenaar met die bediener geloods.
Dit het so gewerk:
- STUN-kliënt met plaaslike poort 11111 bekendgestel
- antwoord ontvang met eksterne IP-adres en poort XX.1XX.1X4.2XX:4398
- het data gestuur met 'n eksterne IP-adres en poort na die pos (enige ander diens is moontlik) wat op die slimfoon gekonfigureer is
- het 'n OpenVPN-bediener op 'n rekenaar geloods wat op UDP/11111-poort luister
- het 'n OpenVPN-kliënt op 'n rekenaar bekendgestel wat XX.1XX.1X4.2XX:4398 spesifiseer om aan te sluit
- te eniger tyd die OpenVPN-kliënt op die slimfoon bekendgestel, met die spesifiseer van die IP-adres en poort (in my geval het die IP-adres nie verander nie) om aan te sluit
Ek het dus die geleentheid gekry om vanaf 'n slimfoon aan my rekenaar te koppel. Met hierdie implementering kan u enige OpenVPN-kliënt koppel.
Praktyk
Dit sal neem:
# apt install openvpn stun-client sendemail
Nadat ons 'n paar skrifte, 'n paar konfigurasielêers geskryf het, en die nodige sertifikate gegenereer het (aangesien die kliënt op die slimfoon net met sertifikate werk), het ons die gewone implementering van die OpenVPN-bediener gekry.
Hoofskrif op rekenaar
# 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
E-pos stuur skrip:
# 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"
Bediener konfigurasie lêer:
# 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
Kliënt konfigurasie lêer:
# 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
Sertifikate is gegenereer volgens
Begin die skrip:
# ./vpn11.sh
Maak dit eers uitvoerbaar
# chmod +x vpn11.sh
Aan die slimfoonkant
Deur die toepassing te installeer Maak VPN vir Android oop, deur die konfigurasielêer, sertifikate te kopieer en dit op te stel, het dit soos volg uitgedraai:
Gaan e-pos op my slimfoon na
Ek wysig die poortnommer in die instellings
Ek begin die kliënt en verbind
In die proses om die artikel te skryf, het ek die konfigurasie van die rekenaar na die Raspberry Pi 3 oorgedra en probeer om die hele ding op 'n LTE-modem te laat loop, maar dit het nie gewerk nie! opdrag resultaat
# stun stun.ekiga.net -p 11111
STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, poortafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000006
waarde Poortafhanklike filter verhoed dat die stelsel begin.
Maar die tuisverskaffer het die stelsel sonder enige probleme op die Raspberry Pi 3 laat loop.
In samewerking met 'n webkamera, met VLC vir
skep 'n RTSP-stroom vanaf 'n webkamera
$ 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
en VLC op 'n slimfoon vir besigtiging (stroom rtsp://10.2.0.1:8554/), dit blyk nie 'n slegte videobewakingstelsel op 'n afstand nie, jy kan ook Samba opstel, verkeer deur VPN stuur, 'n rekenaar op afstand beheer en baie meer ...
Output
Soos die praktyk getoon het, om 'n VPN-bediener te organiseer, kan jy klaarkom sonder 'n eksterne IP-adres waarvoor jy moet betaal, sowel as vir 'n gehuurde VPS / VDS. Maar dit hang alles af van die verskaffer. Natuurlik wou ek meer inligting kry oor die verskillende verskaffers en tipes NAT's wat gebruik word, maar dit is net die begin ...
Skep 'n nuwe weergawe!
Bron: will.com