У меня есть шлюз Linux, выполняющий NAT для моей домашней сети. У меня есть другая сеть, в которую я хотел бы прозрачно пересылать пакеты, но только в / из определенных IP / портов (т.е. не VPN). Вот несколько примеров IP и портов для работы:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
Мне бы хотелось, чтобы исходный компьютер мог общаться с определенными портами на удаленной цели, как если бы он был напрямую маршрутизируемым от маршрутизатора. На маршрутизаторе eth0 - частная сеть, а eth1 - выход в Интернет. Remote Gateway - это еще одна машина Linux, на которую я могу подключиться по ssh, и она может напрямую направляться к Remote Target.
Моя попытка найти простое решение - настроить переадресацию порта ssh на маршрутизаторе, например:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Это прекрасно работает для маршрутизатора, который теперь может подключаться локально к порту 5000. Таким образом, «telnet localhost 5000» будет подключен к 192.168.50.50:5000, как и ожидалось.
Теперь я хочу перенаправить трафик из источника и воронки через установленный туннель ssh. Я попытался правило NAT для этого:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
и так как Маршрутизатор уже является моим NAT-шлюзом, у него уже есть необходимое правило маршрутизации:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
Большинство вопросов и ответов на этом сайте или в другом месте, кажется, имеют дело с переадресацией портов сервера или шпильки NAT, оба из которых у меня работают нормально в другом месте, ни один из которых не относится к этой ситуации. Я, конечно, мог бы DMZ перенаправлять порты Remote Target через Remote Gateway, но я не хочу, чтобы порты были доступны через Интернет, я хочу, чтобы они были доступны только через безопасный туннель SSH.
Лучший ответ, который я могу найти, касается отклонения марсианских пакетов в ядре Linux:
iptables, как перенаправить порт из loopback?
Я включил ведение журнала марсиан и подтвердил, что ядро отклоняет эти пакеты как марсиане. За исключением того, что это не так: я точно знаю, для чего эти пакеты, откуда они и куда они идут (мой ssh-туннель).
Представленное здесь «обходное» решение применимо к этому первоначальному вопросу, но не применимо для моего случая.
Однако во время написания / исследования этого вопроса я обошел свою проблему, используя привязку IP-адреса источника SSH следующим образом:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Так как я не использую петлю, это обходит марсианский отказ.
Я до сих пор оставляю здесь вопрос по двум причинам:
- В надежде, что кто-то, кто пытается сделать что-то подобное в будущем, может найти это в своих поисках, и этот обходной путь может помочь им.
- Я по-прежнему предпочитаю идею, чтобы мой ssh-порт перенаправлял соединение, связанное только с обратной связью, и мог маршрутизировать их через iptables. Поскольку я точно знаю, что это за пакеты и куда они направляются, не должен ли я как-то пометить их как таковые, чтобы марсианская фильтрация Linux не отвергала их? Все мои поиски по этой теме приводят к rp_filter, который совсем не помог в моем тестировании. И даже если это сработало, это не относится к конкретным пакетам, которые я пытаюсь разрешить.
Я заинтересован в том, чтобы добавить свой вопрос и обходной путь в общий поиск, чтобы сэкономить кому-то еще часы поиска, которые я потратил только для того, чтобы придти в тупик, а также надеюсь, что кто-то ответит на петлевую / марсианскую часть моего вопроса, которая все еще остается открытой мне.