Каждый раз, когда я сталкиваюсь с таким «рабочим моментом», я задаюсь вопросом, стоит ли делиться его решением с миром или оно мелочно для других, но в этот раз я решил его опубликовать.
Данная статья является скорее второстепенной и написана лишь из-за скудности информации о настройке 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 #Системное администрирование #Данте #носки
-
Яндекс Посвятил Страницу Плееру Winamp
19 Oct, 24 -
Создание Простой Игры На Fpga
19 Oct, 24 -
Опыт Rails Rumble
19 Oct, 24