Home

Awesome

skcptun

skcptun is encrypted KCP tunnel for OpenWRT and Linux and MacOS, implemented in C language and Lua.

状态

特性

安装

运行环境:Linux,MacOS

依赖库:OpenSSLlibev

下载源码并解压后:

cd skcptun
mkdir build
cd build
cmake ..
make

如果是直接clone,需要更新子模块:

git submodule update --init --recursive

环境配置

TCP模式

TUN模式

服务端

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

客户端

使用

skcptun <configfile>

配置文件:

配置文件为Lua文件,参考“skcptun_config_sample”,内有注释。

skcptun 提供的内部变量

skt

“skt”是一个供Lua脚本使用的内置全局变量,包含了“skt.conf.* ”, “skt.api.* ”,“skt.cb.* ”三部分。

skcptun的配置信息

“skt.conf.*”:skcptun向Lua脚本暴露的配置信息变量。

skt.conf.tun_ip

虚拟网卡的ip,客户端和服务端需要设置为同一网段,“tun_client”和“tun_server”模式中有效。

skt.conf.tun_mask

虚拟网卡的子网掩码,客户端和服务端设置保持一致,“tun_client”和“tun_server”模式中有效。

skt.conf.skcp_serv_conf_list_size

“skcp_serv_conf”的个数。

skt.conf.skcp_serv_conf_list[i].raw

第i个“skcp_serv_conf”本身指针,用于给API传参。

skt.conf.skcp_serv_conf_list[i].addr

第i个“skcp_serv_conf”的IP地址

skt.conf.skcp_serv_conf_list[i].port

第i个“skcp_serv_conf”的端口

skt.conf.skcp_serv_conf_list[i].key

第i个“skcp_serv_conf”的加密串

skt.conf.skcp_serv_conf_list[i].ticket

第i个“skcp_serv_conf”的客户端和服务端约定的访问票据,“tun_client”和“proxy_client”模式中有效。

skt.conf.skcp_serv_conf_list[i].max_conn_cnt

第i个“skcp_serv_conf”的最大连接数,“proxy_server”和“tun_server”模式中有效。

skt.conf.skcp_cli_conf_list* 配置同 skt.conf.skcp_serv_conf_list*

skt.conf.etcp_serv_conf_list_size

"etcp_serv_conf_list"的个数

skt.conf.etcp_serv_conf_list[i].raw

tcp服务端“etcp_serv_conf”本身的指针,用于给API传参。

skt.conf.etcp_serv_conf_list[i].addr

tcp服务端的监听地址。

skt.conf.etcp_serv_conf_list[i].port

tcp服务端的监听端口。

skt.conf.etcp_cli_conf_list_size

"etcp_cli_conf_list"的个数

skt.conf.etcp_cli_conf_list[i].raw

tcp客户端“etcp_cli_conf”本身的指针,用于给API传参。

skt.conf.etcp_cli_conf_list[i].addr

tcp客户端的连接地址,在“proxy server”模式下有效。

skt.conf.etcp_cli_conf_list[i].port

tcp客户端的连接端口,在“proxy server”模式下有效。

skcptun 提供的内部 Lua API

“skt.api.*”,skcptun向Lua脚本暴露的API。

skt.api.skcp_init(conf, loop, skcp_mode)

初始化skcp。

skt.api.skcp_free(skcp)

销毁释放skcp。

skt.api.skcp_req_cid(skcp, ticket)

向skcp服务端请求connection id。

skt.api.skcp_send(skcp, cid, buf)

通过skcp发送消息。

skt.api.skcp_close_conn(skcp, cid)

关闭一个skcp的连接。

skt.api.skcp_get_conn(skcp, cid)

获得一个skcp的连接。

skt.api.etcp_server_init(conf, loop)

初始化etcp服务端。

skt.api.etcp_server_free(etcp)

销毁和释放etcp服务端。

skt.api.etcp_server_send(etcp, fd, buf)

通过etcp向客户端发送消息。

skt.api.etcp_server_get_conn(etcp, fd)

获得一个etcp服务端的连接。

skt.api.etcp_server_close_conn(etcp, fd, silent)

关闭一个etcp服务端的连接。

skt.api.etcp_client_init(conf, loop)

初始化etcp客户端。

skt.api.etcp_client_free(etcp)

销毁和释放etcp客户端。

skt.api.etcp_client_send(etcp, fd, buf)

通过etcp向服务端发送消息。

skt.api.etcp_client_create_conn(etcp, addr, port)

创建一个etcp连接。

skt.api.etcp_client_close_conn(etcp, fd)

关闭一个etcp客户端的连接。

skt.api.etcp_client_get_conn(etcp, fd)

获得一个etcp客户端的连接。

skt.api.tuntap_write(fd, buf)

往虚拟网卡写入数据。

skt.api.get_from_skcp(skcp, name)

获取skcp对象中对应字段值,即:“skcp.name”。

skt.api.get_ms()

获取当前系统自1970年以来的毫秒数。

skt.api.hton32(i)

将32位的整型变量从主机字节序转变成网络字节序。

skt.api.ntoh32(i)

将32位的整型变量从网络字节序转变成主机字节序。

skt.api.band(a, b)

将两个整型按位做逻辑与操作,返回结果

skt.api.bor(a, b)

将两个整型按位做逻辑或操作,返回结果

skt.api.bxor(a, b)

将两个整型按位做异或操作,返回结果

skt.api.blshift(i, n)

将整型按位左移n位,返回结果

skt.api.brshift(i, n)

将整型按位右移n位,返回结果

skt.api.lookup_dns(domain)

域名解析

Lua脚本需要实现的回调接口

“skt.cb.*”,根据不同的启动模式需要实现不一样的接口,以供skcptun回调。

skt.cb.on_init(loop)

脚本启动时第一个调用的回调接口,且只调用一次

skt.cb.on_skcp_accept(skcp, cid)

skcp服务端成功创建一个cid,每个connection只调用一次。

skt.cb.on_skcp_check_ticket(skcp, ticket)

skcp服务端校验ticket是否正确。

skt.cb.on_skcp_recv_cid(skcp, cid)

skcp收到一个cid,表示成功和skcp服务端创建了一个连接。即“skt.api.skcp_req_cid(skcp, ticket)”的异步结构返回。

skt.cb.on_skcp_recv_data(skcp, cid, buf)

skcp收到cid对应连接的数据。

skt.cb.on_skcp_close(skcp, cid)

skcp关闭一个连接时的回调,一般可能是超时引起的或者收到对端的close命令,此刻连接还未真正关闭。

skt.cb.on_tcp_accept(fd)

tcp服务端收到一个连接请求。

skt.cb.on_tcp_recv(fd, buf)

收到fd对应连接的tcp数据。

skt.cb.on_tcp_close(fd)

关闭fd对应的tcp连接,此刻连接还未真正关闭。

skt.cb.on_tun_read(buf)

收到来自虚拟网卡的数据。

skt.cb.on_beat()

每一秒触发一次调用。

测试

环境

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

过程数据(RTT)

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
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

结论

注意