Skip to content

nktauserum/catwire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

catwire VPN

Кастомная имплементация виртуальной частной сети (VPN) под Linux. Представляет собой строго учебный проект; не предназначена для обхода блокировок и коммерческого использования.

Общая идея протокола была вдохновлена Wireguard, но реализована полностью с нуля. Из зависимостей в основном только криптография и библиотека songgao/water для использования TUN-интерфейсов.

Принцип работы

Протокол использует UDP в качестве транспорта, по которому передаются пользовательские пакеты. Каждый пакет включает в себя 17-байтовый header и payload произвольного размера. Payload может быть зашифрованным в зависимости от типа пакета; header всегда открыт, что впрочем не является большой проблемой.

Первый и главный этап соединения — рукопожатие (handshake). В нём производится аутентификация клиента по переданному публичному ключу и создание новой сессии. На основе своего приватного ключа и полученного публичного другой стороны на клиенте и сервере вычисляется общий секрет с помощью ECDH. В дальнейшем он используется для симметричного шифрования полезной нагрузки пакетов по AES-GCM.

После установки зашифрованного соединения клиент и сервер могут начать пересылать друг другу IPv4-пакеты. Каждый входящий пакет декодируется, а полезная нагрузка расшифровывается по вычисленному ключу и переданному в header nonce. Исходящие пакеты претерпевают обратную процедуру.

Ввиду своей непопулярности протокол не детектируется системами DPI, и при неправильном выборе локации сервера могут проявиться некоторые побочные явления. Так что ни в коем случае не размещайте свой сервер за рубежом, чтобы случайно не получить доступ к заблокированным ресурсам. Используйте данное ПО лишь в учебных и демонстрационных целях.

Как запустить у себя?

Требования: Linux, iptables, Golang >= 1.26.2, IPv4-сеть, root-права на клиенте и на сервере.

  1. Сгенерируйте по паре из публичного/приватного ключа для клиента и для сервера.
  2. Запишите приватные ключи в client.json и server.json соответственно. Добавьте публичный ключ клиента в список allowedIPs (server.json), присвоив адрес из диапазона 10.0.5.0/24.
  3. На сервере: go run server/main.go --config server.json
  4. На клиенте: go run client/main.go --config client.json

Убедитесь, что все значения правильно соотносятся в обеих конфигурационных файлах.

About

Custom implementation of Virtual Private Network written in Go. Mirror.

Topics

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages