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

Как именно работает переадресация портов ssh

У меня следующая настройка: одна машина с запущенным sshd (местный) за маршрутизатором (маршрутизатором), а второй хост (удаленный) пытается получить доступ местный через интернет и роутер через ssh.

Для этого: переадресация портов. маршрутизатор: 22 -> местный: 22 (и маршрутизатор как шлюз для местный). Работает отлично.

Если я попытаюсь создать туннель ssh из удаленный к местный следующим образом:

ssh -L 1234:R:12345 user@R 

это будет работать, только если я также перенаправлю маршрутизатор: 1234 -> местный: 1234.

Насколько я понимаю, ssh будет туннелировать весь трафик через свое соединение на порт 22. Но похоже, что это не так. Я делаю что-то неправильно? Есть ли возможность туннелировать весь трафик через одно соединение?

Ваш вопрос был для меня немного неясным, поэтому я собираюсь уточнить, что я предполагал, а затем попытаюсь помочь вам с вашей проблемой. Вы находитесь на «удаленном» компьютере, который по SSH настроен на «локальный», и эта часть работает нормально. Если это так, нам больше не нужно беспокоиться о маршрутизаторе.

Продолжая мои предположения, «local» имеет службу, работающую на нем на порту 12345, к которому вы хотели бы получить доступ с «удаленного» без открытия дополнительных портов на вашем маршрутизаторе. Что вам нужно сделать, так это использовать следующую команду из «удаленного»:

ssh -L 1234:localhost:12345 user@router's_ip

Чтобы подключиться к службе, вы должны получить к ней доступ через localhost: 1234.

Синтаксис перенаправления портов работает так: {local_port}: {proxy_dest}: {порт прокси}

local_port - это порт, который откроется на клиентском компьютере, с которого вы подключаетесь, для доступа к нему вы должны использовать localhost:local_port

proxy_dest - это хост, к которому вы хотите подключиться, с точки зрения сервера, на который вы подключаетесь по SSH

порт прокси - это порт удаленной системы, к которому вы хотите подключиться.

Ответ на вторую часть вашего вопроса. Вы можете использовать динамический прокси-сервер в более поздних версиях SSH для пересылки всего трафика с некоторыми оговорками.

Приложения, которые вы используете на своем клиенте, должны поддерживать прокси SOCKS.

OpenSSH поддерживает только прокси в стиле SOCKS4.

Используемый синтаксис:

ssh -D пользователь @ удаленный хост

Я думаю, что вы хотите:

  • В ssh из remote к local
  • и вперед порт 1234 на удаленном к порту 12345 на local

Вы, кажется, указываете, что local сидит за NAT происходит на router - вот почему вам нужно настроить переадресацию портов так, чтобы router:22 перенаправляет внутренне на local:22

Если я правильно понял это, командная строка, которую вы хотите использовать на удаленном компьютере, на самом деле:

ssh -L 1234:local:12345 user@router

Ключевым моментом здесь является то, что хотя это local форвард (-L == local) разрешение имени хоста (т. е. local в данном случае - второй параметр в 1234:local:12345 list) происходит на целевом компьютере, который в данном случае local.

В вашем примере у вас было 1234:router:12345 - это означает, что трафик идет по ssh-туннелю из remote к local; затем направляется из local к router - и, как вы сказали, для этого требуется еще один переадресация портов, чтобы вернуть трафик на local.


Альтернативой было бы ssh из local к remote, с помощью ssh -R 1234:local:12345. Это не потребует переадресации на router, но у тебя все еще есть 1234 на remote жду 12345 на local. Очевидным недостатком этого является то, что вы не можете инициировать это соединение из remote, так как у вас нет возможности добраться local.