https://github.com/ptrvsrg/tcp-proxy
TCP прокси-сервер, соответствующий стандарту SOCKS версии 5
https://github.com/ptrvsrg/tcp-proxy
docker docker-compose go golang logrus proxy-server socks5
Last synced: 6 months ago
JSON representation
TCP прокси-сервер, соответствующий стандарту SOCKS версии 5
- Host: GitHub
- URL: https://github.com/ptrvsrg/tcp-proxy
- Owner: ptrvsrg
- License: mit
- Created: 2023-10-20T15:00:39.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2023-10-29T21:03:15.000Z (about 2 years ago)
- Last Synced: 2023-10-30T21:30:19.677Z (about 2 years ago)
- Topics: docker, docker-compose, go, golang, logrus, proxy-server, socks5
- Language: Go
- Homepage:
- Size: 13.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# SOCKS-прокси
## Задание
Необходимо реализовать прокси-сервер, соответствующий стандарту SOCKS версии 5.
## Требования
+ В параметрах программе передаётся только порт, на котором прокси будет ждать входящих подключений от клиентов.
+ Из трёх доступных в протоколе команд, обязательной является только реализация команды 1 (establish a TCP/IP stream
connection)
+ Поддержку аутентификации и IPv6-адресов реализовывать не требуется.
+ Для реализации прокси использовать неблокирующиеся сокеты, работая с ними в рамках одного треда. Дополнительные треды
использовать не допускается. Соответственно, никаких блокирующихся вызовов (кроме вызова селектора) не допускается.
+ Прокси не должна делать предположений о том, какой протокол уровня приложений будет использоваться внутри
перенаправляемого TCP-соединения. В частности, должна поддерживаться передача данных одновременно в обе стороны, а
соединения должны закрываться аккуратно (только после того, как они больше не нужны).
+ В приложении не должно быть холостых циклов ни в каких ситуациях. Другими словами, не должно быть возможно состояние
программы, при котором неоднократно выполняется тело цикла, которое не делает ни одной фактической передачи данных за
итерацию.
+ Не допускается неограниченное расходование памяти для обслуживания одного клиента.
+ Производительность работы через прокси не должна быть заметно хуже, чем без прокси. Для отслеживания корректности и
скорости работы можно глядеть в Developer tools браузера на вкладку Network.
+ Прокси должен поддерживать резолвинг доменных имён (значение 0x03 в поле address). Резолвинг тоже должен быть
неблокирующимся. Для этого предлагается использовать следующий подход:
+ На старте программы создать новый UDP-сокет и добавить его в селектор на чтение
+ Когда необходимо отрезолвить доменное имя, отправлять через этот сокет DNS-запрос A-записи на адрес рекурсивного
DNS-резолвера
+ В обработчике чтения из сокета обрабатывать случай, когда получен ответ на DNS-запрос, и продолжать работу с
полученным адресом
+ Для получения адреса рекурсивного резолвера, а также для формирования и парсинга DNS-сообщений на Java
предлагается использовать библиотеку `dnsjava` (для других языков найдите сами).
## Тестирование
Для тестирования можно настроить любой Web-браузер на использование вашего прокси, и посещать любые веб-сайты, богатые
контентом.