youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc
Позже:
you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc
you@homepc$ ssh youatwork@localhost -p 23456
Вы можете сделать следующее: на шаге 1 перенаправить удаленный порт с офисного ПК на сервер ( 12345
в качестве примера используется любой порт> 1024). Теперь подключение к 12345 на сервере должно соединить вас с портом 22 на officepc.
На шаге 2 перенаправьте порт 23456 с вашего домашнего компьютера на сервер 12345 на сервере (откуда он перенаправляется на officepc: 22, как настроено на шаге 1).
На шаге 3 вы подключаетесь к локальному порту 23456, используя логин вашего офисного ПК . Этап перенаправляется с шага 2 на порт 12345 на вашем сервере и с шага 1 на ваш офисный ПК.
Обратите внимание, что я использую autossh для пересылок, так как это ssh-оболочка, которая автоматически переподключает туннель, если он отключен; однако обычный ssh также будет работать, пока соединение не прерывается.
Возможна уязвимость: любой, кто может подключиться к localhost: 12345 на serverpc, теперь может подключиться к officepc: 22 и попытаться взломать его. (Обратите внимание, что если вы используете сервер SSH, вы должны в любом случае защитить его от базовых защит, которые включены по умолчанию; я рекомендую по крайней мере отключить root-вход и отключить аутентификацию по паролю - см., Например, это )
Изменить : я подтвердил это с той же конфигурации, и он работает. GatewayPorts no
влияет только на порты, которые открыты для всего мира, а не на локальные туннели. Вот что представляют собой перенаправленные порты:
homepc:
outgoing ssh to serverpc:22
listening localhost:23456 forwarded through ssh tunnel
serverpc:
listening ssh at *:22
incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
outgoing ssh to serverpc:22
incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22
Итак, что касается сетевого стека, то это весь локальный трафик на соответствующих интерфейсах обратной связи (плюс ssh-соединения с serverpc); следовательно, GatewayPorts
вообще не проверяется.
Однако существует директива AllowTcpForwarding
: если это так no
, эта настройка не будет выполнена, поскольку пересылка вообще не разрешена, даже через интерфейс обратной связи.
Предостережения :
Если вы используете autossh и последние ssh, вы можете использовать ssh ServerAliveInterval
и ServerAliveCountMax
для поддержания туннеля. Autossh имеет встроенную проверку, но, очевидно, у него есть некоторые проблемы с Fedora. -M0
отключает это и -oServerAliveInterval=20 -oServerAliveCountMax=3
проверяет, установлено ли соединение - пробует каждые 20 секунд, если оно терпит неудачу 3 раза подряд, останавливает ssh (и autossh создает новое):
autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
может быть полезно перезапустить ssh-туннель, если переадресация завершается неудачно, используя -oExitOnForwardFailure=yes
- если порт уже привязан, вы можете получить работающее соединение SSH, но не переадресованный туннель.
~/.ssh/config
рекомендуется использовать для параметров (и портов), в противном случае командные строки становятся слишком многословными. Например:
Host fwdserverpc
Hostname serverpc
User notroot
ServerAliveInterval 20
ServerAliveCountMax 3
ExitOnForwardFailure yes
LocalForward 23456 localhost:12345
Тогда вы можете использовать только псевдоним сервера:
autossh -M0 fwdserverpc