Meluncurkan server VPN di belakang penyedia NAT

Artikel ini adalah tentang bagaimana saya berhasil memulai server VPN di belakang NAT penyedia rumah (tanpa alamat IP putih). Saya akan segera membuat reservasi: bahwa kinerja implementasi ini secara langsung tergantung pada jenis NAT yang digunakan oleh penyedia Anda, serta router .
Jadi, saya harus terhubung dari ponsel cerdas Android saya ke komputer di rumah, kedua perangkat terhubung ke Internet melalui penyedia NAT, ditambah komputer terhubung melalui router rumah, yang juga memiliki koneksi NAT.
Skema klasik menggunakan VPS / VDS sewaan dengan alamat IP putih, serta menyewa alamat IP putih dari penyedia, tidak dipertimbangkan karena beberapa alasan.
Berdasarkan pengalaman dari artikel sebelumnya , setelah melakukan beberapa percobaan dengan STUN dan penyedia NAT. Saya memutuskan eksperimen kecil dengan menjalankan perintah pada router rumah yang menjalankan firmware OpenWRT:
$ stun stun.sipnet.ru 

mendapat hasilnya:
STUN klien versi 0.97
Primer: Pemetaan Independen, Filter Independen, port acak, akan menyematkan rambut
Nilai kembali adalah 0x000002

Terjemahan literal:
Pemetaan Independen - Pemetaan Independen
Filter Independen - Filter Independen
port acak - port acak
akan jepit rambut - akan ada jepit rambut
Setelah menjalankan perintah serupa di PC saya, saya dapat:
STUN klien versi 0.97
Primer: Pemetaan Independen, Port Dependent Filter, port acak, akan menyematkan rambut
Nilai kembali adalah 0x000006

Port Dependent Filter - filter tergantung port
Perbedaan dalam output perintah menunjukkan bahwa router rumah membuat kontribusinya terhadap proses penyiaran paket dari Internet, ini dimanifestasikan dalam kenyataan bahwa ketika perintah dieksekusi di komputer:
 stun stun.sipnet.ru -p 11111 -v 

Saya mendapat hasilnya:
...
MappedAddress = XX.1XX.1X4.2XX: 4398
...
pada saat ini, sesi UDP dibuka untuk sementara waktu, jika pada saat itu permintaan UDP dikirim (misalnya: netcat XX.1XX.1X4.2XX 4398 -u), maka permintaan datang ke router rumah, yang dikonfirmasi oleh TCPDump yang menjalankannya, tetapi permintaan tidak mencapai komputer - IPtables menjatuhkannya di router sebagai penerjemah NAT.

Tetapi kenyataan bahwa permintaan UDP melewati ISP NAT memberi harapan untuk berhasil. 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 apa pun. Pada titik ini, saya meluncurkan server OpenVPN (setelah mengonfigurasinya) mendengarkan port UDP / 11111, yang ditunjukkan pada smartphone alamat IP eksternal dan port (XX.1XX.1X4.2XX: 4398) dan berhasil terhubung dari smartphone ke komputer. Tetapi dalam implementasi ini, muncul masalah, perlu untuk entah bagaimana mempertahankan sesi UDP sampai klien OpenVPN terhubung ke server, saya tidak suka opsi memulai klien STUN secara berkala - Saya tidak ingin menyia-nyiakan server STUN untuk apa pun.
Juga menarik perhatian pada entri " akan jepit rambut - akan ada jepit rambut ", mode ini
Hairpinning memungkinkan satu mesin di jaringan lokal untuk NAT untuk mengakses mesin lain di jaringan yang sama di alamat eksternal router.

gambar
Akibatnya, masalah mempertahankan sesi UDP diselesaikan - saya meluncurkan klien di komputer yang sama dengan server.
Ini berfungsi seperti ini:
  • meluncurkan klien STUN dengan port lokal 11111
  • Menerima respons dengan alamat IP eksternal dan port XX.1XX.1X4.2XX: 4398
  • mengirim data dengan alamat IP eksternal dan port to mail (layanan lain dimungkinkan) dikonfigurasikan pada smartphone
  • meluncurkan server OpenVPN di komputer dengan port UDP / 11111 mendengarkan
  • meluncurkan klien OpenVPN di komputer dengan indikasi XX.1XX.1X4.2XX: 4398 untuk terhubung
  • kapan saja saya memulai klien OpenVPN pada smartphone dengan alamat IP dan port (dalam kasus saya, alamat IP tidak berubah) untuk menghubungkan


Jadi, saya mendapat kesempatan untuk terhubung ke komputer saya dari smartphone. Implementasi ini memungkinkan Anda untuk menghubungkan klien OpenVPN.

Berlatih


Anda akan membutuhkan:
 # apt install openvpn stun-client sendemail 

Setelah menulis beberapa skrip, beberapa file konfigurasi, menghasilkan sertifikat yang diperlukan (karena klien pada smartphone hanya bekerja dengan sertifikat), implementasi yang biasa dari server OpenVPN diperoleh.

Script 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 

Skrip untuk mengirim data ke surat:
 # 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 

Pembuatan sertifikat dilakukan pada artikel ini .
Menjalankan skrip:
 # ./vpn11.sh 

Setelah sebelumnya membuatnya dapat dieksekusi
 # chmod +x vpn11.sh 

Di sisi smartphone


Setelah menginstal aplikasi OpenVPN untuk Android , menyalin file konfigurasi, sertifikat, dan pengaturannya, ternyata seperti ini:
Saya memeriksa email pada ponsel cerdas

Saya memperbaiki nomor port di pengaturan

Saya meluncurkan klien dan terhubung


Dalam proses menulis artikel, saya mentransfer konfigurasi dari komputer ke Raspberry Pi 3 dan mencoba menjalankan semuanya pada modem LTE, tetapi tidak berhasil! Hasil tim
 # stun stun.ekiga.net -p 11111 

STUN klien versi 0.97
Primer: Pemetaan Independen, Port Dependent Filter, port acak, akan menyematkan rambut
Nilai kembali adalah 0x000006
nilai Port Dependent Filter tidak memungkinkan sistem untuk memulai.
Tetapi penyedia rumah tanpa masalah membiarkan sistem Raspberry Pi 3 memulai.
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 pada smartphone untuk melihat (rtsp stream: //10.2.0.1: 8554 /), ternyata bukan sistem pengawasan video yang buruk di kejauhan, Anda juga dapat meningkatkan Samba dan bertukar file, lalu lintas rute melalui VPN,
mengontrol komputer dari jarak jauh
dan masih banyak lagi ...

Kesimpulan


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

Source: https://habr.com/ru/post/id482888/


All Articles