Socks-Сервер Данте Или Как Одно Письмо Может «Съесть» Пару Дней Времени

Каждый раз, когда я сталкиваюсь с таким «рабочим моментом», я задаюсь вопросом, стоит ли делиться его решением с миром или оно мелочно для других, но в этот раз я решил его опубликовать.

Данная статья является скорее второстепенной и написана лишь из-за скудности информации о настройке Dante в Интернете и отсутствия официальной документации.

Утром в пятницу заказчик попросил поднять сокс-сервер на ~100 пользователей, с авторизацией по логину/паролю, привязкой по IP и отправкой запросов с того же IP, к которому подключается пользователь.

При этом заказчик поинтересовался сроками выполнения работ и, хотя я не люблю делать прогнозы по времени установки/настройки, я заверил его, что альфа-версия будет готова через 3-4 часа.

Ну правда - погуглив, выберите подходящий сокс-сервер, установите, почитайте ману, настройте дефолтный конфиг под себя.

часа 4 надо вложить.

ОС FreeBSD 9.2, но все описанное ниже справедливо и для 10. Как ни странно, под запросы заказчика было всего два сокс-сервера: 3прокси 0.6.1 И Данте (в портах 1.3.2).

Может быть я что-то упустил, конечно, но либо нет авторизации, либо нет режима int_ip -> ext_ip. Возможно, этим запросам соответствует squid, но мне не хотелось устанавливать этого монстра для простой задачи.

Ничего не имею против 3proxy, сам несколько лет работаю с ним в режиме портмаппинга, особых нареканий нет, но он в разработке с 2009 года, код грязный и слышал неоднократные отзывы о его прожорливости под тяжелыми нагрузками.

нагрузка.

Итак, Данте.

До версии 1.3 в Dante не было поддержки int_ip -> ext_ip; точнее, аналогичная реализация есть в платной версии по весьма недемократичной цене в 400 евро, однако Лысенко Константин добавил этот функционал в виде "того-же" патча в Dante 1.2.2 и включил его в релизе 1.3. .

0. Не берусь сказать, работала ли эта конструкция в 1.3.0, но в 1.3.2 упорно уходят запросы с первого найденного в конфиге external-ip. Перебрав свою скудную ману, я обратился к странице разработчика.

Там есть немного больше информации, но мне не удалось запустить то же самое, что требовалось.

Однако с ноября 2013 г.

есть сайт версия 1.4, которая почему-то не включена в порты.

Качаем, собираем.

Следует отметить, что конфиг в 1.4 претерпел косметические изменения, хотя в мане по-прежнему приводятся примеры с параметрами предыдущих версий, на что Данте ругается как устарел и иногда предлагает правильные новые параметры.

Тестовая конфигурация: /usr/local/etc/sockd.conf

  
  
  
   

# cat /usr/local/etc/sockd.conf logoutput: /var/log/socks/socks.log debug: 0 internal: 11.12.13.1 port = 1080 internal: 11.12.13.2 port = 1080 internal: 11.12.13.3 port = 1080 external: 11.12.13.1 external: 11.12.13.2 external: 11.12.13.3 external.rotation: same-same socksmethod: username user.privileged: root user.unprivileged: nobody user.libwrap: nobody compatibility: sameport client pass { from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0 } client block { from: 0.0.0.0/0 to: 127.0.0.0/8 log: connect error } client block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error } socks pass { from: 21.22.23.0/24 to: 0.0.0.0/0 log: connect error user: chaturanga } socks block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error }

И.

вопреки ожиданиям, то же самое и в 1.4 не заработало.

На этот раз, в отличие от 1.3, ошибки типа

warning: getoutaddr(): using external.rotation = same-same, local address 21.22.23.48 was selected for forwarding from our local client 21.22.23.48.45980 to target 77.72.80.15.80, but that local address is not set on our external interface(s).

Configuration error in /usr/local/etc/sockd.conf?

, где 21.22.23.48 — адрес моей локальной машины, при этом здесь должен быть внутренний IP сервера, к которому подключается клиент. Смущает фраза «Ошибка конфигурации в /usr/local/etc/sockd.confЭ» Возлюсь с конфигом и изучаю манасы, но так как информации в них мало, перехожу к лучшему ману - исходникам.

Улыбаюсь таким комментариям, как

/* * Just return the first address of the appropriate type from our internal * list and hope the best. */

Наконец я нашел источник проблем (.

/sockd/sockd_request.c, строка 4173): /* * Найдите адрес для привязки для клиента.

Сначала IP-адрес.

*/ если (getoutaddr(&io-> dst.laddr, &io-> src.raddr, req.команда цель, электронная почта, эмсглен) == NULL) вернуть -1; я меняюсь &io-> источник.

р адрес на &io-> источник.

л адрес , я пересобираю его, запускаю и наконец вижу то, что хочу:

info: pass(1): tcp/connect [: username%[email protected] 11.12.13.3.1080 -> 11.12.13.3.27819 77.72.80.15.80

Тихо ругаясь, отправляю отчет об ошибке разработчикам.

В итоге вместо заявленных 3-4 часов чтения, выяснения конфигов, попыток запустить Dante не в джейле, тестирования на Centos вместо FreeBSD и копания в исходниках я потратил пару дней.

Так что пообещай мне после этого.

UPD1 : Пока писалась заметка, разработчик ответил:

Здравствуйте, спасибо за отчет об ошибке.

Вы правы, есть здесь ошибка.

Однако предложенное вами решение в целом правильное.

мы, вероятно, реализуем исправление немного иначе.

УПД2 : И в ходе дальнейшей переписки:
В зависимости от текущей рабочей нагрузки, я сомневаюсь, что смогу предоставить вы с нашим официальным патчем еще как минимум на месяц.

Что ж, спасибо за это.

UPD3(03.09.2014) : Разработчик сообщил, что ошибка исправлена (v.1.4.1).

Проверил, все работает как положено.

Теги: #*nix #Системное администрирование #Данте #носки

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.