Kelanjutan
artikel tentang bagaimana saya berhasil mengatur terowongan VPN langsung antara dua komputer yang terletak di belakang penyedia NAT. Artikel terakhir menjelaskan proses mengatur koneksi menggunakan pihak ketiga - perantara (VPS sewaan bertindak sebagai sesuatu seperti server STUN dan pemancar data node untuk koneksi). Pada artikel ini saya akan memberitahu Anda bagaimana melakukannya tanpa VPS, tetapi perantara tetap dan mereka adalah server STUN dan Yandex. Disk ...

Pendahuluan
Setelah membaca komentar dari posting terakhir, saya menyadari bahwa kelemahan utama dari implementasi adalah penggunaan perantara - pihak ketiga (VPS) yang menunjukkan parameter node saat ini, di mana dan bagaimana menghubungkan. Diberikan rekomendasi untuk menggunakan STUN ini (ada
banyak di antaranya ) untuk menentukan parameter koneksi saat ini. Pertama-tama, saya memutuskan untuk melihat isi paket menggunakan TCPDump ketika server STUN bekerja dengan klien dan menerima konten yang sama sekali tidak dapat dibaca. Googling protokol menemukan
artikel yang menggambarkan protokol . Saya menyadari bahwa saya tidak dapat mengimplementasikan permintaan ke server STUN sendiri dan memasukkan gagasan itu ke "kotak jauh".
Teori
Baru-baru ini saya harus menginstal server STUN pada Debian dari sebuah paket
dan dalam dependensi saya melihat paket setrum-klien, tetapi entah bagaimana tidak mementingkan ini. Tetapi kemudian, saya ingat tentang paket setrum-klien dan memutuskan untuk mencari tahu cara kerjanya, dengan googling dan Poindeksiv yang saya terima:
Sebagai tanggapan, saya menerima:
STUN klien versi 0.97
Membuka port 21234 dengan fd 3
Membuka port 21235 dengan fd 4
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 0
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Menerima pesan setrum: 92 byte
MappedAddress = <My IP>: 2885
SourceAddress = 216.93.246.18//478
ChangedAddress = 216.93.246.17lla479
Atribut tidak dikenal: 32800
ServerName = Vovida.org 0,98-CPC
Menerima pesan tipe 257 id = 1
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 0
Akan mengirim pesan dari len 28 ke 216.93.246.17lla478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 0
Akan mengirim pesan dari len 28 ke <My IP>: 2885
Menerima pesan setrum: 28 byte
ChangeRequest = 0
Menerima pesan tipe 1 id = 11
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 0
Akan mengirim pesan dari len 28 ke 216.93.246.17lla478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Menerima pesan setrum: 92 byte
MappedAddress = <My IP>: 2885
SourceAddress = 216.93.246.17lla479
ChangedAddress = 216.93.246.18 {478
Atribut tidak dikenal: 32800
ServerName = Vovida.org 0,98-CPC
Menerima pesan tipe 257 id = 10
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 4
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
Pengkodean pesan setrum:
Pengkodean ChangeRequest: 2
Akan mengirim pesan dari len 28 ke 216.93.246.18 opin478
tes I = 1
tes II = 0
Tes III = 0
tes I (2) = 1
adalah nat = 1
IP yang dipetakan sama = 1
jepit rambut = 1
port pemelihara = 0
Primer: Pemetaan Independen, Port Dependent Filter, port acak, akan menyematkan rambut
Nilai kembali adalah 0x000006
String dengan nilai
MappedAddress = <My IP>: 2885
apa yang Anda butuhkan! Ini menampilkan status saat ini untuk koneksi pada port UDP lokal 21234. Tetapi ini hanya setengah dari pertempuran, timbul pertanyaan tentang bagaimana mentransfer data ini ke host jarak jauh dan membuat koneksi VPN. Menggunakan protokol surat, mungkin Telegram ?! Ada banyak pilihan dan saya memutuskan untuk menggunakan Yandex.Disk, karena saya menemukan
sebuah artikel tentang bagaimana Curl bekerja melalui WebDav dengan Yandex.Disk . Setelah memikirkan implementasinya, saya sampai pada skema ini:
- Untuk memberi tanda bahwa node siap untuk membuat koneksi dengan kehadiran file tertentu dengan cap waktu pada Yandex.disk;
- Jika node sudah siap, dapatkan parameter saat ini dari server STUN;
- Unggah parameter saat ini ke Yandex.Disk;
- Periksa ketersediaan dan baca parameter situs jauh dari file di Yandex.Disk;
- Buat koneksi ke host jarak jauh menggunakan OpenVPN.
Berlatih
Setelah sedikit berpikir, dengan mempertimbangkan pengalaman artikel sebelumnya, saya menulis skrip cepat. Kami akan membutuhkan:
Sebenarnya skrip itu sendiri:
Opsi awal
Untuk menjalankan skrip yang Anda butuhkan:
- Salin ke clipboard dan rekatkan ke editor, misalnya:
- tentukan nama pengguna dan kata sandi dari Yandex.Disk.
- di bidang "--ifconfig 10.45.54. (1 atau 2) 255.255.255.252" tentukan alamat IP internal antarmuka
- buat secret.key dengan perintah:
- membuat skrip dapat dieksekusi:
- jalankan skrip:
di mana nZbVGBuX5dtturD adalah ID koneksi yang dihasilkan di sini
Pada node jarak jauh, lakukan hal yang sama kecuali untuk pembuatan secret.key dan koneksi ID, mereka harus identik.
Versi terbaru (untuk operasi yang benar, waktu harus disinkronkan):
cat vpn10.sh
Untuk menjalankan skrip yang Anda butuhkan:
- Salin ke clipboard dan rekatkan ke editor, misalnya:
- tentukan login (baris kedua) dan kata sandi dari Yandex.Disk (baris ketiga).
- tentukan alamat IP internal terowongan (baris 4).
- membuat skrip dapat dieksekusi:
- jalankan skrip:
di mana nZbVGBuX5dtturD adalah ID koneksi yang dihasilkan di sini
Pada node jarak jauh, lakukan hal yang sama, tentukan alamat IP internal terowongan dan koneksi ID yang sesuai.
Untuk memulai skrip saat startup, saya menggunakan perintah "nohup / <path to script> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null &" yang terdapat dalam file /etc/rc.local
Kesimpulan
Script berfungsi, diuji pada Ubuntu 18.04 dan Debian 9. Anda dapat menggunakan layanan lain sebagai pemancar, tetapi untuk pengalaman saya menggunakan Yandex.Disk.
Dalam perjalanan percobaan, ditemukan bahwa beberapa jenis penyedia NAT tidak memungkinkan untuk koneksi. Sebagian besar dengan operator seluler di mana torrent diblokir.
Saya berencana untuk menyelesaikan dalam hal:
- Pembuatan otomatis secret.key setiap kali Anda memulai, mengenkripsi dan menyalin ke Yandex.Disk untuk mentransfer ke host jarak jauh (Dipertimbangkan dalam versi yang diperbarui)
- Secara otomatis Menetapkan Alamat IP Antarmuka
- Enkripsi data sebelum mengunggah ke Yandex.Disk
- Optimasi kode
Semoga ada IPv6 di setiap rumah!