skcptun
skcptun adalah terowongan KCP terenkripsi untuk OpenWRT dan Linux dan MacOS, diimplementasikan dalam bahasa C dan Lua.
negara
- “Bukannya tidak bisa digunakan”
- Saat ini, ini adalah versi dengan Lua yang ditambahkan, dan versi C murni tidak lagi dipertahankan.
ciri
- Berdasarkan terowongan terenkripsi UDP yang andal, data transmisi terenkripsi tidak memiliki karakteristik.
- Ini dapat digunakan untuk mempercepat koneksi jaringan, dengan mode cepat dan mode normal. Kecepatan transmisi terukur dari mode cepat jauh lebih besar daripada transmisi TCP. (tanda bangku)
- Saat ini mendukung dua mode: mode TUN dan mode TCP
- Dalam mode TUN, klien dan server masing-masing membuat kartu jaringan virtual pada segmen jaringan yang sama. Klien secara transparan mengirimkan semua paket IP ke server melalui terowongan KCP terenkripsi, mirip dengan mode VPN tradisional.
- Dalam mode TCP, klien mendengarkan satu (atau lebih) port dan secara transparan mengirimkan semua data yang diterima ke server melalui terowongan KCP terenkripsi. Server secara transparan mengirimkan data ke server yang ditunjuk.
- Anda dapat menggunakan skrip Lua untuk mengimplementasikan layanan kustomisasi Anda sendiri berdasarkan API yang disediakan oleh skcptun.
Memasang
Lingkungan operasi: Linux, MacOS
Perpustakaan yang bergantung: OpenSSL, libev
Setelah mengunduh kode sumber dan membuka ritsletingnya:
cd skcptun
mkdir build
cd build
cmake ..
make
Jika Anda mengkloning secara langsung, Anda perlu memperbarui submodul:
git submodule update --init --recursive
Konfigurasi lingkungan
Modus TCP
- Konfigurasikan file konfigurasi dan mulai menggunakannya
Modus TUN
- Karena terowongan dibuat melalui teknologi kartu jaringan virtual, pengaturan jaringan yang diperlukan perlu dilakukan.
- Mengambil Linux (Debian) sebagai contoh, kernel perlu mendukung modul tun. Konfirmasikan dengan perintah "modinfo tun".
- Memerlukan instalasi toolkit "iproute2" dan "iptables".
pelayan
- Aktifkan penerusan IP, tambahkan konfigurasi berikut ke file "/etc/sysctl.conf", dan jalankan "sysctl -p" agar diterapkan.
net.ipv4.ip_forward=1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.route_localnet = 1
net.ipv4.conf.[网卡接口].route_localnet = 1
net.ipv4.conf.lo.route_localnet = 1
net.ipv4.conf.[虚拟网卡接口].route_localnet = 1
- Aktifkan penerusan ip dan ubah kebijakan penerusan default "iptables -P FORWARD ACCEPT"
- Ubah alamat sumber nat ke alamat kartu jaringan egress "iptables -t nat -A POSTROUTING -s 192.168.2.1/24 -o enp1s0 -j MASQUERADE"
klien
menggunakan
- configfile adalah file konfigurasi
- Jika ini mode TUN, izin root diperlukan untuk menjalankannya.
Berkas konfigurasi:
File konfigurasinya adalah file Lua, lihat "skcptun_config_sample", ada komentar di dalamnya.
Variabel internal disediakan oleh skcptun
skt
"skt" adalah variabel global bawaan yang digunakan oleh skrip Lua, termasuk "skt.conf.*", "skt.api.*", dan "skt.cb.*".
Informasi konfigurasi skcptun
"skt.conf.*": Variabel informasi konfigurasi yang diekspos oleh skcptun ke skrip Lua.
skt.conf.tun_ip
IP kartu jaringan virtual, klien dan server harus diatur ke segmen jaringan yang sama, valid dalam mode "tun_client" dan "tun_server".
skt.conf.tun_mask
Subnet mask kartu jaringan virtual, pengaturan klien dan server konsisten, dan valid dalam mode "tun_client" dan "tun_server".
skt.conf.skcp_serv_conf_list_size
Nomor "skcp_serv_conf".
skt.conf.skcp_serv_conf_list[i].mentah
Pointer "skcp_serv_conf" ke-i itu sendiri digunakan untuk meneruskan parameter ke API.
skt.conf.skcp_serv_conf_list[i].addr
Alamat IP dari "skcp_serv_conf" ke-i
skt.conf.skcp_serv_conf_list[i].pelabuhan
Port "skcp_serv_conf" ke-i
skt.conf.skcp_serv_conf_list[i].kunci
String terenkripsi dari "skcp_serv_conf" ke-i
skt.conf.skcp_serv_conf_list[i].tiket
Tiket akses yang disepakati antara klien dan server "skcp_serv_conf" ke-i valid dalam mode "tun_client" dan "proxy_client".
skt.conf.skcp_serv_conf_list[i].max_conn_cnt
Jumlah koneksi maksimum untuk "skcp_serv_conf" ke-i, valid dalam mode "proxy_server" dan "tun_server".
Konfigurasi skt.conf.skcp_cli_conf_list* sama dengan skt.conf.skcp_serv_conf_list*
skt.conf.etcp_serv_conf_list_size
Jumlah "etcp_serv_conf_list"
skt.conf.etcp_serv_conf_list[i].raw
Pointer server tcp "etcp_serv_conf" sendiri digunakan untuk meneruskan parameter ke API.
skt.conf.etcp_serv_conf_list[i].addr
Alamat mendengarkan server tcp.
skt.conf.etcp_serv_conf_list[i].port
Port mendengarkan server tcp.
skt.conf.etcp_cli_conf_list_size
Jumlah "etcp_cli_conf_list"
skt.conf.etcp_cli_conf_list[i].raw
Pointer klien tcp "etcp_cli_conf" sendiri digunakan untuk meneruskan parameter ke API.
skt.conf.etcp_cli_conf_list[i].addr
Alamat koneksi klien tcp, valid dalam mode "server proxy".
skt.conf.etcp_cli_conf_list[i].port
Port koneksi klien tcp, valid dalam mode "server proxy".
API Lua internal disediakan oleh skcptun
"skt.api.*", API yang diekspos oleh skcptun ke skrip Lua.
skt.api.skcp_init(conf, loop, skcp_mode)
Inisialisasi skcp.
- parameter
- conf: konfigurasi skcp
- loop: objek loop acara
- skcp_mode: mode startup skcp, integer, 1 mewakili mode server, 2 mewakili mode klien
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan objek skcp
skt.api.skcp_free(skcp)
Hancurkan dan lepaskan skcp.
- parameter
- Nilai pengembalian: Tidak ada
skt.api.skcp_req_cid(skcp, tiket)
Minta id koneksi dari server skcp.
- parameter
- objek skcp
- tiket: tiket yang sesuai dalam informasi konfigurasi, string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Kembalikan "ok" dengan sukses
skt.api.skcp_send(skcp, cid, buf)
Kirim pesan melalui skcp.
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- buf: isi pesan, string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan jumlah byte yang berhasil dikirim >= 0, bilangan bulat
skt.api.skcp_close_conn(skcp, cid)
Tutup koneksi skcp.
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan 0, bilangan bulat
skt.api.skcp_get_conn(skcp, cid)
Dapatkan koneksi skcp.
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Objek koneksi sukses
skt.api.etcp_server_init(conf, loop)
Inisialisasi server dll.
- parameter
- conf: konfigurasi skcp
- loop: objek loop acara
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan objek server dll
skt.api.etcp_server_free(dll)
Hancurkan dan lepaskan server dll.
- parameter
- Nilai pengembalian Tidak ada
skt.api.etcp_server_send(etcp, fd, buf)
Kirim pesan ke klien melalui dll.
- parameter
- objek server dll
- fd: fd yang sesuai, bilangan bulat
- buf: isi pesan, string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan jumlah byte yang berhasil dikirim > 0, bilangan bulat
skt.api.etcp_server_get_conn(dll, fd)
Dapatkan koneksi ke server dll.
- parameter
- objek server dll
- fd: fd yang sesuai, bilangan bulat
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan objek conn
skt.api.etcp_server_close_conn(etcp, fd, diam)
Tutup koneksi server dll.
- parameter
- objek server dll
- fd: fd yang sesuai, bilangan bulat
- Diam: Apakah akan menutup secara diam-diam. Jika tidak ditutup secara diam-diam, acara "on_close" akan terpicu.
- Nilai pengembalian: Tidak ada
skt.api.etcp_client_init(conf, loop)
Inisialisasi klien dll.
- parameter
- conf: konfigurasi skcp
- loop: objek loop acara
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan objek klien dll
skt.api.etcp_client_free(dll)
Hancurkan dan lepaskan klien dll.
- parameter
- Nilai pengembalian: Tidak ada
skt.api.etcp_client_send(etcp, fd, buf)
Kirim pesan ke server melalui dll.
- parameter
- objek klien dll
- fd: fd yang sesuai, bilangan bulat
- buf: isi pesan, string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan jumlah byte yang berhasil dikirim > 0, bilangan bulat
skt.api.etcp_client_create_conn(dll, addr, port)
Buat koneksi dll.
- parameter
- objek klien dll
- addr: Perlu terhubung ke alamat server, string
- port: Perlu terhubung ke port server
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan fd yang dibuat, tipe integer
skt.api.etcp_client_close_conn(dll, fd)
Tutup koneksi klien dll.
- parameter
- objek klien dll
- fd: fd yang sesuai, bilangan bulat
- Nilai pengembalian: Tidak ada
skt.api.etcp_client_get_conn(dll, fd)
Dapatkan koneksi klien dll.
- parameter
- objek klien dll
- fd: fd yang sesuai, bilangan bulat
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan objek conn
skt.api.tuntap_write(fd, buf)
Tulis data ke kartu jaringan virtual.
- parameter
- fd: fd dari kartu jaringan virtual, bilangan bulat
- buf: data yang akan ditulis, string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Jumlah byte yang berhasil ditulis, bilangan bulat
skt.api.get_from_skcp(skcp, nama)
Dapatkan nilai field yang sesuai pada objek skcp, yaitu: "skcp.name".
- parameter
- objek skcp
- nama: nama bidang di skcp, saat ini hanya mendukung bidang "fd", string
- nilai kembalian
- Kegagalan mengembalikan "nihil, error_msg"
- Berhasil mengembalikan nilai yang sesuai dengan nama, apa saja
skt.api.get_ms()
Dapatkan jumlah milidetik sejak tahun 1970 untuk sistem saat ini.
- Parameter: Tidak ada
- Nilai pengembalian:
skt.api.hton32(i)
Konversikan variabel integer 32-bit dari urutan byte host ke urutan byte jaringan.
- parameter
- i: Tipe integer dalam urutan byte host
- nilai kembalian
- Mengembalikan bilangan bulat dalam urutan byte jaringan
skt.api.ntoh32(i)
Konversikan variabel integer 32-bit dari urutan byte jaringan ke urutan byte host.
- parameter
- i: Tipe integer dalam urutan byte jaringan
- nilai kembalian
- Mengembalikan bilangan bulat dalam urutan byte host
skt.api.band(a, b)
Lakukan operasi logika AND bitwise pada dua bilangan bulat dan kembalikan hasilnya
skt.api.bor(a, b)
Lakukan operasi logika OR bitwise pada dua bilangan bulat dan kembalikan hasilnya
skt.api.bxor(a, b)
Lakukan operasi XOR bitwise pada dua bilangan bulat dan kembalikan hasilnya
skt.api.blshift(i, n)
Geser bilangan bulat ke kiri sebanyak n bit dan kembalikan hasilnya
skt.api.brshift(i, n)
Geser bilangan bulat ke kanan sebanyak n bit dan kembalikan hasilnya
skt.api.lookup_dns(domain)
Resolusi nama domain
- parameter
- domain: nama domain yang akan diselesaikan, string
- nilai kembalian
- Mengembalikan IP yang sesuai dalam format titik-titik (IPV4), string
Antarmuka panggilan balik yang perlu diimplementasikan oleh skrip Lua
"skt.cb.*" perlu mengimplementasikan antarmuka yang berbeda sesuai dengan mode startup yang berbeda untuk panggilan balik skcptun.
skt.cb.on_init(lingkaran)
Antarmuka panggilan balik pertama dipanggil saat skrip dimulai, dan hanya dipanggil sekali
- Rentang valid: semua mode
- parameter
- Nilai pengembalian: Tidak ada
skt.cb.on_skcp_accept(skcp, cid)
Server skcp berhasil membuat cid dan hanya dipanggil satu kali untuk setiap koneksi.
- Rentang yang valid: "proxy_server", "tun_server"
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- Nilai pengembalian: Tidak ada
skt.cb.on_skcp_check_ticket(skcp, tiket)
Server skcp memverifikasi apakah tiketnya benar.
- Rentang yang valid: "proxy_server", "tun_server"
- parameter
- objek skcp
- tiket: tiket yang perlu diverifikasi, string
- Nilai pengembalian:
- Mengembalikan 0 jika verifikasi berhasil
- Jika verifikasi gagal, nilai bukan nol akan dikembalikan.
skt.cb.on_skcp_recv_cid(skcp, cid)
skcp menerima cid, yang menunjukkan bahwa koneksi telah berhasil dibuat dengan server skcp. Artinya, struktur asinkron "skt.api.skcp_req_cid(skcp, ticket)" dikembalikan.
- Rentang yang valid: "proxy_client", "tun_client"
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- Nilai pengembalian: Tidak ada
skt.cb.on_skcp_recv_data(skcp, cid, buf)
skcp menerima data yang sesuai dengan koneksi cid.
- Rentang valid: semua mode
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- buf: menerima isi pesan, string
- Nilai pengembalian: Tidak ada
skt.cb.on_skcp_close(skcp, cid)
Callback saat skcp menutup koneksi secara umum mungkin disebabkan oleh timeout atau menerima perintah close dari peer. Koneksi belum benar-benar ditutup saat ini.
- Rentang valid: semua mode
- parameter
- objek skcp
- cid: id koneksi skcp, integer
- Nilai pengembalian: Tidak ada
skt.cb.on_tcp_accept(fd)
Server tcp menerima permintaan koneksi.
- Rentang yang valid: "proxy_client", "tun_client"
- parameter
- fd: fd diminta oleh koneksi, bilangan bulat
- Nilai pengembalian: Tidak ada
skt.cb.on_tcp_recv(fd, buf)
Terima data tcp yang sesuai dengan koneksi fd.
- Rentang valid: semua mode
- parameter
- fd: fd koneksi, bilangan bulat
- buf: menerima isi pesan, string
- Nilai pengembalian: Tidak ada
skt.cb.on_tcp_close(fd)
Tutup koneksi tcp yang sesuai dengan fd. Koneksi belum benar-benar ditutup saat ini.
- Rentang valid: semua mode
- parameter
- fd: fd koneksi, bilangan bulat
- Nilai pengembalian: Tidak ada
skt.cb.on_tun_read(buf)
Menerima data dari kartu jaringan virtual.
- Rentang yang valid: "tun_client", "tun_server"
- parameter
- buf: menerima isi pesan, string
- Nilai pengembalian: Tidak ada
skt.cb.on_beat()
Memicu panggilan setiap detik.
- Rentang yang valid: "proxy_client", "tun_client"
- Parameter: Tidak ada
- Nilai pengembalian: Tidak ada
tes
lingkungan
- Server:Linux/1C/1G
- Klien: MacOS/8C/8G
- Status jaringan, nilai ping:
21 packets transmitted, 20 packets received, 4.8% packet loss
round-trip min/avg/max/stddev = 159.492/164.087/171.097/3.232 ms
Memproses data (RTT)
- Jumlah koneksi: 1; paket data: 1000; interval pengiriman: 100ms
TCP RTT:
------------
Min = 161.0
Max = 1239.0
Average = 293.956
NR = 1000
Skcptun RTT:
------------
Min = 160.0
Max = 487.0
Average = 181.618
NR = 1000
- Jumlah koneksi: 10; paket data: 1000; interval pengiriman: 100ms
TCP RTT:
------------
Min = 159.0
Max = 1076.0
Average = 262.500
NR = 10000
Skcptun RTT:
------------
Min = 159.0
Max = 534.0
Average = 174.251
NR = 10000
sebagai kesimpulan
- Di bawah lingkungan jaringan yang sama, efek peningkatan kecepatan sekitar 30%-40%.
Melihat
- Baru saja selesai menulis, untuk penggunaan pribadi dan fungsinya sedang disempurnakan
- Harap pastikan untuk tidak menggunakannya untuk mempercepat enkripsi proxy sock5?