Добрый день!
Тут вот такая задача возникла:
В пределах одной сети есть 2 сервера под фрей - один (REAL) - несет на себе apache, почту (postfix), фтп и прочие рулеза; другой (FAKE) - это тот, на который будут заходить юзеры, в надежде воспользоваться своей почтой, WWW и т.д.
Надо: прозрачно делать редирект с FAKE на REAL
Казалось бы - все просто: пишешь на FAKE (для WWW, к примеру)
rdr xl0 FAKE_ADDR/32 80 -> REAL_ADDR tcp
(если использовать ipnat) или
ipfw add divert natd tcp from any to FAKE_ADDR
natd -n xl0 redirect_port tcp REAL_ADDR:80 80
и все. Не тут то было.
Пакеты действительно уходят с FAKE на REAL, REAL отвечает клиенту, но клиент, получив ответ от REAL вместо FAKE, которому он посылал запрос, посылает RST REALу и повторяет запрос FAKEу !
Помучившись, я изобразил какой-то ужас типа:
ipfw add 100 divert 8668 tcp from any to FAKE_ADDR 80
natd -n xl0 -p 8668 -redirect_port REAL_ADDR:80 80
Это входящий на FAKE пакет пересылается на REAL (CLIENT->FAKE => CLIENT->REAL)
ipfw add 200 divert 8669 tcp from any to REAL_ADDR 80
ipfw add 300 divert 8669 tcp from REAL_ADDR 80 to FAKE_ADDR in
natd -n xl0 -p 8669 xl0
Это aliasing уходящего на REAL и приходящего траффика (то есть FAKE->REAL и обратно REAL->FAKE).
ipfw add 400 divert 8670 tcp from REAL_ADDR 80
to any out
natd -n xl0 -p 8670 xl0
Это REAL->CLIENT => FAKE->CLIENT
И все заработало. Однако ущербность такого решения налицо - удвоенный траффик по сети и куча жрущих ресурсы сервисов. Не предложит ли кто более изящное решение (напр. на основе netcat)?