LINUX.ORG.RU
ФорумAdmin

iptables и несколько шлюзов

 , ,


1

1

Ситуация следующая, есть два (IP1, IP2) шлюза в инет. И есть железка (IP3) подключенная к инету через IP2.

Задача: подключаться через IP1 к этой железке (IP3), по телнету и отправлять через него же пакеты обратно. У железки шлюз по умолчанию IP2, который менять нельзя.

С IP1 проброшен порт на IP2, с него на железку (IP3). Из инета пакеты доходят до IP3 через IP1 а потом IP2, но обратно железка отвечает через шлюз IP2.

Вопрос: какое правило написать в iptables на IP2 чтоб пакеты он отправлял с IP3:5000 не в инет, а на шлюз IP1?


Если из шлюза IP2 на шлюз IP3 пойдёт пакет через тот же интерфейс, с которого был получен пакет, то маршрутизатор отправить ICMP REDIRECT емнил.

Либо, GRE туннел между IP2 и IP3, либо расключить через разные интерфейсы, либо использовать VLAN.

anton_jugatsu ★★★★
()

Зачем, ну зачем такие костыли городить в пределах одной локальной сети? Ведь у вас все возможности NAT'а в руках, причём, как SNAT, так и DNAT. Хорошо, с DNAT вы разобрались, что мешает сделать на IP1 еще и SNAT внутрь для этой же железки? Пусть она думает, что к ней подключаются из локальной сети (то есть сам IP1)... Это ж банальная задача.

nickleiten ★★★
()
Ответ на: комментарий от nickleiten

просто нужно чтобы железка выходила в инет через шлюз IP2 а отстук на телнет был через IP1 Можно поподробнее про SNAT?

TheZ
() автор топика
Ответ на: комментарий от TheZ

Банальный хак маршрутизации. На IP3 шлюз по-умолчанию оставляете в IP2, если я правильно понял, все три системы находятся в одной локальной сети. Т.к. в условии стоит не менять маршруты на IP3 и получить к нему доступ через IP1 - у вас два варианта:

1) Простой. Показать входящие на IP3 соединения, как будто они идут из локальной сети (и маршрутизацию не трогаем). Для этого На внешнем интерфейсе IP1 делаем DNAT с классическим пробросом портов и на нём же делаем SNAT на внутреннем интерфейсе с классификатором направления (айпишник/порт IP3) в сторону системы IP3. Это будет выглядеть приблизительно так:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -d <real-ip> -j DNAT --to-destination <IP3-ip>:23
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 23 -d <IP3-ip> -j SNAT --to-source <local-ip>
С форвардами думаю, сами разберётесь. И интерфейсы соответствующие подставите (в первом правиле должен быть интернет-интерфейс, во втором правиле - интерфейс локальной сети по которой идёт связь с IP3 и IP2). Единственный минус данной схемы - на вашем IP3 не будет видно с какого айпишника прошло подключение, он будет видеть внутренний адрес машины IP1 и считать, что это она к нему подключается.

2) Более заковыристый вариант. Делаете цепочку натов c IP1 на IP2 и с него на IP3, при этом лучшим вариантом будет поднятие тоннеля или вилана или просто другой подсети с /30 маской между IP1 и IP2 (это всё, чтоб не было редиректорв в пределах одной локальной сети), ну или повыключать через proc посылку этих редиректов, но не факт, что всё заработает, как вы хотите, т.к. судя по вводной, на IP3 не полноценный линукс или вообще не линукс.

nickleiten ★★★
()
Последнее исправление: nickleiten (всего исправлений: 3)
Ответ на: комментарий от nickleiten

Спасибо за развернутый ответ :) Забыл только уточнить, IP1 обычный роутер WIFI, на котором можно через обычный NAT прокинуть порт (5000) на IP2 Как быть в столь интересном случае, без «заковыристых» вариантов ?) Думаю на IP2 можно было бы сообразить что-то с --sport 5000 (который отстукивает с IP3) и завернуть его на шлюз IP1 ?

TheZ
() автор топика
Ответ на: комментарий от TheZ

Проще будет поискать поддержку openwrt для вашего роутера. Если нет, попробуйте сделать цепочку DNAT (проброс портов) с IP1 на IP2, который в свою очередь будет слать в сторону IP3. Потом изучаем понятие таблиц маршрутизации, создаём свою таблицу (например mytable) на IP2 один-в-один из таблицы main, но основной шлюз делаем IP1. Потом надо промаркировать пакеты по порту, которые наш IP2 должен по цепочке DNAT'ить к IP3 и их уже перенаправляем через ip rule в новую таблицу.

Приблизительно это будет выглядеть на IP2 так:

iptables -t mangle -A PREROUTING -p tcp --dport 5000 -j MARK --set-mark 0x2

ip rule add fwmark 0x2 mytable
Предварительно добавьте (именно добавить, а не переписать файл) строку в /etc/iproute2/rt_tables вида:
100   mytable

И всё, эти простые действия позволят направлять пакеты из IP3 для данного порта через IP2 в сторону IP1.

nickleiten ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.