iptables - мост / маршрутизация между двумя независимыми локальными сетями (и маршрутизатором)

Я не могу найти решение в сети, как на рисунке ниже.

  • Мне нужно открыть страницу администратора маршрутизатора 2 в LAN2 с компьютера в LAN1, без маршрутизации через Интернет.
  • У меня есть "мостовой" ПК с 2 NIC и Linux (Debian), и я могу делать все на нем.

Я бы хотел, чтобы это было с любого ПК, подключенного к LAN 1 можно получить доступ к порту 80 маршрутизатора LAN 2.

     Internet 1                         Internet 2
        !                                   !
+---------------------+             +---------------------+
| Router 1            |             | Router 2            |
| LAN 192.168.55.1/24 |             | LAN 192.168.2.1/24  |
|                     |             |                     |
+---------------------+             +---------------------+
        |                                   |
        |                                   |
        |       +-----------------------+   |
        |       |                       |   |
        |       |         BRIDGE        |   |
        |-------|eth0                   |   |
        |       |192.168.55.2       eth1|---|
        |       |            192.168.2.2|   |
        |       +-----------------------+   |
        |                                   |
        |                                   |
    Other clients                       other clients
     LAN 1                                  LAN 2

Идея состоит в том, чтобы установить порт (пример 8080) на eth0, «моста» (ПК) и выйти на eth1 в LAN 2 на IP-адрес маршрутизатора 192.168.2.1:80

Ответ от 192.168.2.1 не пройдет через шлюз, а вернется к eth1. После манипуляций выходит IP pachet из eth0. «Мост» должен заменить исходный адрес, как если бы он происходил из 192.168.55.2.

Я провел много тестов, но не могу найти решение с помощью различных тестов с настройками iptables.

Очевидно, , Я включил ip_forward = 1 и я так установил iptables.

iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 8080 -j ACCEPT
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 8080 -j DNAT --to 192.168.2.1:80

и переадресация:

sysctl -a | grep "\.forwarding" | grep ipv4
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.wlan0.stable_secret"
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.wlan0.forwarding = 1

была ли у кого-нибудь похожая проблема, можете ли вы мне намекнуть?

Заранее спасибо!

0
задан 21 March 2019 в 13:52
1 ответ

Вы движетесь в хорошем направлении, но на полпути... буквально :-). Проблема в ответе - путь назад.

@Router 1
default => "internet GW"
192.168.55.0/24 => LAN
  # 192.168.55.2 is ok
  # 192.168.2.0/24 is unknown - "matched" by default route
@Router 2
default => "internet GW"
192.168.2.0/24 => LAN
  # 192.168.2.2 is ok
  # 192.168.55.0/24 is unknown - "matched" by default route
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 8080 -j DNAT --to 192.168.2.1:80

Это правило изменит только пункт назначения, но не изменит источник. Давайте подумаем об исходнике IP 192.168.55.55: (SRC) 192.168.55.55: => 192.168.55.2:8080 (DST) изменен этим правилом на (SRC) 192.168.55.55: => 192.168.2.1:80 (DST) и правильно маршрутизирован. Эта часть будет работать без проблем. Проблема начинается после того, как Router2 попытается ответить. На основе таблицы маршрутизации адрес 192.168.55.55 совпадает с адресом "по умолчанию" и маршрутизируется в Интернет.

опция 1 - изменения реализованы на "мосту"

Чтобы он заработал, вам нужно также "потрогать" IP источника на "мосту", чтобы Router2 отправил сообщение на 192.168.2.2 и вернул его обратно в NAT. Вы можете реализовать это, добавив следующее правило:

iptables -A POSTROUTING -t nat -s 192.168.55.0/24 -o eth1 -d 192.168.2.0/24 -j MASQUERADE

опция 2 - изменения, реализованные на "Router2"

Как только вы добавите маршрут 192.168.55.0/24 => 192.168.2.2, он также начнет работать. Таблица маршрутизации на Router2 будет

@Router 2
default => "internet GW"
192.168.2.0/24 => LAN
192.168.55.0/24 => 192.168.2.2
  # 192.168.2.2 is ok
  # 192.168.55.0/24 is routed via 192.168.2.2

--- edit : 2019/03/23 ---

  • remove -i eth0 in "proposed" rule related to POSTROUTING (Спасибо за обратную связь - моя ошибка, уверен, что POSTROUTING не может работать с интерфейсом источника, т.к. процесс маршрутизации выполнен и интерфейс источника недоступен/неактуальная информация)

Рядом с ним, скорее всего, находится похожая ситуация для ответа, т.к. он не NATed "back" to 192. 168.55.2:8080 ;-). У меня сейчас полночь, так что может случиться какой-то логический сбой (так как "оригинальный" вариант 2 работает на вас):-D. Возьмите этот отредактированный материал вроде мозгового штурма для будущего исследования...

Я вижу два варианта.

Вариант 1

Установите одно и то же правило для соединения в обратном направлении, чтобы все время (в обоих направлениях) было видно в подсети, как связь со шлюзом.... Порт 8080 будет доступен для инициализации связи, но следующая связь его не использует...

iptables -A POSTROUTING -t nat -d 192.168.55.0/24 -o eth0 -s 192.168.2.0/24 -j MASQUERADE

Вариант 2

Вы можете "вернуть NAT обратно" к прямому порту 8080, так что даже folowing связь будет работать. Так как мы работаем с --sport, нам нужно указать протокол (-p), который не нужен в случае, если мы работаем только с IP, как в предыдущей опции ;-).

iptables -A POSTROUTING -t nat -p tcp -d 192.168.55.0/24 -o eth0 -s 192.168.2.1 --sport 80 -j SNAT --to-source 192.168.55.2:8080

Надеюсь, это поможет вам сделать так, чтобы он полностью работал, как вы полагаете ;-). Удачи!

0
ответ дан 5 December 2019 в 03:42

Теги

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