MrDinkyToster
@MrDinkyToster

Как с помощью iptables перенаправить пакеты на другой сервер?

Здравствуйте, стоит задача перенаправить весь трафик с адреса x.x.x.x:8888 на другой y.y.y.y:80, x.x.x.x и y.y.y.y не находятся в одной сети, это два отдельных сервера.
Пробовал реализовать это с помощью iptables указав вот такое правило на x.x.x.x, но к сожалению не помогло:
iptables -t nat -R PREROUTING 1 -p tcp --dport 8888 -j DNAT --to-destination y.y.y.y
  • Вопрос задан
  • 10234 просмотра
Решения вопроса 1
@krosh
Сейчас вы только подменяете адрес назначения, но Y-хост отвечает хосту источнику через свой шлюз по умолчанию. Т.е. пакет был направлен в адрес X-хоста, а ответ пришел от Y-хоста, отправитель теряется и сбрасывает соединение, поэтому ничего не получается.

Пакеты через шлюз проходят такие цепочки: PREROUTING, FORWARD, POSTROUTING и вам для каждой нужно правило. Еще нужно, что-бы была разрешена пересылка трафика. Нужно не только подменить адрес назначения (DNAT, PREROUTING), но и заменить адрес источника (SNAT, POSTROUTING), что бы Y-хост отвечал X-хосту, а не по маршруту по умолчанию, и еще не забыть про фильтрацию проходящего трафика (FORWARD).

Чтобы все работало, так как описано выше, нужны такие действия:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination Y.Y.Y.Y:80
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -j SNAT --to-source X.X.X.X:1024-32000
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED  -m comment --comment "РАЗРЕШЕНО Установленные соединения" -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate NEW -d Y.Y.Y.Y  -m comment --comment "РАЗРЕШЕНО Новое соединение к Y.Y.Y.Y" -j ACCEPT
iptables -P FORWARD DROP


Первая команда разрешает форфард трафика через хост.
Вторая: подмена назначения в PREROUTING, т.е. в точке решения о маршрутизации уже будет принято решения передать пакет дальше в сеть, а не отдавать локальному процессу.
Третья: подмена адреса источника в цепочке POSTROUTING на выходе на адрес X-хоста. И тогда пакет уже будет выглядеть так, будто он с X-хоста был отправлен на 80 порт Y-хоста.
Четвертая: работа со статусами. Пропускает только пакеты уже установленого соединения. А соединение можно установить только в одну сторону (пятая строка) и только до Y-хоста.
Шестая: сбрасывать все пакеты, которые не подпадают под правила цепочки - политика по умолчанию.

Проблема в данном решении будет только в том, что в логах у вас будет один адрес источника - X-хоста. Если это важно и речь про веб-сервер, то я бы рекомендовал разобраться с проксированием nginx и ничего пробрасывать не придется.

Еще нужно разобраться с локальным трафиком на 8888 и 80 порты. и трафиком из локальной сети, если это шлюз. Но это уже отдельный вопрос.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Wexter
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -d x.x.x.x --dport 8888 -j DNAT --to-destination y.y.y.y:80
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы