ProHoster > blog > administrasi > Terowongan VPN langsung antar komputer melalui penyedia NAT (tanpa VPS, menggunakan server STUN dan Yandex.disk)
Terowongan VPN langsung antar komputer melalui penyedia NAT (tanpa VPS, menggunakan server STUN dan Yandex.disk)
Perpanjangan Artikel tentang bagaimana saya berhasil mengatur terowongan VPN langsung antara dua komputer yang terletak di belakang penyedia NAT. Artikel sebelumnya menjelaskan proses pengorganisasian koneksi dengan bantuan pihak ketiga - perantara (VPS sewaan bertindak sebagai server STUN dan pemancar data node untuk koneksi). Pada artikel ini saya akan memberi tahu Anda bagaimana saya mengelola tanpa VPS, tetapi perantara tetap ada dan mereka adalah server STUN dan Yandex.Disk...
pengenalan
Setelah membaca komentar di postingan sebelumnya, saya menyadari bahwa kelemahan utama implementasinya adalah penggunaan perantara - pihak ketiga (VPS) yang menunjukkan parameter node saat ini, di mana dan bagaimana terhubung. Mempertimbangkan rekomendasi untuk menggunakan STUN ini (yang jumlahnya banyak sekali) untuk menentukan parameter koneksi saat ini. Pertama-tama, saya memutuskan untuk menggunakan TCPDump untuk melihat isi paket ketika server STUN bekerja dengan klien dan menerima konten yang sama sekali tidak dapat dibaca. Googling protokol yang saya temukan artikel yang menjelaskan protokol. Saya menyadari bahwa saya tidak dapat mengimplementasikan permintaan ke server STUN sendiri dan menaruh ide tersebut di βkotak yang jauhβ.
Teori
Baru-baru ini saya harus menginstal server STUN di Debian dari paketnya
# apt install stun-server
dan di dependensi saya melihat paket stun-client, tapi entah kenapa saya tidak memperhatikannya. Namun kemudian saya teringat tentang paket stun-client dan memutuskan untuk mencari tahu cara kerjanya, setelah googling dan mencari di Yandex saya mendapatkan:
Klien STUN versi 0.97
Membuka port 21234 dengan fd 3
Membuka port 21235 dengan fd 4
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 0
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pesan setrum yang diterima: 92 byte
MappedAddress = <IP Saya>:2885
Alamat Sumber = 216.93.246.18:3478
Alamat Berubah = 216.93.246.17:3479
Atribut tidak diketahui: 32800
NamaServer = Vovida.org 0.98-BPK
Menerima pesan tipe 257 id=1
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 0
Akan mengirim pesan len 28 ke 216.93.246.17:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 0
Akan mengirim pesan len 28 ke <IP Saya>:2885
Pesan setrum yang diterima: 28 byte
Permintaan Perubahan = 0
Menerima pesan tipe 1 id=11
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 0
Akan mengirim pesan len 28 ke 216.93.246.17:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pesan setrum yang diterima: 92 byte
MappedAddress = <IP Saya>:2885
Alamat Sumber = 216.93.246.17:3479
Alamat Berubah = 216.93.246.18:3478
Atribut tidak diketahui: 32800
NamaServer = Vovida.org 0.98-BPK
Menerima pesan tipe 257 id=10
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 4
Akan mengirim pesan len 28 ke 216.93.246.18:3478
Pengkodean pesan setrum:
Pengkodean Permintaan Perubahan: 2
Akan mengirim pesan len 28 ke 216.93.246.18:3478
tes saya = 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
Utama: Pemetaan Independen, Filter Ketergantungan Port, port acak, akan jepit rambut
Nilai pengembalian adalah 0x000006
String dengan nilai
MappedAddress = <IP Saya>:2885
hanya apa yang Anda butuhkan! Ini menampilkan status koneksi saat ini pada port UDP lokal 21234. Tapi ini hanya setengah dari perjuangan, muncul pertanyaan tentang bagaimana cara mentransfer data ini ke host jarak jauh dan mengatur koneksi VPN. Menggunakan protokol email, atau mungkin Telegram?! Ada banyak pilihan dan saya memutuskan untuk menggunakan Yandex.disk, karena saya menemukannya artikel tentang mengerjakan Curl melalui WebDav dengan Yandex.disk. Setelah memikirkan implementasinya, saya menemukan skema berikut:
Memberi sinyal bahwa node siap untuk membuat koneksi dengan adanya file tertentu dengan stempel waktu di Yandex.disk;
Jika node sudah siap, terima parameter saat ini dari server STUN;
Unggah pengaturan saat ini ke Yandex.disk;
Periksa keberadaan dan baca parameter node jarak jauh dari file di Yandex.disk;
Membuat koneksi dengan host jarak jauh menggunakan OpenVPN.
Praktek
Setelah berpikir sebentar, dengan mempertimbangkan pengalaman artikel terakhir, saya segera menulis naskahnya. Kita akan butuh:
Salin ke clipboard dan tempel ke editor, misalnya:
# nano vpn10.sh
tunjukkan login (baris ke-2) dan kata sandi untuk Yandex.disk (baris ke-3).
tentukan alamat IP internal terowongan (baris ke-4).
membuat skrip dapat dieksekusi:
# chmod +x vpn10.sh
jalankan skrip:
# ./vpn10.sh nZbVGBuX5dtturD
di mana nZbVGBuX5dtturD adalah ID koneksi yang dihasilkan di sini
Pada node jarak jauh, lakukan hal yang sama, tentukan alamat IP internal terowongan dan ID koneksi yang sesuai.
Untuk autorun script ketika dihidupkan, saya menggunakan perintah βnohup /<path to the script>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &β yang terdapat pada file /etc/ rc.local
Kesimpulan
Skrip berfungsi, diuji di Ubuntu (18.04, 19.10, 20.04) dan Debian 9. Anda dapat menggunakan layanan lain sebagai pemancar, tetapi untuk pengalaman saya menggunakan Yandex.disk.
Selama percobaan, ditemukan bahwa beberapa jenis penyedia NAT tidak mengizinkan pembuatan koneksi. Terutama dari operator seluler tempat torrent diblokir.
Saya berencana untuk meningkatkan dalam hal:
Pembuatan secret.key secara otomatis setiap kali Anda memulai, mengenkripsi dan menyalin ke Yandex.disk untuk ditransfer ke node jarak jauh (Dengan mempertimbangkan versi yang diperbarui)
Penetapan otomatis alamat IP antarmuka
Mengenkripsi data sebelum mengunggah ke Yandex.disk
Pengoptimalan kode
Biarkan ada IPv6 di setiap rumah!
Diperbarui! File terbaru dan paket DEB di sini - yandex.disk