Я не могу найти решение в сети, как на рисунке ниже.
Я бы хотел, чтобы с любого ПК, подключенного к 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 соответствует "по умолчанию" и маршрутизируется в Интернет.
Чтобы он работал, вам также нужно «коснуться» исходного 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
в «предлагаемом» правиле, относящемся к POSTROUTING (спасибо за обратную связь - моя ошибка, уверен, что POSTROUTING не может работать с исходным интерфейсом, поскольку процесс маршрутизации выполнен, а исходный интерфейс недоступен / соответствующая информация)Рядом с ним наиболее вероятно аналогичная ситуация для ответа, так как он не преобразован «обратно» в 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, так что даже следующая связь будет работать. Поскольку мы работаем с --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
Надеюсь, это поможет вам заставить его работать так, как вы думаете ;-). Удачи !