skcptún
skcptun es un túnel KCP cifrado para OpenWRT, Linux y MacOS, implementado en lenguaje C y Lua.
estado
- "No es que no se pueda utilizar"
- Actualmente, es una versión con Lua agregado y la versión C pura ya no se mantiene.
característica
- Basado en un túnel cifrado UDP confiable, los datos de transmisión cifrados no tienen características.
- Se puede utilizar para acelerar las conexiones de red, con modo rápido y modo normal. La velocidad de transmisión medida del modo rápido es mucho mayor que la transmisión TCP. (punto de referencia)
- Actualmente admite dos modos: modo TUN y modo TCP
- En el modo TUN, el cliente y el servidor crean cada uno una tarjeta de red virtual en el mismo segmento de red. El cliente transmite de forma transparente todos los paquetes IP al servidor a través del túnel KCP cifrado, similar al modo VPN tradicional.
- En el modo TCP, el cliente escucha uno (o más) puertos y transmite de forma transparente todos los datos recibidos al servidor a través del túnel KCP cifrado. El servidor transmite de forma transparente los datos al servidor designado. Generalmente se usa cuando el modo TUN está bloqueado.
- Puede utilizar scripts Lua para implementar sus propios servicios personalizados basados en la API proporcionada por skcptun.
Instalar
Entorno operativo: Linux, MacOS
Bibliotecas dependientes: OpenSSL, libev
Después de descargar el código fuente y descomprimirlo:
cd skcptun
mkdir build
cd build
cmake ..
make
Si clona directamente, necesita actualizar el submódulo:
git submodule update --init --recursive
Configuración del entorno
modo TCP
- Configure el archivo de configuración e inícielo para usarlo
Modo SINTONIZACIÓN
- Dado que el túnel se establece mediante tecnología de tarjeta de red virtual, es necesario realizar los ajustes de red necesarios.
- Tomando Linux (Debian) como ejemplo, el kernel debe ser compatible con el módulo tun. Confirme con el comando "modinfo tun".
- Requiere tener instalados los kits de herramientas "iproute2" e "iptables".
Servidor
- Habilite el reenvío de IP, agregue la siguiente configuración al archivo "/etc/sysctl.conf" y ejecute "sysctl -p" para que surta efecto.
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
- Active el reenvío de IP y modifique la política de reenvío predeterminada "iptables -P FORWARD ACCEPT"
- Modifique la dirección de origen de nat a la dirección de la tarjeta de red de salida "iptables -t nat -A POSTROUTING -s 192.168.2.1/24 -o enp1s0 -j MASQUERADE"
cliente
usar
- configfile es el archivo de configuración
- Si está en modo TUN, se requieren permisos de root para ejecutarse.
Archivo de configuración:
El archivo de configuración es un archivo Lua, consulte "skcptun_config_sample", hay comentarios dentro.
Variables internas proporcionadas por skcptun
skt
"skt" es una variable global incorporada utilizada por los scripts de Lua, incluidos "skt.conf.*", "skt.api.*" y "skt.cb.*".
Información de configuración de skcptun
"skt.conf.*": Variables de información de configuración expuestas por skcptun a los scripts Lua.
skt.conf.tun_ip
La IP de la tarjeta de red virtual, el cliente y el servidor deben configurarse en el mismo segmento de red, válido en los modos "tun_client" y "tun_server".
skt.conf.tun_mask
La máscara de subred de la tarjeta de red virtual y la configuración del cliente y del servidor son consistentes y son válidas en los modos "tun_client" y "tun_server".
skt.conf.skcp_serv_conf_list_size
El número de "skcp_serv_conf".
skt.conf.skcp_serv_conf_list[i].raw
El i-ésimo puntero "skcp_serv_conf" se utiliza para pasar parámetros a la API.
skt.conf.skcp_serv_conf_list[i].addr
La dirección IP del i-ésimo "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].puerto
El puerto del i-ésimo "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].clave
La cadena cifrada del i-ésimo "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].ticket
El ticket de acceso acordado entre el i-ésimo cliente y servidor "skcp_serv_conf" es válido en los modos "tun_client" y "proxy_client".
skt.conf.skcp_serv_conf_list[i].max_conn_cnt
El número máximo de conexiones para el i-ésimo "skcp_serv_conf", válido en los modos "proxy_server" y "tun_server".
La configuración de skt.conf.skcp_cli_conf_list* es la misma que skt.conf.skcp_serv_conf_list*
skt.conf.etcp_serv_conf_list_size
El número de "etcp_serv_conf_list"
skt.conf.etcp_serv_conf_list[i].raw
El puntero del servidor tcp "etcp_serv_conf" se utiliza para pasar parámetros a la API.
skt.conf.etcp_serv_conf_list[i].addr
La dirección de escucha del servidor tcp.
skt.conf.etcp_serv_conf_list[i].puerto
El puerto de escucha del servidor tcp.
skt.conf.etcp_cli_conf_list_size
El número de "etcp_cli_conf_list"
skt.conf.etcp_cli_conf_list[i].raw
El puntero del cliente tcp "etcp_cli_conf" se utiliza para pasar parámetros a la API.
skt.conf.etcp_cli_conf_list[i].addr
La dirección de conexión del cliente tcp, válida en modo "servidor proxy".
skt.conf.etcp_cli_conf_list[i].puerto
El puerto de conexión del cliente tcp, válido en modo "servidor proxy".
API Lua interna proporcionada por skcptun
"skt.api.*", la API expuesta por skcptun a los scripts Lua.
skt.api.skcp_init(conf, bucle, skcp_mode)
Inicialice skcp.
- parámetro
- conf: configuración de skcp
- bucle: objeto de bucle de eventos
- skcp_mode: modo de inicio skcp, número entero, 1 representa el modo servidor, 2 representa el modo cliente
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el objeto skcp
skt.api.skcp_free(skcp)
Destruye y libera skcp.
- parámetro
- Valor de retorno: Ninguno
skt.api.skcp_req_cid(skcp, billete)
Solicite la identificación de conexión del servidor skcp.
- parámetro
- objeto skcp
- ticket: el ticket correspondiente en la información de configuración, cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve "ok" con éxito
skt.api.skcp_send(skcp, cid, buf)
Enviar mensajes a través de skcp.
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- buf: contenido del mensaje, cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve exitosamente el número de bytes enviados exitosamente >= 0, entero
skt.api.skcp_close_conn(skcp,cid)
Cierre una conexión skcp.
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve 0 con éxito, entero
skt.api.skcp_get_conn(skcp, cid)
Obtenga una conexión skcp.
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- valor de retorno
- El error devuelve "nulo, error_msg"
- Objeto de conexión exitosa
skt.api.etcp_server_init(conf, bucle)
Inicialice el servidor etcp.
- parámetro
- conf: configuración de skcp
- bucle: objeto de bucle de eventos
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el objeto del servidor etcp
skt.api.etcp_server_free(etcp)
Destruya y libere el servidor etcp.
- parámetro
- Valor de retorno Ninguno
skt.api.etcp_server_send(etcp, fd, buf)
Enviar mensajes a clientes a través de etcp.
- parámetro
- objeto del servidor etcp
- fd: fd correspondiente, número entero
- buf: contenido del mensaje, cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve exitosamente el número de bytes enviados exitosamente > 0, entero
skt.api.etcp_server_get_conn(etcp,fd)
Obtenga una conexión a un servidor etcp.
- parámetro
- objeto del servidor etcp
- fd: fd correspondiente, número entero
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el objeto de conexión.
skt.api.etcp_server_close_conn(etcp, fd, silencioso)
Cierre una conexión al servidor etcp.
- parámetro
- objeto del servidor etcp
- fd: fd correspondiente, número entero
- Silencioso: si se debe cerrar silenciosamente. Si no se cierra silenciosamente, se activará el evento "on_close". 1 significa cierre silencioso y 0 significa cierre no silencioso.
- Valor de retorno: Ninguno
skt.api.etcp_client_init(conf, bucle)
Inicialice el cliente etcp.
- parámetro
- conf: configuración de skcp
- bucle: objeto de bucle de eventos
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el objeto de cliente etcp
skt.api.etcp_client_free(etcp)
Destruya y libere el cliente etcp.
- parámetro
- Valor de retorno: Ninguno
skt.api.etcp_client_send(etcp, fd, buf)
Enviar mensajes al servidor a través de etcp.
- parámetro
- objeto de cliente etcp
- fd: fd correspondiente, número entero
- buf: contenido del mensaje, cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve exitosamente el número de bytes enviados exitosamente > 0, entero
skt.api.etcp_client_create_conn(etcp, dirección, puerto)
Crea una conexión etcp.
- parámetro
- objeto de cliente etcp
- addr: Necesita conectarse a la dirección del servidor, cadena
- puerto: Necesita conectarse al puerto del servidor
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el fd creado, tipo entero
skt.api.etcp_client_close_conn(etcp,fd)
Cierre una conexión de cliente etcp.
- parámetro
- objeto de cliente etcp
- fd: fd correspondiente, número entero
- Valor de retorno: Ninguno
skt.api.etcp_client_get_conn(etcp, fd)
Obtenga una conexión de cliente etcp.
- parámetro
- objeto de cliente etcp
- fd: fd correspondiente, número entero
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el objeto de conexión.
skt.api.tuntap_write(fd,buf)
Escriba datos en la tarjeta de red virtual.
- parámetro
- fd: fd de la tarjeta de red virtual, número entero
- buf: datos a escribir, cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Número de bytes escritos correctamente, entero
skt.api.get_from_skcp(skcp, nombre)
Obtenga el valor del campo correspondiente en el objeto skcp, a saber: "skcp.name".
- parámetro
- objeto skcp
- nombre: nombre del campo en skcp, actualmente solo admite el campo "fd", cadena
- valor de retorno
- El error devuelve "nulo, error_msg"
- Devuelve con éxito el valor correspondiente al nombre, cualquiera
skt.api.get_ms()
Obtenga la cantidad de milisegundos desde 1970 para el sistema actual.
- Parámetros: Ninguno
- Valor de retorno:
skt.api.hton32(i)
Convierta variables enteras de 32 bits del orden de bytes del host al orden de bytes de la red.
- parámetro
- i: tipo entero en orden de bytes del host
- valor de retorno
- Devuelve un número entero en el orden de bytes de la red.
skt.api.ntoh32(i)
Convierta variables enteras de 32 bits del orden de bytes de la red al orden de bytes del host.
- parámetro
- i: tipo entero en orden de bytes de red
- valor de retorno
- Devuelve un número entero en orden de bytes del host
skt.api.band(a, b)
Realice una operación AND lógica bit a bit en dos números enteros y devuelva el resultado
skt.api.bor(a,b)
Realizar una operación lógica OR bit a bit en dos números enteros y devolver el resultado
skt.api.bxor(a,b)
Realice una operación XOR bit a bit en dos números enteros y devuelva el resultado
skt.api.blshift(i,n)
Desplaza el número entero hacia la izquierda n bits y devuelve el resultado
skt.api.brshift(yo, n)
Desplaza el número entero hacia la derecha n bits y devuelve el resultado
skt.api.lookup_dns(dominio)
Resolución de nombres de dominio
- parámetro
- dominio: nombre de dominio a resolver, cadena
- valor de retorno
- Devuelve la IP correspondiente en formato de puntos (IPV4), cadena
La interfaz de devolución de llamada que el script Lua necesita implementar
"skt.cb.*" necesita implementar diferentes interfaces según los diferentes modos de inicio para la devolución de llamada de skcptun.
skt.cb.on_init(bucle)
La primera interfaz de devolución de llamada se llama cuando se inicia el script y solo se llama una vez
- Rango válido: todos los modos
- parámetro
- bucle: objeto de bucle de eventos
- Valor de retorno: Ninguno
skt.cb.on_skcp_accept(skcp,cid)
El servidor skcp crea con éxito un cid y solo se llama una vez para cada conexión.
- Rango válido: "proxy_server", "tun_server"
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- Valor de retorno: Ninguno
skt.cb.on_skcp_check_ticket(skcp, billete)
El servidor skcp verifica si el ticket es correcto.
- Rango válido: "proxy_server", "tun_server"
- parámetro
- objeto skcp
- ticket: ticket que necesita ser verificado, cadena
- Valor de retorno:
- Devuelve 0 si la verificación es exitosa
- Si la verificación falla, se devuelve un valor distinto de cero.
skt.cb.on_skcp_recv_cid(skcp, cid)
skcp recibe un cid, lo que indica que se ha establecido correctamente una conexión con el servidor skcp. Es decir, se devuelve la estructura asincrónica de "skt.api.skcp_req_cid(skcp, ticket)".
- Rango válido: "proxy_client", "tun_client"
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- Valor de retorno: Ninguno
skt.cb.on_skcp_recv_data(skcp, cid, buf)
skcp recibe los datos correspondientes a la conexión de cid.
- Rango válido: todos los modos
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- buf: contenido del mensaje recibido, cadena
- Valor de retorno: Ninguno
skt.cb.on_skcp_close(skcp, cid)
La devolución de llamada cuando skcp cierra una conexión generalmente puede deberse a un tiempo de espera o a la recepción de un comando de cierre del par. La conexión no se ha cerrado realmente en este momento.
- Rango válido: todos los modos
- parámetro
- objeto skcp
- cid: ID de conexión de skcp, número entero
- Valor de retorno: Ninguno
skt.cb.on_tcp_accept(fd)
El servidor TCP recibe una solicitud de conexión.
- Rango válido: "proxy_client", "tun_client"
- parámetro
- fd: fd solicitado por la conexión, número entero
- Valor de retorno: Ninguno
skt.cb.on_tcp_recv(fd, buf)
Reciba los datos tcp correspondientes a la conexión de fd.
- Rango válido: todos los modos
- parámetro
- fd: fd de la conexión, número entero
- buf: contenido del mensaje recibido, cadena
- Valor de retorno: Ninguno
skt.cb.on_tcp_close(fd)
Cierre la conexión tcp correspondiente a fd. La conexión no se ha cerrado realmente en este momento.
- Rango válido: todos los modos
- parámetro
- fd: fd de la conexión, número entero
- Valor de retorno: Ninguno
skt.cb.on_tun_read(buf)
Reciba datos de la tarjeta de red virtual.
- Rango válido: "tun_client", "tun_server"
- parámetro
- buf: contenido del mensaje recibido, cadena
- Valor de retorno: Ninguno
skt.cb.on_beat()
Activa una llamada cada segundo.
- Rango válido: "proxy_client", "tun_client"
- Parámetros: Ninguno
- Valor de retorno: Ninguno
prueba
ambiente
- Servidor:Linux/1C/1G
- Cliente:MacOS/8C/8G
- Estado de la red, valor de 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
Datos de proceso (RTT)
- Número de conexiones: 1; paquetes de datos: 1000; intervalo de envío: 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
- Número de conexiones: 10 paquetes de datos: 1000; intervalo de envío: 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
en conclusión
- En el mismo entorno de red, el efecto de mejora de la velocidad es de aproximadamente un 30% -40%.
Aviso
- Acabo de terminar de escribir, para uso personal y se están perfeccionando las funciones.
- ¿Asegúrese de no utilizarlo para acelerar el cifrado del proxy sock5?