Socks5-прокси с расширенным функционалом
Необходимо взять готовое решение socks5-прокси с открытым исходным кодом и доработать до необходимого функционала. А также разработать две небольших программы для взаимодействия с доработанной программой.
===== Основные требования =====
Серверная программа с функционалом socks5-прокси.
Реализация предположительно на базе программы 3proxy socks5.
Программа не должна вносить никаких изменений в систему.
Программа должна представлять собой один исполняемый файл и конфиг-файл. (Мобильность)
Программа в идеале должна простой командой (например, /usr/bin/socks5) запускаться на linux, freebsd системах. Если реально, то и на windows (в виде службы). (Кроссплатформенность)
===== Алгоритм работы доработанной программы =====
(шаг 1) При первом запуске программа обращается к API (API-метод инициализация) и в ответ:
0 (инициализация пройдена);
либо любое друго число - код ошибки (инициализация не пройдена, при повторном запуске происходит повторная инициализация).
(шаг 2) После успешной инициализации программа начинает слушать указанный в конфиг файле порт.
(шаг 3) При попытке подключения программе, происходит запрос логина-пароля (должны настраиваться через конфиг-файл):
если логин = sadmin, программа работает в режиме выполнения команд;
если логин != sadmin, программа работает в режиме socks5-прокси;
в любом случае хеш sha1 пароля должен совпадать с хешем sha1 пароля из конфиг-файла.
(шаг 4) Режим выполнения команд - необходима возможность выполнять стандартные консольные команды от имени пользователя, который запустил программу. Обязательно использование шифрования команд и результатов команд!
(шаг 5) Режим socks5-прокси - стандартный функционал socks5-прокси.
===== Первая дополнительная программа (под linux) =====
Вместе с программой необходимо реализовать API-метод инициализация (программа, которая слушает определенный порт и добавляет запись в базу данных MySQL).
На вход принимает:
-IP-адрес, который слушает программа
-порт, который слушает программа
-идентификатор из конфиг файла
Таблица в базе данных MySQL:
CREATE TABLE `proxies` (
ip BIGINT(20) UNSIGNED NOT NULL,
port INT(11) UNSIGNED NOT NULL,
identity CHAR(40) NOT NULL,
first INT(11) UNSIGNED NOT NULL,
last INT(11) UNSIGNED NOT NULL,
PRIMARY KEY(ip)
) ENGINE = InnoDB;
поле ip - ip-адреса получаемые от mysql-функции вида: INET_ATON('127.0.0.1');
поле port - понятно;
поле identity - идентификатор из конфиг файла;
поля first, last - текущее время в формате TIMESTAMP.
Ошибки:
1 - Некорректный ip-адрес;
2 - Некорретный порт;
3 - Некорректный идентификатор, регулярка: ^[a-f\d]{32}$;
4 - Существующий ip-адрес в базе (при получении ошибки от mysql типа ~"дублирующееся поле ip" происходит вызов сторонней программы и повторная попытка записи в базу в случае неудачи, которой возвращается ошибка);
===== Вторая программа дополнительная программа (под linux) =====
Необходимо реализовать интерфейс для работы в режиме выполнения команд.
Эта программа запускается примерно так: /usr/bin/interface ip-адрес порт
Логин sadmin подставляется автоматически, а пароль берется из конфиг файла (для данной программы!).
Визуально не должно отличаться от обычной SSH-консоли.
===== Примерный конфиг файл =====
[main]
api = 8.8.8.8:43021;
identity = sha1('secret key');
[users]
sadmin = sha1('password-sadmin');
user1 = sha1('password-user1');
...
usern = sha1('password-usern');