skcptun
skcptun ist ein verschlüsselter KCP-Tunnel für OpenWRT sowie Linux und MacOS, implementiert in C-Sprache und Lua.
Zustand
- „Es ist nicht so, dass es nicht verwendet werden kann“
- Derzeit handelt es sich um eine Version mit hinzugefügtem Lua und die reine C-Version wird nicht mehr gepflegt.
Merkmal
- Basierend auf einem zuverlässigen UDP-verschlüsselten Tunnel weisen die verschlüsselten Übertragungsdaten keine Eigenschaften auf.
- Es kann zur Beschleunigung von Netzwerkverbindungen im Schnellmodus und im Normalmodus verwendet werden. Die gemessene Übertragungsgeschwindigkeit im Schnellmodus ist viel höher als bei der TCP-Übertragung. (Benchmark)
- Unterstützt derzeit zwei Modi: TUN-Modus und TCP-Modus
- Im TUN-Modus erstellen Client und Server jeweils eine virtuelle Netzwerkkarte im selben Netzwerksegment. Der Client überträgt alle IP-Pakete transparent über den verschlüsselten KCP-Tunnel an den Server, ähnlich wie im herkömmlichen VPN-Modus.
- Im TCP-Modus überwacht der Client einen (oder mehrere) Ports und überträgt alle empfangenen Daten transparent über den verschlüsselten KCP-Tunnel. Der Server überträgt die Daten transparent an den angegebenen Server. Er wird im Allgemeinen verwendet, wenn der TUN-Modus blockiert ist.
- Sie können Lua-Skripte verwenden, um Ihre eigenen benutzerdefinierten Dienste basierend auf der von skcptun bereitgestellten API zu implementieren.
Installieren
Betriebsumgebung: Linux, MacOS
Abhängige Bibliotheken: OpenSSL, libev
Nachdem Sie den Quellcode heruntergeladen und entpackt haben:
cd skcptun
mkdir build
cd build
cmake ..
make
Wenn Sie direkt klonen, müssen Sie das Submodul aktualisieren:
git submodule update --init --recursive
Umgebungskonfiguration
TCP-Modus
- Konfigurieren Sie die Konfigurationsdatei und starten Sie sie zur Verwendung
TUN-Modus
- Da der Tunnel mithilfe der virtuellen Netzwerkkartentechnologie aufgebaut wird, müssen die erforderlichen Netzwerkeinstellungen vorgenommen werden.
- Am Beispiel von Linux (Debian) muss der Kernel das Tun-Modul unterstützen. Bestätigen Sie mit dem Befehl „modinfo tun“.
- Erfordert die Installation der Toolkits „iproute2“ und „iptables“.
Server
- Aktivieren Sie die IP-Weiterleitung, fügen Sie die folgende Konfiguration zur Datei „/etc/sysctl.conf“ hinzu und führen Sie „sysctl -p“ aus, damit sie wirksam wird.
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
- Aktivieren Sie die IP-Weiterleitung und ändern Sie die Standardweiterleitungsrichtlinie „iptables -P FORWARD ACCEPT“.
- Ändern Sie die Quelladresse von NAT in die Adresse der Ausgangsnetzwerkkarte „iptables -t nat -A POSTROUTING -s 192.168.2.1/24 -o enp1s0 -j MASQUERADE“
Kunde
- Aktivieren Sie die IP-Weiterleitung
verwenden
- configfile ist die Konfigurationsdatei
- Im TUN-Modus sind zum Ausführen Root-Berechtigungen erforderlich.
Konfigurationsdatei:
Die Konfigurationsdatei ist eine Lua-Datei, siehe „skcptun_config_sample“, darin sind Kommentare enthalten.
Von skcptun bereitgestellte interne Variablen
skt
„skt“ ist eine integrierte globale Variable, die von Lua-Skripten verwendet wird, einschließlich „skt.conf.*“, „skt.api.*“ und „skt.cb.*“.
Konfigurationsinformationen von skcptun
„skt.conf.*“: Konfigurationsinformationsvariablen, die von skcptun für Lua-Skripte bereitgestellt werden.
skt.conf.tun_ip
Die IP der virtuellen Netzwerkkarte, des Clients und des Servers müssen auf dasselbe Netzwerksegment eingestellt sein, gültig in den Modi „tun_client“ und „tun_server“.
skt.conf.tun_mask
Die Subnetzmaske der virtuellen Netzwerkkarte sowie die Client- und Servereinstellungen sind konsistent und in den Modi „tun_client“ und „tun_server“ gültig.
skt.conf.skcp_serv_conf_list_size
Die Nummer von „skcp_serv_conf“.
skt.conf.skcp_serv_conf_list[i].raw
Der i-te Zeiger „skcp_serv_conf“ selbst wird verwendet, um Parameter an die API zu übergeben.
skt.conf.skcp_serv_conf_list[i].addr
Die IP-Adresse des i-ten „skcp_serv_conf“
skt.conf.skcp_serv_conf_list[i].port
Der Port des i-ten „skcp_serv_conf“
skt.conf.skcp_serv_conf_list[i].key
Die verschlüsselte Zeichenfolge der i-ten „skcp_serv_conf“
skt.conf.skcp_serv_conf_list[i].ticket
Das zwischen dem i-ten Client und Server „skcp_serv_conf“ vereinbarte Zugriffsticket ist in den Modi „tun_client“ und „proxy_client“ gültig.
skt.conf.skcp_serv_conf_list[i].max_conn_cnt
Die maximale Anzahl von Verbindungen für die i-te „skcp_serv_conf“, gültig in den Modi „proxy_server“ und „tun_server“.
Die Konfiguration von skt.conf.skcp_cli_conf_list* ist dieselbe wie die von skt.conf.skcp_serv_conf_list*.
skt.conf.etcp_serv_conf_list_size
Die Anzahl von „etcp_serv_conf_list“
skt.conf.etcp_serv_conf_list[i].raw
Der Zeiger des TCP-Servers „etcp_serv_conf“ selbst wird verwendet, um Parameter an die API zu übergeben.
skt.conf.etcp_serv_conf_list[i].addr
Die Abhöradresse des TCP-Servers.
skt.conf.etcp_serv_conf_list[i].port
Der Überwachungsport des TCP-Servers.
skt.conf.etcp_cli_conf_list_size
Die Anzahl von „etcp_cli_conf_list“
skt.conf.etcp_cli_conf_list[i].raw
Der Zeiger des TCP-Clients „etcp_cli_conf“ selbst wird verwendet, um Parameter an die API zu übergeben.
skt.conf.etcp_cli_conf_list[i].addr
Die Verbindungsadresse des TCP-Clients, gültig im Modus „Proxyserver“.
skt.conf.etcp_cli_conf_list[i].port
Der Verbindungsport des TCP-Clients, gültig im Modus „Proxyserver“.
Interne Lua-API, bereitgestellt von skcptun
„skt.api.*“, die API, die skcptun Lua-Skripten zur Verfügung stellt.
skt.api.skcp_init(conf, loop, skcp_mode)
Skcp initialisieren.
- Parameter
- conf: Konfiguration von skcp
- Schleife: Ereignisschleifenobjekt
- skcp_mode: Skcp-Startmodus, Ganzzahl, 1 repräsentiert den Servermodus, 2 repräsentiert den Clientmodus
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt das skcp-Objekt erfolgreich zurück
skt.api.skcp_free(skcp)
Skcp zerstören und freigeben.
- Parameter
- Rückgabewert: Keiner
skt.api.skcp_req_cid(skcp, Ticket)
Fordern Sie die Verbindungs-ID vom SKCP-Server an.
- Parameter
- skcp-Objekt
- Ticket: Das entsprechende Ticket in den Konfigurationsinformationen, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Geben Sie „ok“ erfolgreich zurück
skt.api.skcp_send(skcp, cid, buf)
Senden Sie Nachrichten über skcp.
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- buf: Nachrichteninhalt, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt erfolgreich die Anzahl der erfolgreich gesendeten Bytes zurück >= 0, Ganzzahl
skt.api.skcp_close_conn(skcp, cid)
Schließen Sie eine SKCP-Verbindung.
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt erfolgreich 0 zurück, Ganzzahl
skt.api.skcp_get_conn(skcp, cid)
Stellen Sie eine SKCP-Verbindung her.
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Erfolgreiches Conn-Objekt
skt.api.etcp_server_init(conf, Schleife)
Etcp-Server initialisieren.
- Parameter
- conf: Konfiguration von skcp
- Schleife: Ereignisschleifenobjekt
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt das etcp-Serverobjekt erfolgreich zurück
skt.api.etcp_server_free(etcp)
Zerstören Sie den etcp-Server und geben Sie ihn frei.
- Parameter
- Rückgabewert: Keiner
skt.api.etcp_server_send(etcp, fd, buf)
Senden Sie Nachrichten über etcp an Kunden.
- Parameter
- etcp-Serverobjekt
- fd: entsprechendes fd, Ganzzahl
- buf: Nachrichteninhalt, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt erfolgreich die Anzahl der erfolgreich gesendeten Bytes zurück > 0, Ganzzahl
skt.api.etcp_server_get_conn(etcp, fd)
Stellen Sie eine Verbindung zu einem etcp-Server her.
- Parameter
- etcp-Serverobjekt
- fd: entsprechendes fd, Ganzzahl
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt das Conn-Objekt erfolgreich zurück
skt.api.etcp_server_close_conn(etcp, fd, Silent)
Schließen Sie eine etcp-Serververbindung.
- Parameter
- etcp-Serverobjekt
- fd: entsprechendes fd, Ganzzahl
- Silent: Gibt an, ob das Ereignis „on_close“ stillschweigend geschlossen wird. 1 bedeutet stilles Schließen, 0 bedeutet nicht stilles Schließen.
- Rückgabewert: Keiner
skt.api.etcp_client_init(conf, Schleife)
Etcp-Client initialisieren.
- Parameter
- conf: Konfiguration von skcp
- Schleife: Ereignisschleifenobjekt
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt das etcp-Clientobjekt erfolgreich zurück
skt.api.etcp_client_free(etcp)
Zerstören Sie den etcp-Client und geben Sie ihn frei.
- Parameter
- Rückgabewert: Keiner
skt.api.etcp_client_send(etcp, fd, buf)
Senden Sie Nachrichten über etcp an den Server.
- Parameter
- etcp-Clientobjekt
- fd: entsprechendes fd, Ganzzahl
- buf: Nachrichteninhalt, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt erfolgreich die Anzahl der erfolgreich gesendeten Bytes zurück > 0, Ganzzahl
skt.api.etcp_client_create_conn(etcp, addr, port)
Erstellen Sie eine etcp-Verbindung.
- Parameter
- etcp-Clientobjekt
- addr: Es muss eine Verbindung zur Serveradresse hergestellt werden, Zeichenfolge
- Port: Es muss eine Verbindung zum Server-Port hergestellt werden
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt den erstellten fd-Integer-Typ erfolgreich zurück
skt.api.etcp_client_close_conn(etcp, fd)
Schließen Sie eine etcp-Client-Verbindung.
- Parameter
- etcp-Clientobjekt
- fd: entsprechendes fd, Ganzzahl
- Rückgabewert: Keiner
skt.api.etcp_client_get_conn(etcp, fd)
Besorgen Sie sich eine etcp-Client-Verbindung.
- Parameter
- etcp-Clientobjekt
- fd: entsprechendes fd, Ganzzahl
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt das Conn-Objekt erfolgreich zurück
skt.api.tuntap_write(fd, buf)
Daten auf die virtuelle Netzwerkkarte schreiben.
- Parameter
- fd: fd der virtuellen Netzwerkkarte, Ganzzahl
- buf: Zu schreibende Daten, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Anzahl der erfolgreich geschriebenen Bytes, Ganzzahl
skt.api.get_from_skcp(skcp, name)
Rufen Sie den entsprechenden Feldwert im skcp-Objekt ab, nämlich: „skcp.name“.
- Parameter
- skcp-Objekt
- Name: Feldname in skcp, unterstützt derzeit nur das Feld „fd“, Zeichenfolge
- Rückgabewert
- Der Fehler gibt „nil, error_msg“ zurück.
- Gibt den Wert, der dem Namen „any“ entspricht, erfolgreich zurück
skt.api.get_ms()
Ermitteln Sie die Anzahl der Millisekunden seit 1970 für das aktuelle System.
- Parameter: Keine
- Rückgabewert:
skt.api.hton32(i)
Konvertieren Sie 32-Bit-Integer-Variablen von der Host-Byte-Reihenfolge in die Netzwerk-Byte-Reihenfolge.
- Parameter
- i: Ganzzahltyp in Host-Byte-Reihenfolge
- Rückgabewert
- Gibt eine Ganzzahl in Netzwerk-Byte-Reihenfolge zurück
skt.api.ntoh32(i)
Konvertieren Sie 32-Bit-Integer-Variablen von der Netzwerk-Byte-Reihenfolge in die Host-Byte-Reihenfolge.
- Parameter
- i: Ganzzahliger Typ in Netzwerk-Byte-Reihenfolge
- Rückgabewert
- Gibt eine Ganzzahl in Host-Byte-Reihenfolge zurück
skt.api.band(a, b)
Führen Sie eine bitweise logische UND-Operation für zwei Ganzzahlen durch und geben Sie das Ergebnis zurück
skt.api.bor(a, b)
Führen Sie eine bitweise logische ODER-Operation für zwei Ganzzahlen durch und geben Sie das Ergebnis zurück
skt.api.bxor(a, b)
Führen Sie eine bitweise XOR-Operation für zwei Ganzzahlen durch und geben Sie das Ergebnis zurück
skt.api.blshift(i, n)
Verschieben Sie die Ganzzahl um n Bits nach links und geben Sie das Ergebnis zurück
skt.api.brshift(i, n)
Verschieben Sie die Ganzzahl um n Bits nach rechts und geben Sie das Ergebnis zurück
skt.api.lookup_dns(domain)
Auflösung von Domainnamen
- Parameter
- Domäne: aufzulösender Domänenname, Zeichenfolge
- Rückgabewert
- Gibt die entsprechende IP im Punktformat (IPV4) als Zeichenfolge zurück
Die Rückrufschnittstelle, die das Lua-Skript implementieren muss
„skt.cb.*“ muss je nach Startmodus unterschiedliche Schnittstellen für den skcptun-Rückruf implementieren.
skt.cb.on_init(loop)
Die erste Rückrufschnittstelle, die beim Start des Skripts aufgerufen wird und nur einmal aufgerufen wird
- Gültiger Bereich: alle Modi
- Parameter
- Schleife: Ereignisschleifenobjekt
- Rückgabewert: Keiner
skt.cb.on_skcp_accept(skcp, cid)
Der Skcp-Server erstellt erfolgreich eine CID und wird für jede Verbindung nur einmal aufgerufen.
- Gültiger Bereich: „proxy_server“, „tun_server“
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- Rückgabewert: Keiner
skt.cb.on_skcp_check_ticket(skcp, Ticket)
Der Skcp-Server überprüft, ob das Ticket korrekt ist.
- Gültiger Bereich: „proxy_server“, „tun_server“
- Parameter
- skcp-Objekt
- Ticket: Ticket, das überprüft werden muss, Zeichenfolge
- Rückgabewert:
- Gibt 0 zurück, wenn die Überprüfung erfolgreich ist
- Wenn die Überprüfung fehlschlägt, wird ein Wert ungleich Null zurückgegeben.
skt.cb.on_skcp_recv_cid(skcp, cid)
skcp empfängt eine cid, die angibt, dass eine Verbindung erfolgreich mit dem skcp-Server hergestellt wurde. Das heißt, die asynchrone Struktur von „skt.api.skcp_req_cid(skcp, ticket)“ wird zurückgegeben.
- Gültiger Bereich: „proxy_client“, „tun_client“
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- Rückgabewert: Keiner
skt.cb.on_skcp_recv_data(skcp, cid, buf)
skcp empfängt die Daten, die der Verbindung von cid entsprechen.
- Gültiger Bereich: alle Modi
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- buf: Inhalt der empfangenen Nachricht, Zeichenfolge
- Rückgabewert: Keiner
skt.cb.on_skcp_close(skcp, cid)
Der Rückruf, wenn skcp eine Verbindung schließt, kann im Allgemeinen durch eine Zeitüberschreitung oder den Empfang eines Schließbefehls vom Peer verursacht werden. Die Verbindung wurde zu diesem Zeitpunkt noch nicht wirklich geschlossen.
- Gültiger Bereich: alle Modi
- Parameter
- skcp-Objekt
- cid: Verbindungs-ID von skcp, Ganzzahl
- Rückgabewert: Keiner
skt.cb.on_tcp_accept(fd)
Der TCP-Server empfängt eine Verbindungsanfrage.
- Gültiger Bereich: „proxy_client“, „tun_client“
- Parameter
- fd: von der Verbindung angeforderter fd, Ganzzahl
- Rückgabewert: Keiner
skt.cb.on_tcp_recv(fd, buf)
Empfangen Sie die TCP-Daten, die der Verbindung von fd entsprechen.
- Gültiger Bereich: alle Modi
- Parameter
- fd: fd der Verbindung, Ganzzahl
- buf: Inhalt der empfangenen Nachricht, Zeichenfolge
- Rückgabewert: Keiner
skt.cb.on_tcp_close(fd)
Schließen Sie die TCP-Verbindung, die fd entspricht. Die Verbindung wurde zu diesem Zeitpunkt noch nicht wirklich geschlossen.
- Gültiger Bereich: alle Modi
- Parameter
- fd: fd der Verbindung, Ganzzahl
- Rückgabewert: Keiner
skt.cb.on_tun_read(buf)
Daten von der virtuellen Netzwerkkarte empfangen.
- Gültiger Bereich: „tun_client“, „tun_server“
- Parameter
- buf: Inhalt der empfangenen Nachricht, Zeichenfolge
- Rückgabewert: Keiner
skt.cb.on_beat()
Löst jede Sekunde einen Anruf aus.
- Gültiger Bereich: „proxy_client“, „tun_client“
- Parameter: Keine
- Rückgabewert: Keiner
prüfen
Umfeld
- Server:Linux/1C/1G
- Client: MacOS/8C/8G
- Netzwerkstatus, Ping-Wert:
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
Prozessdaten (RTT)
- Anzahl der Verbindungen: 1; Datenpakete: 1000; Sendeintervall: 100 ms
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
- Anzahl der Verbindungen: 10; Datenpakete: 1000; Sendeintervall: 100 ms
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
abschließend
- In derselben Netzwerkumgebung beträgt der Geschwindigkeitsverbesserungseffekt etwa 30–40 %.
Beachten
- Gerade mit dem Schreiben fertig, für den persönlichen Gebrauch und die Funktionen werden perfektioniert
- Bitte stellen Sie sicher, dass Sie den Sock5-Proxy nicht zur Beschleunigung der Verschlüsselung verwenden.