Ένα άρθρο για το πώς κατάφερα να τρέξω έναν διακομιστή VPN πίσω από το NAT ενός οικιακού παρόχου (χωρίς λευκή διεύθυνση IP). Επιτρέψτε μου να σας πω αμέσως: η απόδοση αυτής της υλοποίησης εξαρτάται άμεσα από τον τύπο NAT που χρησιμοποιείται από τον πάροχο σας, καθώς και από τον δρομολογητή.
Έτσι, είχα την ανάγκη να συνδεθώ από το smartphone μου Android στον υπολογιστή του σπιτιού μου, και οι δύο συσκευές είναι συνδεδεμένες στο Διαδίκτυο μέσω NAT παρόχου, συν ο υπολογιστής συνδέεται μέσω ενός οικιακού δρομολογητή, ο οποίος επίσης συνδέεται με NAT.
Το κλασικό σχήμα που χρησιμοποιεί ένα μισθωμένο VPS / VDS με λευκή διεύθυνση IP, καθώς και την ενοικίαση λευκής διεύθυνσης IP από τον πάροχο, δεν εξετάστηκε για διάφορους λόγους.
Λαμβάνω υπ'όψιν
$ 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 στο δρομολογητή το απέρριψαν.
Αλλά το ίδιο το γεγονός της διέλευσης ενός αιτήματος 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 να έχει πρόσβαση σε άλλο μηχάνημα στο ίδιο δίκτυο στην εξωτερική διεύθυνση του δρομολογητή.
Ως αποτέλεσμα, έλυσα το πρόβλημα της διατήρησης μιας περιόδου λειτουργίας 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 δεν άλλαξε) για σύνδεση
Έτσι, είχα την ευκαιρία να συνδεθώ στον υπολογιστή μου από ένα 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 μου
Επεξεργάζομαι τον αριθμό θύρας στις ρυθμίσεις
Ξεκινάω τον πελάτη και συνδέομαι
Στη διαδικασία συγγραφής του άρθρου, μετέφερα τη διαμόρφωση από τον υπολογιστή στο 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