Я не могу найти решение в сети, как на рисунке ниже.
Я бы хотел, чтобы это было с любого ПК, подключенного к 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:
изменен этим правилом на (SRC) 192.168.55.55:
и правильно маршрутизирован. Эта часть будет работать без проблем. Проблема начинается после того, как Router2 попытается ответить. На основе таблицы маршрутизации адрес 192.168.55.55 совпадает с адресом "по умолчанию" и маршрутизируется в Интернет.
Чтобы он заработал, вам нужно также "потрогать" 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
Как только вы добавите маршрут 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
-i eth0
in "proposed" rule related to POSTROUTING (Спасибо за обратную связь - моя ошибка, уверен, что POSTROUTING не может работать с интерфейсом источника, т.к. процесс маршрутизации выполнен и интерфейс источника недоступен/неактуальная информация)Рядом с ним, скорее всего, находится похожая ситуация для ответа, т.к. он не NATed "back" to 192. 168.55.2:8080 ;-). У меня сейчас полночь, так что может случиться какой-то логический сбой (так как "оригинальный" вариант 2 работает на вас):-D. Возьмите этот отредактированный материал вроде мозгового штурма для будущего исследования...
Я вижу два варианта.
Установите одно и то же правило для соединения в обратном направлении, чтобы все время (в обоих направлениях) было видно в подсети, как связь со шлюзом.... Порт 8080 будет доступен для инициализации связи, но следующая связь его не использует...
iptables -A POSTROUTING -t nat -d 192.168.55.0/24 -o eth0 -s 192.168.2.0/24 -j MASQUERADE
Вы можете "вернуть 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
Надеюсь, это поможет вам сделать так, чтобы он полностью работал, как вы полагаете ;-). Удачи!