Socks5-прокси с расширенным функционалом

Игорь12 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
16.02.2015

Необходимо взять готовое решение 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');