Skip to content


Проброс портов с помощью xinetd

Когда возникает необходимость перенести какой-нибудь сервис с одного сервера на другой, иногда бывает сложно (или даже невозможно) сразу быстро переконфигурировать клиентов, работающих с этим сервисом, на использование нового IP-адреса. Эту проблему, конечно, проще всего было бы решить переносом старого IP-адреса на новый сервер, но если на старом сервере этот IP-адрес используется еще каким-нибудь другим сервисом, то данное решение не подходит. Поэтому в таком контексте часто возникает задача проброса портов, когда на старом сервере мы просто перенаправялем клиентов на новый сервер прозрачно и незаметно для последних. Один из вариантов решения такой задачи --- использование xinetd (extended Internet services daemon).
Пусть, для примера, у нового сервера будет IP-адрес 10.10.10.18, тогда конфиг xinetd будет примерно такой:

  1. service redir8182
  2. {
  3.  disable = no
  4.  type = UNLISTED
  5.  socket_type = stream
  6.  wait = no
  7.  user = nobody
  8.  group = nobody
  9.  protocol = tcp
  10.  port = 8182
  11.  redirect = 10.10.10.18 80
  12.  per_source = UNLIMITED
  13.  instances = UNLIMITED
  14.  cps = 10000 1
  15. }

Это всё записываем в файл с именем redir8182 и кладём в директорию /etc/xinetd.d. В 3-ей строке мы говорим, что данный сервис активирован. В 4-й строке говорим, что данный сервис не является общеизвестным и не упоминается в файле /etc/services, следовательно xinetd не будет там его искать. Если опустить эту строку, то следует убедиться, что в файле /etc/services для нашего сервиса (redir8182) существует запись с указанием номера порта и при отсутствии такой записи добавить её. В 5-ой строке стоит stream, потому что сервис работает по протоколу TCP (для UDP следовало бы поставить dgram). В 6-ой строке указываем, что сервис является многопоточным (multi-threaded), то есть xinetd не будет ожидать завершения обработки n-го запроса, прежде, чем приступить к обработке (n+1)-го. В 7,8 строках указываем uid и gid порождаемых новыми подключениями процессов xinetd. Далее указываем протокол и порт, который слушает xinetd. В 11-ой строке указываем, что запросы нужно перенаправлять на хост 10.10.10.18 на порт 80. Последние 3 строки не обязательны, но они нужны для случаев, когда интенсивность запросов довольно велика и мы не хотим, чтобы xinetd стал узким местом (например, если пробрасываем порт mysql-сервера, который обслуживает сайт с посещаемостью в несколько тысяч хостов в минуту). Если их не указать, то будут использоваться значения по-умолчанию, указанные в xinetd.conf, которые могут быть совсем далеки от того, что мы ожидаем получить. Например, в случае с CentOS 5.5 настройки по-умолчанию (живут в /etc/xinetd.conf) такие:

  1.   cps   = 50 10
  2.   instances = 50
  3.   per_source  = 10

То есть к сервису разрешено не более 50-ти подключений в секунду (строка 1) (в случае превышения сервис временно отключается на 10 секунд), количество одновременных подключений --- не более 50-ти (строка 2) и с одного IP-адреса не более 10-ти одновременных подключений (строка 3).

О своей работе xinetd обычно пишет в /var/log/messages (и туда же пишет об ошибках в конфиге, если таковые имеются). Чтобы заставить его перечитать кофиг, следует послать ему сигнал SIGHUP. Также проброс портов можно построить с помощью iptables.

Размещено в категории *nix, Howto. Теги: , .

Комментариев: 1

Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.

  1. Lazy said

    спасибо, помогло

Some HTML is OK

(required)

(required, but never shared)

, или ответить через trackback.

Страница 1 из 11