Εκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου

Ένα άρθρο για το πώς κατάφερα να τρέξω έναν διακομιστή VPN πίσω από το NAT ενός οικιακού παρόχου (χωρίς λευκή διεύθυνση IP). Επιτρέψτε μου να σας πω αμέσως: η απόδοση αυτής της υλοποίησης εξαρτάται άμεσα από τον τύπο NAT που χρησιμοποιείται από τον πάροχο σας, καθώς και από τον δρομολογητή.
Έτσι, είχα την ανάγκη να συνδεθώ από το smartphone μου Android στον υπολογιστή του σπιτιού μου, και οι δύο συσκευές είναι συνδεδεμένες στο Διαδίκτυο μέσω NAT παρόχου, συν ο υπολογιστής συνδέεται μέσω ενός οικιακού δρομολογητή, ο οποίος επίσης συνδέεται με NAT.
Το κλασικό σχήμα που χρησιμοποιεί ένα μισθωμένο VPS / VDS με λευκή διεύθυνση IP, καθώς και την ενοικίαση λευκής διεύθυνσης IP από τον πάροχο, δεν εξετάστηκε για διάφορους λόγους.
Λαμβάνω υπ'όψιν εμπειρία από παλαιότερα άρθρα, έχοντας περάσει αρκετά πειράματα με STUN και NAT παρόχων. Αποφάσισα ένα μικρό πείραμα εκτελώντας την εντολή σε έναν οικιακό δρομολογητή που εκτελεί το υλικολογισμικό OpenWRT:

$ stun stun.sipnet.ru

πήρε το αποτέλεσμα:

STUN έκδοση πελάτη 0.97
Κύρια: Ανεξάρτητη χαρτογράφηση, Ανεξάρτητο φίλτρο, τυχαία θύρα, φουρκέτα
επιστρεφόμενη τιμή είναι 0x000002

Κυριολεκτική μετάφραση:
Ανεξάρτητη χαρτογράφηση - ανεξάρτητη εμφάνιση
Ανεξάρτητο φίλτρο - ανεξάρτητο φίλτρο
τυχαία θύρα - τυχαία θύρα
θα φουρκέτα - θα υπάρχει φουρκέτα
Μετά την εκτέλεση μιας παρόμοιας εντολής στον υπολογιστή μου, έλαβα:

STUN έκδοση πελάτη 0.97
Κύρια: Ανεξάρτητη χαρτογράφηση, φίλτρο εξαρτώμενο από τη θύρα, τυχαία θύρα, φουρκέτα
επιστρεφόμενη τιμή είναι 0x000006

Port Dependent Filter - φίλτρο που εξαρτάται από τη θύρα
Η διαφορά στα αποτελέσματα της εξόδου των εντολών έδειξε ότι ο οικιακός δρομολογητής συνέβαλε "τη συμβολή του" στη διαδικασία μετάδοσης πακέτων από το Διαδίκτυο, αυτό φάνηκε στο γεγονός ότι όταν η εντολή εκτελέστηκε στον υπολογιστή:

stun stun.sipnet.ru -p 11111 -v

πήρα το αποτέλεσμα:

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

εκείνη τη στιγμή, μια περίοδος λειτουργίας UDP άνοιξε για λίγο, εάν εκείνη τη στιγμή στάλθηκε ένα αίτημα UDP (για παράδειγμα: netcat XX.1XX.1X4.2XX 4398 -u), τότε το αίτημα ήρθε στον οικιακό δρομολογητή, το οποίο ήταν επιβεβαιώθηκε από το TCPDump που εκτελείται σε αυτό, αλλά το αίτημα δεν έφτασε στον υπολογιστή - Οι πίνακες IP ως μεταφραστής NAT στο δρομολογητή το απέρριψαν.
Εκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου
Αλλά το ίδιο το γεγονός της διέλευσης ενός αιτήματος UDP μέσω του NAT του παρόχου έδωσε ελπίδες για επιτυχία. Δεδομένου ότι ο δρομολογητής βρίσκεται στη δικαιοδοσία μου, έλυσα το πρόβλημα ανακατευθύνοντας τη θύρα UDP / 11111 στον υπολογιστή:

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

Έτσι, είχα την ευκαιρία να ξεκινήσω μια συνεδρία UDP και να λάβω αιτήματα από το Διαδίκτυο από οποιαδήποτε διεύθυνση IP. Αυτή τη στιγμή, ξεκίνησα το διακομιστή OpenVPN (μετά τη διαμόρφωση του) ακούγοντας τη θύρα UDP/11111, υπέδειξα την εξωτερική διεύθυνση IP και τη θύρα (XX.1XX.1X4.2XX:4398) στο smartphone και συνδέθηκα με επιτυχία από το smartphone στο υπολογιστή. Αλλά σε αυτήν την υλοποίηση, προέκυψε ένα πρόβλημα, ήταν απαραίτητο να διατηρηθεί με κάποιο τρόπο η συνεδρία UDP έως ότου συνδεθεί ο πελάτης OpenVPN στον διακομιστή, δεν μου άρεσε η επιλογή περιοδικής εκκίνησης του προγράμματος-πελάτη STUN - δεν ήθελα να φορτώσω διακομιστές STUN μάταια.
Επίσης επέστησε την προσοχή στο λήμμα "θα φουρκέτα - θα υπάρχει φουρκέτα", αυτή η λειτουργία

Το Hairpinning επιτρέπει σε ένα μηχάνημα σε τοπικό δίκτυο πίσω από το NAT να έχει πρόσβαση σε άλλο μηχάνημα στο ίδιο δίκτυο στην εξωτερική διεύθυνση του δρομολογητή.

Εκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου
Ως αποτέλεσμα, έλυσα το πρόβλημα της διατήρησης μιας περιόδου λειτουργίας UDP απλά - εκκίνησα τον πελάτη στον ίδιο υπολογιστή με τον διακομιστή.
Λειτούργησε ως εξής:

  • εκκίνησε το πρόγραμμα-πελάτη STUN με τοπική θύρα 11111
  • έλαβε απάντηση με εξωτερική διεύθυνση IP και θύρα XX.1XX.1X4.2XX:4398
  • έστειλε δεδομένα με εξωτερική διεύθυνση IP και θύρα στο mail (είναι δυνατή οποιαδήποτε άλλη υπηρεσία) που έχουν διαμορφωθεί στο smartphone
  • ξεκίνησε έναν διακομιστή OpenVPN σε έναν υπολογιστή που ακούει στη θύρα UDP/11111
  • εκτόξευσε ένα πρόγραμμα-πελάτη OpenVPN σε έναν υπολογιστή προσδιορίζοντας το XX.1XX.1X4.2XX:4398 για σύνδεση
  • ανά πάσα στιγμή εκκίνησε το πρόγραμμα-πελάτη OpenVPN στο smartphone, προσδιορίζοντας τη διεύθυνση IP και τη θύρα (στην περίπτωσή μου, η διεύθυνση IP δεν άλλαξε) για σύνδεση

Εκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου
Έτσι, είχα την ευκαιρία να συνδεθώ στον υπολογιστή μου από ένα smartphone. Αυτή η υλοποίηση σάς επιτρέπει να συνδέσετε οποιοδήποτε πρόγραμμα-πελάτη OpenVPN.

Πρακτική

Θα χρειαστείτε:

# apt install openvpn stun-client sendemail

Αφού γράψαμε μερικά σενάρια, μερικά αρχεία διαμόρφωσης, δημιουργώντας τα απαραίτητα πιστοποιητικά (καθώς ο πελάτης στο smartphone λειτουργεί μόνο με πιστοποιητικά), πήραμε τη συνήθη υλοποίηση του διακομιστή OpenVPN.

Κύριο σενάριο στον υπολογιστή

# 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

Σενάριο αποστολής 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"

Αρχείο διαμόρφωσης διακομιστή:

# 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

Αρχείο διαμόρφωσης πελάτη:

# 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

Τα πιστοποιητικά δημιουργήθηκαν σύμφωνα με Αυτό το άρθρο.
Εκτέλεση του σεναρίου:

# ./vpn11.sh

Κάνοντας το εκτελέσιμο πρώτα

# chmod +x vpn11.sh

Στην πλευρά του smartphone

Με την εγκατάσταση της εφαρμογής Ανοίξτε το VPN για Android, αντιγράφοντας το αρχείο διαμόρφωσης, πιστοποιητικά και ρυθμίζοντάς το, αποδείχθηκε ως εξής:
Έλεγχος email στο smartphone μουΕκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου
Επεξεργάζομαι τον αριθμό θύρας στις ρυθμίσειςΕκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου
Ξεκινάω τον πελάτη και συνδέομαιΕκκίνηση διακομιστή VPN πίσω από το NAT ενός παρόχου

Στη διαδικασία συγγραφής του άρθρου, μετέφερα τη διαμόρφωση από τον υπολογιστή στο Raspberry Pi 3 και προσπάθησα να τρέξω το όλο θέμα σε ένα μόντεμ LTE, αλλά δεν λειτούργησε! αποτέλεσμα εντολής

# stun stun.ekiga.net -p 11111

STUN έκδοση πελάτη 0.97
Κύρια: Ανεξάρτητη χαρτογράφηση, φίλτρο εξαρτώμενο από τη θύρα, τυχαία θύρα, φουρκέτα
επιστρεφόμενη τιμή είναι 0x000006

αξία Φίλτρο εξαρτώμενο από τη θύρα εμπόδισε την εκκίνηση του συστήματος.
Αλλά ο πάροχος του σπιτιού άφησε το σύστημα να λειτουργεί στο Raspberry Pi 3 χωρίς κανένα πρόβλημα.
Σε συνδυασμό με κάμερα web, με VLC για
δημιουργία μιας ροής RTSP από μια κάμερα web

$ 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

και VLC σε smartphone για προβολή (ροή rtsp://10.2.0.1:8554/), αποδείχθηκε ότι δεν ήταν κακό σύστημα παρακολούθησης βίντεο από απόσταση, μπορείτε επίσης να ρυθμίσετε το Samba, να δρομολογήσετε την κυκλοφορία μέσω VPN, να ελέγξετε απομακρυσμένα έναν υπολογιστή και πολλα ΑΚΟΜΑ ...

Παραγωγή

Όπως έχει δείξει η πρακτική, για να οργανώσετε έναν διακομιστή VPN, μπορείτε να κάνετε χωρίς εξωτερική διεύθυνση IP για την οποία πρέπει να πληρώσετε, καθώς και για ενοικιαζόμενο VPS / VDS. Αλλά όλα εξαρτώνται από τον πάροχο. Φυσικά, ήθελα να λάβω περισσότερες πληροφορίες σχετικά με τους διάφορους παρόχους και τους τύπους NAT που χρησιμοποιούνται, αλλά αυτό είναι μόνο η αρχή ...
Спасибо за внимание!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο