Menjalankan server VPN di belakang NAT penyedia

Artikel tentang bagaimana saya berhasil menjalankan server VPN di belakang NAT penyedia rumah saya (tanpa alamat IP putih). Izinkan saya membuat reservasi segera: itu kinerja implementasi ini secara langsung bergantung pada jenis NAT yang digunakan oleh penyedia Anda, serta routernya.
Jadi, saya perlu terhubung dari ponsel pintar Android saya ke komputer di rumah saya, kedua perangkat terhubung ke Internet melalui penyedia NAT, ditambah komputer terhubung melalui router rumah, yang juga koneksi NAT.
Skema klasik menggunakan VPS/VDS sewaan dengan alamat IP putih, serta menyewa alamat IP putih dari penyedia, tidak dipertimbangkan karena beberapa alasan.
Mempertimbangkan pengalaman dari artikel sebelumnya, setelah melakukan beberapa percobaan dengan STUN dan NAT penyedia. Saya memutuskan untuk melakukan sedikit percobaan dengan menjalankan perintah pada router rumah yang menjalankan firmware OpenWRT:

$ stun stun.sipnet.ru

mendapat hasilnya:

Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Independen, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000002

Terjemahan harfiah:
Pemetaan Independen - pemetaan independen
Filter Independen - filter independen
port acak - port acak
akan jepit rambut - akan ada jepit rambut
Menjalankan perintah serupa di PC saya, saya mendapatkan:

Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Ketergantungan Port, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000006

Filter Tergantung Port - filter bergantung pada port
Perbedaan hasil keluaran perintah menunjukkan bahwa router rumah memberikan “kontribusinya” terhadap proses transmisi paket dari Internet; hal ini diwujudkan dalam kenyataan bahwa ketika menjalankan perintah di komputer:

stun stun.sipnet.ru -p 11111 -v

Saya mendapatkan hasilnya:

...
Alamat yang Dipetakan = XX.1XX.1X4.2XX:4398
...

pada saat ini sesi UDP dibuka untuk beberapa waktu, jika saat ini Anda mengirim permintaan UDP (misalnya: netcat XX.1XX.1X4.2XX 4398 -u), maka permintaan tersebut datang ke router rumah, yaitu dikonfirmasi oleh TCPDump yang berjalan di atasnya, tetapi permintaan tersebut tidak sampai ke komputer - IPtables, sebagai penerjemah NAT di router, menjatuhkannya.
Menjalankan server VPN di belakang NAT penyedia
Namun fakta bahwa permintaan UDP melewati NAT penyedia memberikan harapan untuk sukses. Karena router berada di yurisdiksi saya, saya memecahkan masalah dengan mengarahkan port UDP/11111 ke komputer:

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

Dengan demikian, saya dapat memulai sesi UDP dan menerima permintaan dari Internet dari alamat IP mana pun. Pada saat ini, saya meluncurkan server OpenVPN (setelah mengkonfigurasinya sebelumnya) mendengarkan port UDP/11111, menunjukkan alamat IP eksternal dan port (XX.1XX.1X4.2XX:4398) pada ponsel cerdas dan berhasil terhubung dari ponsel cerdas ke komputer. Namun dalam implementasi ini muncul masalah: entah bagaimana perlu mempertahankan sesi UDP hingga klien OpenVPN terhubung ke server; Saya tidak suka opsi untuk meluncurkan klien STUN secara berkala - saya tidak ingin menyia-nyiakan beban pada server STUN.
Saya juga memperhatikan entri “akan jepit rambut - akan ada jepit rambut", modus ini

Hairpinning memungkinkan satu mesin di jaringan lokal di belakang NAT mengakses mesin lain di jaringan yang sama di alamat eksternal router.

Menjalankan server VPN di belakang NAT penyedia
Hasilnya, saya hanya memecahkan masalah mempertahankan sesi UDP - saya meluncurkan klien di komputer yang sama dengan server.
Ini bekerja seperti ini:

  • meluncurkan klien STUN pada port lokal 11111
  • menerima respons dengan alamat IP eksternal dan port XX.1XX.1X4.2XX:4398
  • mengirim data dengan alamat IP eksternal dan port ke email (layanan lain dimungkinkan) yang dikonfigurasi pada ponsel cerdas
  • meluncurkan server OpenVPN di komputer yang mendengarkan port UDP/11111
  • meluncurkan klien OpenVPN di komputer yang menentukan XX.1XX.1X4.2XX:4398 untuk terhubung
  • kapan saja meluncurkan klien OpenVPN di ponsel cerdas yang menunjukkan alamat IP dan port (dalam kasus saya, alamat IP tidak berubah) untuk terhubung

Menjalankan server VPN di belakang NAT penyedia
Dengan cara ini saya dapat terhubung ke komputer saya dari ponsel cerdas saya. Implementasi ini memungkinkan Anda menghubungkan klien OpenVPN apa pun.

Praktek

Anda akan membutuhkan:

# apt install openvpn stun-client sendemail

Setelah menulis beberapa skrip, beberapa file konfigurasi, dan menghasilkan sertifikat yang diperlukan (karena klien pada ponsel cerdas hanya bekerja dengan sertifikat), kami mendapatkan implementasi biasa dari server OpenVPN.

Skrip utama di komputer

# 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

Script untuk mengirim data melalui 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"

File konfigurasi server:

# 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

File konfigurasi klien:

# 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

Sertifikat dihasilkan menggunakan Artikel ini.
Menjalankan skrip:

# ./vpn11.sh

Dengan terlebih dahulu membuatnya dapat dieksekusi

# chmod +x vpn11.sh

Di sisi ponsel pintar

Dengan menginstal aplikasi OpenVPN untuk Android, setelah menyalin file konfigurasi, sertifikat dan mengkonfigurasinya, ternyata seperti ini:
Aku memeriksa emailku di ponsel pintarkuMenjalankan server VPN di belakang NAT penyedia
Saya mengedit nomor port di pengaturanMenjalankan server VPN di belakang NAT penyedia
Saya meluncurkan klien dan terhubungMenjalankan server VPN di belakang NAT penyedia

Saat menulis artikel ini, saya mentransfer konfigurasi dari komputer saya ke Raspberry Pi 3 dan mencoba menjalankan semuanya pada modem LTE, tetapi tidak berhasil! Hasil Perintah

# stun stun.ekiga.net -p 11111

Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Ketergantungan Port, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000006

nilai Filter Tergantung Port tidak mengizinkan sistem untuk memulai.
Tetapi penyedia rumah mengizinkan sistem untuk memulai pada Raspberry Pi 3 tanpa masalah.
Dalam hubungannya dengan webcam, dengan VLC untuk
membuat aliran RTSP dari 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

dan VLC di ponsel cerdas untuk dilihat (stream rtsp://10.2.0.1:8554/), ternyata merupakan sistem pengawasan video jarak jauh yang bagus, Anda juga dapat menginstal Samba, merutekan lalu lintas melalui VPN, mengontrol komputer Anda dari jarak jauh dan banyak lagi lagi...

Keluaran

Seperti yang telah ditunjukkan oleh praktik, untuk mengatur server VPN, Anda dapat melakukannya tanpa alamat IP eksternal yang harus Anda bayar, seperti halnya VPS/VDS sewaan. Tapi itu semua tergantung penyedianya. Tentu saja, saya ingin mendapatkan informasi lebih lanjut tentang berbagai penyedia dan jenis NAT yang digunakan, tapi ini baru permulaan...
Terima kasih!

Sumber: www.habr.com

Tambah komentar