Назад | Перейти на главную страницу

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

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

Я бы хотел, чтобы с любого ПК, подключенного к 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

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

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

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

@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:<port> => 192.168.55.2:8080 (DST) изменено этим правилом на (SRC) 192.168.55.55:<port> => 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

--- изменить: 2019/03/23 ---

  • удалено -i eth0 в «предлагаемом» правиле, относящемся к POSTROUTING (спасибо за обратную связь - моя ошибка, уверен, что POSTROUTING не может работать с исходным интерфейсом, поскольку процесс маршрутизации выполнен, а исходный интерфейс недоступен / соответствующая информация)

Рядом с ним наиболее вероятно аналогичная ситуация для ответа, так как он не преобразован «обратно» в 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, так что даже следующая связь будет работать. Поскольку мы работаем с --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

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