In VPN-tsjinner útfiere efter de NAT fan de provider

In artikel oer hoe't ik it slagge om in VPN-tsjinner efter de NAT fan myn thúsprovider út te fieren (sûnder in wyt IP-adres). Lit my daliks reservearje: dat de prestaasjes fan dizze ymplemintaasje hinget direkt ôf fan it type NAT dat jo provider brûkt, lykas de router.
Dat, ik moast ferbine fan myn Android-smartphone nei myn thúskompjûter, beide apparaten binne ferbûn mei it ynternet fia provider NAT's, plus de kompjûter is ferbûn fia in thúsrouter, dy't ek NAT's ferbinings.
It klassike skema mei in ferhierde VPS / VDS mei in wyt IP-adres, en ek it hieren fan in wyt IP-adres fan in provider, waard om ferskate redenen net beskôge.
Yn acht nimme ûnderfining út eardere artikels, hawwen útfierd ferskate eksperiminten mei STUN's en NAT's fan providers. Ik besleat in lyts eksperimint te dwaan troch it kommando út te fieren op in thúsrouter mei OpenWRT-firmware:

$ stun stun.sipnet.ru

krige it resultaat:

STUN-kliïntferzje 0.97
Primêr: Independent Mapping, Independent Filter, willekeurich haven, sil hairpin
Return wearde is 0x000002

Letterlike oersetting:
Unôfhinklike mapping - ûnôfhinklike mapping
Unôfhinklik filter - ûnôfhinklik filter
willekeurige poarte - willekeurige poarte
sil haarspjelde - der sil in haarspjeld wêze
Troch in ferlykber kommando op myn PC út te fieren, krige ik:

STUN-kliïntferzje 0.97
Primêr: Independent Mapping, Port Dependent Filter, willekeurich haven, sil hairpin
Return wearde is 0x000006

Port ôfhinklik filter - poarte ôfhinklik filter
It ferskil yn 'e resultaten fan' e kommando-útfier joech oan dat de thúsrouter "syn bydrage" levere oan it proses fan it ferstjoeren fan pakketten fan it ynternet; dit waard manifestearre yn it feit dat by it útfieren fan it kommando op 'e kompjûter:

stun stun.sipnet.ru -p 11111 -v

Ik krige it resultaat:

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

op dit stuit waard in UDP-sesje in skoft iepene, as jo op dit stuit in UDP-fersyk stjoere (bygelyks: netcat XX.1XX.1X4.2XX 4398 -u), dan kaam it fersyk nei de thúsrouter, dy't wie befêstige troch TCDPump dy't derop draait, mar it fersyk berikte de kompjûter net - IPtables, as in NAT-oersetter op 'e router, liet it falle.
In VPN-tsjinner útfiere efter de NAT fan de provider
Mar it feit dat it UDP-fersyk troch de NAT fan 'e provider gie, joech hope op sukses. Om't de router yn myn jurisdiksje leit, haw ik it probleem oplost troch de UDP / 11111-poarte nei de kompjûter te ferwizen:

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

Sa koe ik in UDP-sesje begjinne en oanfragen fan it ynternet ûntfange fan elk IP-adres. Op dit stuit lansearre ik OpenVPN-tsjinner (hat it earder konfigureare) harkjend nei UDP/11111-poarte, oanjûn it eksterne IP-adres en poarte (XX.1XX.1X4.2XX: 4398) op 'e smartphone en mei súkses ferbûn fan' e smartphone nei de kompjûter. Mar yn dizze ymplemintaasje ûntstie in probleem: it wie nedich om de UDP-sesje op ien of oare manier te behâlden oant de OpenVPN-kliïnt ferbûn wie mei de tsjinner; Ik hâldde net fan de opsje om de STUN-kliïnt periodyk te starten - ik woe de lading net fergrieme op de STUN-tsjinners.
Ik seach ek de yngong "sil haarspjelde - der sil in haarspjeld wêze", dizze modus

Hairpinning lit ien masine op in lokaal netwurk efter in NAT tagong krije ta in oare masine op itselde netwurk op it eksterne adres fan 'e router.

In VPN-tsjinner útfiere efter de NAT fan de provider
As gefolch haw ik it probleem gewoan oplost fan it behâld fan in UDP-sesje - ik lansearre de kliïnt op deselde kompjûter mei de tsjinner.
It wurke sa:

  • lansearre de STUN-kliïnt op lokale haven 11111
  • krige in antwurd mei in ekstern IP-adres en poarte XX.1XX.1X4.2XX:4398
  • stjoerde gegevens mei in ekstern IP-adres en haven nei e-post (elke oare tsjinst is mooglik) konfigurearre op de smartphone
  • lansearre de OpenVPN-tsjinner op in kompjûter harket nei UDP/11111-poarte
  • lansearre de OpenVPN-kliïnt op 'e kompjûter dy't XX.1XX.1X4.2XX: 4398 spesifisearret foar ferbining
  • op elk momint lansearre de OpenVPN-kliïnt op 'e smartphone dy't it IP-adres en de poarte oanjout (yn myn gefal is it IP-adres net feroare) om te ferbinen

In VPN-tsjinner útfiere efter de NAT fan de provider
Op dizze manier koe ik ferbine mei myn kompjûter fan myn smartphone. Dizze ymplemintaasje lit jo elke OpenVPN-kliïnt ferbine.

Praktyk

It sil nimme:

# apt install openvpn stun-client sendemail

Nei't wy in pear skripts hawwe skreaun, in pear konfiguraasjebestannen, en de nedige sertifikaten genereare (om't de kliïnt op in smartphone allinich wurket mei sertifikaten), hawwe wy de gewoane ymplemintaasje fan in OpenVPN-tsjinner krigen.

Main skript op 'e kompjûter

# 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

Skript foar it ferstjoeren fan gegevens fia e-post:

# 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"

Tsjinner konfiguraasjetriem:

# 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

Client konfiguraasjetriem:

# 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

Sertifikaten waarden oanmakke mei help fan dit artikel.
It skript útfiere:

# ./vpn11.sh

Troch it earst útfierber te meitsjen

# chmod +x vpn11.sh

Oan de smartphone kant

Troch it ynstallearjen fan de applikaasje OpenVPN foar Android, nei it kopiearjen fan it konfiguraasjetriem, sertifikaten en konfigureare, kaam it sa út:
Ik kontrolearje myn e-mail op myn smartphoneIn VPN-tsjinner útfiere efter de NAT fan de provider
Ik bewurkje it poartenûmer yn 'e ynstellingsIn VPN-tsjinner útfiere efter de NAT fan de provider
Ik starte de kliïnt en ferbineIn VPN-tsjinner útfiere efter de NAT fan de provider

By it skriuwen fan dit artikel haw ik de konfiguraasje fan myn kompjûter oerbrocht nei de Raspberry Pi 3 en besocht it hiele ding op in LTE-modem út te fieren, mar it wurke net! Kommando Resultaat

# stun stun.ekiga.net -p 11111

STUN-kliïntferzje 0.97
Primêr: Independent Mapping, Port Dependent Filter, willekeurich haven, sil hairpin
Return wearde is 0x000006

betsjutting Port ôfhinklik filter liet it systeem net starte.
Mar de thúsprovider liet it systeem sûnder problemen begjinne op 'e Raspberry Pi 3.
Yn gearhing mei in webcam, mei VLC foar
it meitsjen fan in RTSP-stream fan in webcam

$ 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 in smartphone foar besjen (stream rtsp: //10.2.0.1: 8554/), it die bliken in goede remote video tafersjoch systeem, kinne jo ek ynstallearje Samba, rûte ferkear fia VPN, op ôfstân bestjoere jo kompjûter en folle mear...

konklúzje

As praktyk hat sjen litten, om in VPN-tsjinner te organisearjen, kinne jo dwaan sûnder in ekstern IP-adres wêrfoar jo moatte betelje, krekt as foar in hierde VPS / VDS. Mar it hinget allegear ôf fan de provider. Fansels woe ik mear ynformaasje krije oer de ferskate oanbieders en soarten NAT's brûkt, mar dit is mar it begjin ...
Спасибо за внимание!

Boarne: www.habr.com

Add a comment