У меня следующая настройка: одна машина с запущенным 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 пользователь @ удаленный хост
Я думаю, что вы хотите:
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
.