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
$ 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.
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 "
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.
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
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
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 smartphone
Ik bewurkje it poartenûmer yn 'e ynstellings
Ik starte de kliïnt en ferbine
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