сккптун
skcptun — это зашифрованный туннель KCP для OpenWRT, Linux и MacOS, реализованный на языках C и Lua.
состояние
- «Это не значит, что его нельзя использовать»
- В настоящее время это версия с добавленным Lua, а версия на чистом C больше не поддерживается.
характеристика
- Основанный на надежном зашифрованном туннеле UDP, зашифрованные передаваемые данные не имеют никаких характеристик.
- Его можно использовать для ускорения сетевых подключений в быстром и обычном режимах. Измеренная скорость передачи в быстром режиме намного превышает скорость передачи по TCP. (отметка)
- В настоящее время поддерживается два режима: режим TUN и режим TCP.
- В режиме TUN клиент и сервер создают виртуальную сетевую карту в одном и том же сегменте сети. Клиент прозрачно передает все IP-пакеты на сервер через зашифрованный туннель KCP, аналогично традиционному режиму VPN.
- В режиме TCP клиент прослушивает один (или несколько) портов и прозрачно передает все полученные данные на сервер через зашифрованный туннель KCP. Сервер прозрачно передает данные на назначенный сервер. Обычно он используется, когда режим TUN заблокирован.
- Вы можете использовать сценарии Lua для реализации собственных настраиваемых сервисов на основе API, предоставляемого skcptun.
Установить
Операционная среда: Linux, MacOS
Зависимые библиотеки: OpenSSL, libev.
После загрузки исходного кода и его распаковки:
cd skcptun
mkdir build
cd build
cmake ..
make
Если вы клонируете напрямую, вам необходимо обновить подмодуль:
git submodule update --init --recursive
Конфигурация среды
TCP-режим
- Настройте файл конфигурации и запустите его для использования
Режим TUN
- Поскольку туннель устанавливается с помощью технологии виртуальных сетевых карт, необходимо выполнить необходимые настройки сети.
- Если взять в качестве примера Linux (Debian), ядро должно поддерживать модуль tun. Подтвердите команду «modinfo tun».
- Требуется установленный набор инструментов «iproute2» и «iptables».
Сервер
- Включите переадресацию IP, добавьте следующую конфигурацию в файл «/etc/sysctl.conf» и выполните «sysctl -p», чтобы изменения вступили в силу.
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
- Включите переадресацию IP и измените политику переадресации по умолчанию «iptables -P FORWARD ACCEPT».
- Измените исходный адрес nat на адрес выходной сетевой карты «iptables -t nat -A POSTROUTING -s 192.168.2.1/24 -o enp1s0 -j MASQUERADE»
клиент
- Включить переадресацию IP
использовать
- configfile — это файл конфигурации
- Если это режим TUN, для запуска необходимы права root.
Конфигурационный файл:
Файл конфигурации представляет собой файл Lua, см. «skcptun_config_sample», внутри есть комментарии.
Внутренние переменные, предоставляемые skcptun
Скт
«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
IP-адрес i-го «skcp_serv_conf»
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-клиента, действительный в режиме «прокси-сервера».
skt.conf.etcp_cli_conf_list[i].port
Порт подключения TCP-клиента, действующий в режиме «прокси-сервера».
Внутренний Lua API, предоставленный skcptun
«skt.api.*», API, предоставляемый skcptun сценариям Lua.
skt.api.skcp_init(conf, цикл, skcp_mode)
Инициализируйте skcp.
- параметр
- conf: конфигурация skcp
- цикл: объект цикла событий
- skcp_mode: режим запуска skcp, целое число, 1 представляет режим сервера, 2 представляет режим клиента.
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает объект skcp
skt.api.skcp_free(skcp)
Уничтожьте и освободите skcp.
- параметр
- Возвращаемое значение: Нет
skt.api.skcp_req_cid(skcp, билет)
Запросите идентификатор соединения с сервера skcp.
- параметр
- объект skcp
- билет: соответствующий билет в информации о конфигурации, строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Верните «ок» успешно
skt.api.skcp_send(skcp, cid, buf)
Отправлять сообщения через skcp.
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- buf: содержимое сообщения, строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает количество успешно отправленных байт >= 0, целое число.
skt.api.skcp_close_conn(skcp, cid)
Закройте соединение SkCP.
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает 0, целое число
skt.api.skcp_get_conn(skcp, cid)
Получите соединение SkCP.
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Объект успешного подключения
skt.api.etcp_server_init(conf, цикл)
Инициализируйте сервер etcp.
- параметр
- conf: конфигурация skcp
- цикл: объект цикла событий
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает объект сервера etcp
skt.api.etcp_server_free(etcp)
Уничтожьте и освободите сервер etcp.
- параметр
- Возвращаемое значение Нет
skt.api.etcp_server_send(etcp, fd, buf)
Отправляйте сообщения клиентам через etcp.
- параметр
- объект сервера etcp
- fd: соответствующий fd, целое число
- buf: содержимое сообщения, строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает количество успешно отправленных байт > 0, целое число.
skt.api.etcp_server_get_conn(etcp, fd)
Получите соединение с сервером etcp.
- параметр
- объект сервера etcp
- fd: соответствующий fd, целое число
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает объект conn
skt.api.etcp_server_close_conn(etcp, fd, молчание)
Закройте соединение с сервером etcp.
- параметр
- объект сервера etcp
- fd: соответствующий fd, целое число
- Бесшумное закрытие: если оно не закрывается автоматически, будет вызвано событие «on_close». 1 означает тихое закрытие, 0 означает нетихое закрытие.
- Возвращаемое значение: Нет
skt.api.etcp_client_init(conf, цикл)
Инициализируйте клиент etcp.
- параметр
- conf: конфигурация skcp
- цикл: объект цикла событий
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает клиентский объект etcp
skt.api.etcp_client_free(etcp)
Уничтожьте и освободите клиент etcp.
- параметр
- Возвращаемое значение: Нет
skt.api.etcp_client_send(etcp, fd, buf)
Отправляйте сообщения на сервер через etcp.
- параметр
- клиентский объект etcp
- fd: соответствующий fd, целое число
- buf: содержимое сообщения, строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает количество успешно отправленных байт > 0, целое число.
skt.api.etcp_client_create_conn(etcp, адрес, порт)
Создайте соединение etcp.
- параметр
- клиентский объект etcp
- адрес: необходимо подключиться к адресу сервера, строка
- порт: необходимо подключиться к порту сервера
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает созданный fd, целочисленный тип.
skt.api.etcp_client_close_conn(etcp, fd)
Закройте соединение клиента etcp.
- параметр
- клиентский объект etcp
- fd: соответствующий fd, целое число
- Возвращаемое значение: Нет
skt.api.etcp_client_get_conn(etcp, fd)
Получите клиентское соединение etcp.
- параметр
- клиентский объект etcp
- fd: соответствующий fd, целое число
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает объект conn
skt.api.tuntap_write(фд, буф)
Запишите данные на виртуальную сетевую карту.
- параметр
- fd: fd виртуальной сетевой карты, целое число.
- buf: данные для записи, строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Количество успешно записанных байт, целое число
skt.api.get_from_skcp(skcp, имя)
Получите соответствующее значение поля в объекте skcp, а именно: «skcp.name».
- параметр
- объект skcp
- name: имя поля в skcp, в настоящее время поддерживается только поле «fd», строка
- возвращаемое значение
- Ошибка возвращает «ноль, error_msg»
- Успешно возвращает значение, соответствующее имени, любое
skt.api.get_ms()
Получите количество миллисекунд с 1970 года для текущей системы.
- Параметры: Нет
- Возвращаемое значение:
skt.api.hton32(я)
Преобразуйте 32-битные целочисленные переменные из порядка байтов хоста в порядок байтов в сети.
- параметр
- i: Целочисленный тип в порядке байтов хоста.
- возвращаемое значение
- Возвращает целое число в сетевом порядке байтов
skt.api.ntoh32(я)
Преобразуйте 32-битные целочисленные переменные из сетевого порядка байтов в порядок байтов хоста.
- параметр
- i: Целочисленный тип в сетевом порядке байтов.
- возвращаемое значение
- Возвращает целое число в порядке байтов хоста
skt.api.band(а, б)
Выполните поразрядную логическую операцию И над двумя целыми числами и верните результат.
skt.api.bor(а, б)
Выполните побитовую логическую операцию ИЛИ над двумя целыми числами и верните результат.
skt.api.bxor(а, б)
Выполните побитовую операцию XOR для двух целых чисел и верните результат.
skt.api.blshift(я, п)
Сдвиньте целое число влево на n бит и верните результат
skt.api.brshift(я, п)
Сдвиньте целое число вправо на n бит и верните результат.
skt.api.lookup_dns (домен)
Разрешение доменного имени
- параметр
- домен: имя домена, которое необходимо разрешить, строка
- возвращаемое значение
- Возвращает соответствующий IP-адрес в формате с точками (IPV4), строка
Интерфейс обратного вызова, который должен реализовать скрипт Lua
«skt.cb.*» должен реализовать разные интерфейсы в соответствии с разными режимами запуска для обратного вызова skcptun.
skt.cb.on_init (цикл)
Первый интерфейс обратного вызова вызывается при запуске скрипта и вызывается только один раз.
- Допустимый диапазон: все режимы
- параметр
- цикл: объект цикла событий
- Возвращаемое значение: Нет
skt.cb.on_skcp_accept(skcp, cid)
Сервер skcp успешно создает cid и вызывается только один раз для каждого соединения.
- Допустимый диапазон: «proxy_server», «tun_server».
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- Возвращаемое значение: Нет
skt.cb.on_skcp_check_ticket(skcp, билет)
Сервер skcp проверяет правильность билета.
- Допустимый диапазон: «proxy_server», «tun_server».
- параметр
- объект skcp
- Ticket: билет, который необходимо проверить, строка
- Возвращаемое значение:
- Возвращает 0, если проверка прошла успешно
- Если проверка не удалась, возвращается ненулевое значение.
skt.cb.on_skcp_recv_cid(skcp, cid)
skcp получает cid, указывающий, что соединение с сервером skcp успешно установлено. То есть возвращается асинхронная структура «skt.api.skcp_req_cid(skcp, Ticket)».
- Допустимый диапазон: «proxy_client», «tun_client».
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- Возвращаемое значение: Нет
skt.cb.on_skcp_recv_data(skcp, cid, buf)
skcp получает данные, соответствующие подключению cid.
- Допустимый диапазон: все режимы
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- buf: содержимое полученного сообщения, строка
- Возвращаемое значение: Нет
skt.cb.on_skcp_close(skcp, cid)
Обратный вызов, когда skcp закрывает соединение, обычно может быть вызван тайм-аутом или получением команды закрытия от узла. В настоящее время соединение еще не закрыто.
- Допустимый диапазон: все режимы
- параметр
- объект skcp
- cid: идентификатор соединения skcp, целое число
- Возвращаемое значение: Нет
skt.cb.on_tcp_accept(фд)
TCP-сервер получает запрос на соединение.
- Допустимый диапазон: «proxy_client», «tun_client».
- параметр
- fd: fd, запрошенный соединением, целое число
- Возвращаемое значение: Нет
skt.cb.on_tcp_recv(фд, буф)
Получите данные TCP, соответствующие соединению fd.
- Допустимый диапазон: все режимы
- параметр
- fd: fd соединения, целое число
- buf: содержимое полученного сообщения, строка
- Возвращаемое значение: Нет
skt.cb.on_tcp_close(фд)
Закройте TCP-соединение, соответствующее fd. В данный момент соединение еще не закрыто.
- Допустимый диапазон: все режимы
- параметр
- fd: fd соединения, целое число
- Возвращаемое значение: Нет
skt.cb.on_tun_read(buf)
Получите данные с виртуальной сетевой карты.
- Допустимый диапазон: «tun_client», «tun_server».
- параметр
- buf: содержимое полученного сообщения, строка
- Возвращаемое значение: Нет
skt.cb.on_beat()
Вызывает звонок каждую секунду.
- Допустимый диапазон: «proxy_client», «tun_client».
- Параметры: Нет
- Возвращаемое значение: Нет
тест
среда
- Сервер: Linux/1C/1G
- Клиент: MacOS/8C/8G
- Статус сети, значение пинга:
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)
- Количество подключений: 1; пакеты данных: 1000; интервал отправки: 100 мс;
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
- Количество подключений: 10 пакетов данных: 1000, интервал отправки: 100 мс;
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
в заключение
- В той же сетевой среде эффект улучшения скорости составляет около 30–40%.
Уведомление
- Только закончил писать, для личного пользования и функции дорабатываются
- Пожалуйста, убедитесь, что вы не используете его для ускорения шифрования прокси-сервера Sock5?