
Otomatis, aman, didistribusikan, dengan koneksi transitif (yaitu, meneruskan pesan ketika tidak ada akses langsung antara pelanggan), tanpa satu titik kegagalan, peer, teruji waktu, konsumsi sumber daya yang rendah, jaringan VPN full-mesh dengan kemampuan untuk "memencet" NAT - apakah mungkin?
Jawaban yang benar adalah:
- ya, dengan rasa sakit jika Anda menggunakan tinc.
- ya, mudah jika Anda menggunakan tinc + tinc-boot
Pendahuluan Lewati Tautan
Deskripsi Tinc
Sayangnya, sedikit informasi yang dipublikasikan tentang Tinc VPN tentang Habré, tetapi beberapa artikel yang relevan masih dapat ditemukan:
Dari artikel berbahasa Inggris dapat dibedakan:
Sumber asli lebih baik untuk mempertimbangkan dokumentasi Tinc man asli
Jadi (cetak ulang gratis dari situs resmi), Tinc VPN adalah layanan ( tincd
daemon) yang memastikan berfungsinya jaringan pribadi dengan melakukan tunneling dan mengenkripsi lalu lintas antar node. Kode sumber terbuka dan tersedia di bawah lisensi GPL2. Seperti solusi klasik (OpenVPN), jaringan virtual yang dibuat tersedia di level IP (OSI 3), yang berarti bahwa, dalam kasus umum, membuat perubahan pada aplikasi tidak diperlukan.
Fitur Utama:
- enkripsi, otentikasi, dan kompresi lalu lintas;
- solusi full-mesh otomatis sepenuhnya, yang mencakup membangun koneksi ke node jaringan dalam mode semua-dengan-semua atau, jika ini tidak berlaku, meneruskan pesan antara host perantara;
- meninju NAT;
- kemampuan untuk menghubungkan jaringan terisolasi di tingkat ethernet (saklar virtual);
- beberapa dukungan OS: Linux, FreeBSD, OS X, Solaris, Windows, dll.
Ada dua cabang pengembangan tinc: 1.0.x (di hampir semua repositori) dan 1.1 (eternal beta). Artikel ini menggunakan versi 1.0.x di mana-mana.
Tinc 1.1x menyediakan beberapa fitur utama: keamanan maju yang sempurna, konektivitas klien yang disederhanakan (sebenarnya menggantikan tinc-boot
) dan desain yang umumnya lebih bijaksana.
Namun, saat ini, versi stabil - 1.0.x diindikasikan dan disorot di situs web resmi, jadi ketika menggunakan semua kelebihan dari cabang 1.1, ada baiknya mengevaluasi semua kelebihan dan kekurangan dari menggunakan versi yang tidak final.
Dari sudut pandang saya, salah satu kemungkinan terkuat adalah untuk meneruskan pesan ketika koneksi langsung tidak memungkinkan. Pada saat yang sama, tabel routing dibangun secara otomatis. Bahkan node tanpa alamat publik dapat melewati lalu lintas melalui diri mereka sendiri.

Pertimbangkan situasi dengan tiga server (Cina, Rusia, Singapura) dan tiga klien (Rusia, Cina dan Filipina):
- server memiliki alamat publik, klien di belakang NAT;
- ILV selama pelarangan proksi yang mungkin berikutnya Telegram memblokir semua penghuni kecuali Cina "bersahabat";
- perbatasan jaringan China <-> RF tidak stabil dan mungkin jatuh (karena ILV dan / atau karena sensor China);
- koneksi ke Singapura stabil secara kondisional (pengalaman pribadi);
- Manila (Filipina) bukan ancaman bagi siapa pun, dan karena itu diizinkan untuk semua orang (karena jarak dari semua orang dan semuanya).
Misalnya, pertukaran lalu lintas antara Shanghai dan Moskow, pertimbangkan skenario Tinc (kurang-lebih):
- Situasi asli: Moskow <-> rusia-srv <-> china-srv <-> Shanghai
- ILV menutup koneksi ke China: Moskow <-> rusia-srv <-> Manila <-> Singapura <-> Shanghai
- (setelah 2) dalam hal kegagalan server di Singapura, lalu lintas ditransfer ke server di Cina dan sebaliknya.
Bilamana memungkinkan, Tinc berusaha untuk membuat koneksi langsung antara dua node di belakang NAT dengan meninju.
Pengantar singkat untuk konfigurasi tinc
Tinc diposisikan sebagai layanan yang mudah dikonfigurasikan. Namun, ada yang tidak beres - untuk membuat simpul baru, itu sangat diperlukan:
- Jelaskan konfigurasi host (tipe, nama) (
tinc.conf
); - Jelaskan file konfigurasi (disajikan subnet, alamat publik) (
hosts/
); - buat kunci;
- buat skrip yang menentukan alamat simpul dan parameter terkait (
tinc-up
); - disarankan untuk membuat skrip yang menghapus parameter yang dibuat setelah berhenti (
tinc-down
).
Selain itu, saat menghubungkan ke jaringan yang ada, Anda harus mendapatkan kunci host yang ada dan menyediakan kunci Anda sendiri.
Yaitu: untuk node kedua

Untuk yang ketiga

Saat menggunakan sinkronisasi dua arah (misalnya, unison
), jumlah operasi tambahan meningkat menjadi N buah, di mana N adalah jumlah node publik.
Kita harus membayar upeti kepada pengembang Tinc - untuk dimasukkan dalam jaringan, cukup tukar kunci
hanya dengan satu node (bootnode). Setelah memulai layanan dan terhubung ke peserta, tinc akan mendapatkan topologi
jaringan dan akan dapat bekerja dengan semua pelanggan.
Namun , jika host boot menjadi tidak tersedia, dan tinc telah dimulai kembali, maka tidak ada cara
akan terhubung ke jaringan virtual.
Selain itu, kemungkinan besar tinc, bersama dengan dokumentasi akademik ini (dijelaskan dengan baik, tetapi beberapa contoh), menyediakan bidang yang luas untuk kesalahan.
Alasan membuat tinc-boot
Jika kita menggeneralisasikan masalah yang dijelaskan di atas dan merumuskannya sebagai tugas, maka kita mendapatkan:
- kemampuan untuk membuat situs baru dengan upaya minimal diperlukan;
- berpotensi, perlu untuk memungkinkan memberikan spesialis rata (enikey) satu garis kecil untuk membuat simpul baru dan terhubung ke jaringan;
- perlu untuk menyediakan distribusi kunci secara otomatis antara semua node aktif;
- perlu untuk menyediakan prosedur pertukaran kunci yang disederhanakan antara bootnod dan klien baru.
bootnode - simpul dengan alamat publik (lihat di atas);
Karena persyaratan klaim 2, dapat diperdebatkan bahwa setelah pertukaran kunci antara bootnode dan node baru, dan setelah
menghubungkan node ke jaringan, distribusi kunci baru akan terjadi secara otomatis.
Inilah tugas-tugas yang dilakukan tinc-boot .
tinc-boot adalah aplikasi sumber terbuka mandiri, terlepas dari tinc
, yang menyediakan:
- pembuatan simpul baru yang sederhana;
- koneksi otomatis ke jaringan yang ada;
- mengatur mayoritas parameter secara default;
- distribusi kunci ke simpul madu.
Arsitektur
File executable tinc-boot
terdiri dari empat komponen: server bootnode, server manajemen distribusi utama, dan perintah manajemen RPC untuknya, serta modul pembuatan simpul.
Modul Pembangkitan Node
Modul pembuatan simpul ( tinc-boot gen
) membuat semua file yang diperlukan agar tinc dapat berjalan dengan sukses.
Secara sederhana, algoritanya dapat digambarkan sebagai berikut:
- Tetapkan nama host, jaringan, parameter IP, port, subnet mask, dll.
- Normalisasi mereka (tinc memiliki batasan pada beberapa nilai) dan buat yang hilang
- Periksa parameter
- Jika perlu, instal tinc-boot pada sistem (dinonaktifkan)
- Buat
tinc-up
, tinc-down
, subnet-up
, subnet-down
- Buat
tinc.conf
konfigurasi tinc.conf
- Buat
hosts/
- Lakukan pembuatan kunci
- Lakukan pertukaran kunci dengan bootnode
- Enkripsi dan tandatangani file host Anda sendiri dengan kunci publik, vektor inisialisasi acak (nounce) dan nama host menggunakan xchacha20poly1305, di mana kunci enkripsi adalah hasil dari fungsi sha256 dari token
- Kirim data melalui protokol HTTP ke bootnode
- Menguraikan jawaban yang diterima dan header
X-Node
berisi nama node boot menggunakan nounce asli dan algoritma yang sama - Jika berhasil, simpan kunci yang diterima di
hosts/
dan tambahkan entri ConnectTo
ke file konfigurasi (mis. Rekomendasi tempat menyambungkan) - Jika tidak, gunakan alamat berikut dalam daftar node boot dan ulangi dari langkah 2
- Tunjukkan rekomendasi untuk memulai layanan
Konversi melalui SHA-256 hanya digunakan untuk menormalkan kunci menjadi 32 byte
Untuk simpul pertama (yaitu, ketika tidak ada yang ditentukan sebagai alamat boot), langkah 9 dilewati. Tandai --standalone
.
Contoh 1 - membuat situs publik pertama
Alamat publik adalah 1.2.3.4
sudo tinc-boot gen --standalone -a 1.2.3.4
-a
flag memungkinkan Anda untuk menentukan alamat yang dapat diakses publik
Contoh 1 - menambahkan simpul non-publik ke jaringan
Boot node akan diambil dari contoh di atas. Tuan rumah harus menjalankan tinc-boot bootnode (dijelaskan nanti).
sudo tinc-boot gen --token "MY TOKEN" http://1.2.3.4:8655
- bendera
--token
mengatur token otorisasi
Modul bootstrap
tinc-boot bootnode
memunculkan server HTTP dengan API untuk pertukaran kunci primer dengan klien baru.
Secara default, port 8655
.
Sederhana, algoritme dapat dijelaskan sebagai berikut:
- Terima permintaan dari klien
- Dekripsi dan verifikasi permintaan menggunakan xchacha20poly1305, menggunakan vektor inisialisasi yang diteruskan selama permintaan, dan di mana kunci enkripsi adalah hasil dari fungsi sha256 dari token
- Periksa nama
- Simpan file jika belum ada file dengan nama yang sama
- Enkripsi dan tandatangani file dan nama host Anda sendiri menggunakan algoritma yang dijelaskan di atas
- Kembali ke item 1
Bersama-sama, proses pertukaran kunci utama adalah sebagai berikut:

Contoh 1 - memulai simpul unduhan
Diasumsikan bahwa inisialisasi awal node telah dilakukan ( tinc-boot gen
)
tinc-boot bootnode --token "MY TOKEN"
- bendera
--token
mengatur token otorisasi. Itu harus sama untuk klien yang terhubung ke host.
Contoh 2 - memulai simpul unduhan sebagai layanan
tinc-boot bootnode --service --token "MY TOKEN"
- flag
--service
untuk membuat layanan systemd (secara default, untuk contoh ini tinc-boot-dnet.service
) - bendera
--token
mengatur token otorisasi. Itu harus sama untuk klien yang terhubung ke host.
Modul distribusi kunci
Modul distribusi kunci ( tinc-boot monitor
) memunculkan server HTTP dengan API untuk bertukar kunci dengan node lain di dalam VPN . Diperbaiki ke alamat yang dikeluarkan oleh jaringan (port default adalah 1655
, tidak akan ada konflik dengan beberapa jaringan, karena setiap jaringan memiliki / harus memiliki alamatnya sendiri).
Modul dimulai dan bekerja sepenuhnya secara otomatis: Anda tidak perlu bekerja dengannya dalam mode manual.
Modul ini dimulai secara otomatis ketika jaringan naik (dalam tinc-up
) dan secara otomatis berhenti ketika berhenti (dalam tinc-down
).
Mendukung operasi:
GET /
- berikan file simpul AndaPOST /rpc/watch?node=<>&subnet=<>
- mengambil file dari node lain, dengan asumsi ada layanan serupa yang berjalan di atasnya. Secara default, upaya batas waktu 10 detik, setiap 30 detik hingga berhasil atau dibatalkan.POST /rpc/forget?node=<>
- tinggalkan upaya (jika ada) untuk mengambil file dari node lainPOST /rpc/kill
- mengakhiri layanan
Selain itu, setiap menit (secara default) dan ketika file konfigurasi baru diterima, pengindeksan node yang disimpan dibuat untuk node publik baru. Ketika node dengan bendera Address
terdeteksi, entri ditambahkan ke file konfigurasi tinc.conf
untuk merekomendasikan koneksi saat memulai kembali.
Modul Distribusi Kunci (Manajemen)
Perintah untuk meminta ( tinc-boot watch
) dan membatalkan permintaan ( tinc-boot forget
) dari file konfigurasi dari node lain dieksekusi secara otomatis ketika sebuah node baru terdeteksi (skrip subnet-up
) dan masing-masing dihentikan (skrip subnet-down
).
Dalam proses menghentikan layanan, tinc-down
di mana perintah tinc-boot kill
menghentikan modul distribusi kunci.
Alih-alih total
Utilitas ini dibuat di bawah pengaruh disonansi kognitif antara genius pengembang Tinc dan kompleksitas linear yang sedang tumbuh dalam menyiapkan node baru.
Gagasan utama dalam proses pengembangan adalah:
- jika sesuatu bisa otomatis, itu harus otomatis;
- nilai default harus mencakup setidaknya 80% penggunaan (prinsip Pareto);
- nilai apa pun dapat didefinisikan ulang menggunakan flag dan variabel lingkungan;
- utilitas harus membantu, dan tidak menyebabkan keinginan untuk memanggil semua hukuman surga pada penciptanya;
- menggunakan token otorisasi untuk inisialisasi awal adalah risiko yang jelas, namun, sejauh memungkinkan, diminimalkan karena kriptografi dan otentikasi total (bahkan nama simpul di header respons tidak dapat diganti).
Kronologi kecil:
- Pertama kali saya menggunakan tinc lebih dari 4 tahun yang lalu. Mempelajari sejumlah besar materi. Siapkan jaringan yang ideal (menurut saya)
- Setelah setengah tahun, tinc diganti menjadi zerotier, sebagai alat yang lebih nyaman / fleksibel
- 2 tahun yang lalu, saya membuat buku pedoman yang memungkinkan untuk menyebarkan tinc
- Sebulan kemudian, skrip saya mogok karena penambahan bertahap (mis. Ketika tidak mungkin mengakses semua node jaringan, yang berarti mendistribusikan kunci)
- Dua minggu lalu, saya menulis skrip bash-script yang merupakan prototipe untuk
tinc-boot
- 3 hari yang lalu setelah iterasi kedua, versi utilitas pertama (0.0.1 lebih tepatnya) lahir
- 1 hari yang lalu, saya mengurangi pemasangan node baru menjadi satu baris:
curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot
curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot
- Segera, kemungkinan koneksi yang lebih sederhana ke jaringan akan ditambahkan (tanpa mengorbankan keamanan)
Selama pengembangan, saya aktif menguji pada server nyata dan klien (gambar dari deskripsi tinc di atas diambil dari kehidupan nyata). Sekarang sistem bekerja dengan sempurna, dan semua layanan VPN pihak ketiga sekarang dinonaktifkan.
Kode aplikasi ditulis dalam GO dan terbuka di bawah lisensi MPL 2.0. Lisensi (terjemahan gratis) memungkinkan penggunaan komersial (jika seseorang tiba-tiba) menggunakan tanpa membuka produk sumber. Satu-satunya persyaratan adalah bahwa perubahan harus ditransfer ke proyek.
Permintaan kolam renang dipersilakan.
Tautan yang bermanfaat