Saya memiliki server wireguard yang berjalan di rumah untuk dapat memasuki jaringan rumah saya dari luar. Wireguard menggunakan UDP. Sayangnya saya tidak bisa begitu saja membuka port UDP IPv4 di fritz box saya seperti dulu karena penyedia saya telah menempatkan saya di belakang CG-NAT, saya harus menggunakan IPv6 tetapi IPv6 belum dapat digunakan di tempat kerja saya.
Jadi di rumah saya punya IPv6 dan di tempat kerja saya punya IPv4 dan tidak ada cara untuk menjangkau jaringan rumah saya.
Saya juga memiliki VPS dengan IPv4 publik yang dapat digunakan untuk membuat terowongan ssh terbalik untuk lalu lintas TCP. Sayangnya terowongan ssh hanya mendukung TCP dan kita tidak boleh melakukan koneksi VPN melalui TCP, itulah alasan wireguard hanya menggunakan UDP.
VPN-Server VPN-Client
(UDP) | | (IPv4 UDP)
| | | not possible |
-----------|--------| <-------------------
| |
NAT CG-NAT
VPN-Server VPN-Client
(UDP) (IPv4 UDP)
| |
| |
inside agent outside agent
tunnel tunnel
|| | | ||
|| punch| punch| ||
| --------->|-------->|-------------------- |
-----------|<--------|<--------------------
| |
| |
NAT CG-NAT
Agen luar berjalan pada VPS dengan IPv4 publik
Agen dalam akan mengirimkan datagram UDP ke IP publik dan port agen luar, ini akan membuat lubang pada kedua NAT, agen luar akan menerima datagram ini dan belajar dari alamat sumber dan port mereka cara mengirim datagram kembali ke agen dalam .
Klien VPN dapat mengirimkan UDP ke agen luar dan datagram ini akan diteruskan ke agen dalam dan dari sana ke server VPN, server VPN dapat membalas ke agen dalam, ini akan diteruskan ke agen luar dan dari sana ke klien VPN.
Agen luar akan muncul sebagai server VPN bagi klien, dan agen dalam akan muncul sebagai klien VPN ke server.
Koneksi beberapa klien dimungkinkan karena akan menggunakan terowongan dan soket baru di agen dalam untuk setiap klien baru yang terhubung di luar, sehingga ke server akan tampak seolah-olah beberapa klien berjalan di host agen dalam.
Kloning atau unzip kode di kedua mesin dan buatlah. Anda memerlukan setidaknya make dan gcc. Masuk ke direktori sumber dan gunakan perintah
$ make
Setelah berhasil membangun, Anda berakhir dengan udp-tunnel
biner di folder yang sama. Sekarang Anda dapat memulainya langsung dari terminal (tentu saja dengan opsi yang tepat) untuk melakukan beberapa tes cepat, atau Anda dapat menginstalnya dengan bantuan makefile.
udp-tunnel
biner yang dikompilasi dapat bertindak sebagai agen dalam atau sebagai agen luar, bergantung pada opsi apa yang Anda berikan pada baris perintah.
Asumsikan sebagai contoh server VPN mendengarkan pada UDP 1234, berjalan di localhost (sama seperti agen dalam) dan mesin luarnya adalah jump.example.com dan kami ingin mesin tersebut mendengarkan pada port UDP 9999.
Di dalam host kita memulainya
$ ./udp-tunnel -s localhost:1234 -o jump.example.com:9999
Di host luar kita memulainya
$ ./udp-tunnel -l 9999
Makefile berisi 3 target instalasi: install
untuk menginstal hanya biner, install-outside
dan install-inside
untuk juga menginstal file layanan systemd. Dua variabel terakhir perlu diteruskan agar dapat berfungsi dengan baik.
Untuk menginstal agen luar pada host lompat (dengan asumsi Anda menginginkan port 9999), jalankan perintah ini:
$ sudo make install-outside listen=9999
Ini akan menginstal biner ke /usr/local/bin/
dan menginstal file layanan systemd ke /etc/systemd/system/
berisi perintah yang diperlukan untuk memulainya dalam mode agen luar dengan port 9999.
Untuk menginstal agen dalam pada mesin bagian dalam, gunakan perintah berikut (dengan asumsi sebagai contoh server vpn Anda adalah localhost:1234 dan host lompat Anda adalah jump.example.com):
$ sudo make install-inside service=localhost:1234 outside=jump.example.com:9999
Ini akan menginstal lagi biner ke /usr/local/bin/
dan file unit systemd ke /etc/systemd/system/
Pada titik ini Anda mungkin ingin melihat sekilas file unit systemd untuk melihat bagaimana biner digunakan dan untuk memeriksa apakah opsinya benar. Opsinya akan terlihat seperti dijelaskan di atas dalam tes cepat.
Setelah file systemd diinstal dan dipastikan benar, file tersebut belum diaktifkan untuk autostart, Anda perlu mengaktifkan dan memulainya. Di mesin Inside:
$ sudo systemctl enable udp-tunnel-inside.service
$ sudo systemctl start udp-tunnel-inside.service
dan di mesin luar
$ sudo systemctl enable udp-tunnel-outside.service
$ sudo systemctl start udp-tunnel-outside.service
Tidak ada enkripsi. Paket diteruskan sebagaimana adanya, diasumsikan bahwa layanan apa pun yang Anda terowongankan mengetahui cara melindungi atau mengenkripsi datanya sendiri. Biasanya hal ini terjadi pada koneksi VPN.
Selain itu, penyerang mungkin ingin memalsukan paket keepalive dari agen dalam untuk membingungkan agen luar dan mengalihkan terowongan ke mesinnya sendiri, sehingga mengakibatkan gangguan layanan. Untuk mencegah serangan yang sangat sederhana ini, datagram Keepalive dapat diautentikasi dengan kode otentikasi pesan berbasis hash. Anda dapat menggunakan kata sandi yang dibagikan sebelumnya menggunakan opsi -k di kedua ujung terowongan untuk mengaktifkan fitur ini.
Di dalam host Anda akan menggunakannya seperti ini
$ ./udp-tunnel -s localhost:1234 -o jump.example.com:9999 -k mysecretpassword
Di host luar tempat Anda akan memulainya
$ ./udp-tunnel -l 9999 -k mysecretpassword
Setelah langkah-langkah instalasi di atas berhasil, Anda mungkin ingin mengedit file systemd Anda secara manual di kedua ujungnya dan menambahkan opsi -k, lalu memuat ulang dan memulai ulang di kedua ujungnya.
Pesan keepalive kemudian akan berisi SHA-256 atas kata sandi ini dan peningkatan nonce yang hanya dapat digunakan tepat satu kali untuk mencegah serangan replay sederhana.
Kedua agen menyimpan daftar koneksi, setiap koneksi menyimpan alamat soket dan pegangan soket yang terkait dengan koneksi klien tertentu.
Saat startup, agen dalam akan memulai terowongan keluar ke agen luar, menandainya sebagai tidak digunakan dan mengirimkan paket keepalive melaluinya. Agen luar akan melihat paket-paket ini dan menambahkan terowongan ini dengan alamat sumbernya ke daftar koneksinya sendiri. Paket keepalive ditandatangani dengan nonce dan kode otentikasi, sehingga tidak dapat dipalsukan atau diputar ulang.
Ketika klien terhubung, agen luar akan mengirimkan data klien ke terowongan cadangan yang tidak terpakai, agen dalam akan melihatnya, menandai terowongan sebagai aktif, membuat soket untuk berkomunikasi dengan layanan dan meneruskan data di kedua arah. Kemudian juga akan segera membuat terowongan keluar baru lainnya agar siap untuk klien masuk berikutnya.
Ketika terowongan cadangan baru tiba di agen luar, terowongan tersebut akan menambahkannya ke daftar koneksinya sendiri agar dapat segera melayani klien penghubung berikutnya.
Pada titik ini kedua agen memiliki 2 terowongan dalam daftar mereka, satu aktif dan satu lagi cadangan, menunggu koneksi klien berikutnya.
batas waktu ketidakaktifan akan memastikan bahwa terowongan mati (yang telah ditandai aktif di masa lalu tetapi tidak ada data klien untuk beberapa waktu) akan dihapus dan soketnya akan ditutup. Agen dalam akan mendeteksi kekurangan data yang diteruskan untuk waktu yang lama, menghapusnya dari daftarnya sendiri dan menutup soketnya, kemudian beberapa waktu kemudian agen luar akan mendeteksi bahwa tidak ada lagi penjaga yang datang untuk koneksi ini dan menghapusnya dari daftarnya sendiri. daftar juga.
Kode ini masih sangat eksperimental, jadi jangan mendasarkan bisnis bernilai jutaan dolar pada kode ini, setidaknya untuk saat ini. Ini sangat sesuai dengan tujuannya bagi saya, tetapi mungkin saja crash dan membakar serta meledakkan server Anda untuk Anda. Anda telah diperingatkan.