Я хотел бы получить доступ к ssh порту своего офиса хост Linux из дома. К сожалению, хост расположен позади маршрутизатора NAT. Так, IP-адрес не общедоступен. Существует однако доступ к другому узлу Интернета (Сервер), который является, к сожалению, только некорневым доступом. Через некоторое время поиска я не нахожу подходящее решение.
Следующая установка:
Возможные соединения: Office ПК-> Сервер <-Домашний ПК
Не возможный: Office ПК <-X-сервер-X-> Домашний ПК
Ни Домашний ПК, ни Сервер не могут инициировать доступ к Office ПК. Но и Office ПК и Домашний ПК могут инициировать соединения с Сервером.
Инвертируйте туннель SSH, не возможный: Я попробовал метод, названный обратным ssh-туннелем. К сожалению, это требует GatewayPorts на наборе Сервера к "да" в/etc/ssh/sshd_config, где у меня нет корневого доступа.
В принципе это должно быть возможно:
0) На Сервере я запускаю программу пространства пользователя, которая слушает на 2 портах (1 поступление, 1 выход)
1) На моем офисе ПК я запускаю другую программу, которая сохраняет соединение TCP открытым для исходящего порта на сервере.
2) Из дома я соединяюсь с входящим портом Сервера.
Должно быть стандартное решение для этого там.
Каково самое быстрое и самое чистое решение решить это?
Frank
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 должен сделать). Теперь соединение с 12 345 на сервере должно соединить Вас для портирования 22 на officepc.
На шаге 2 передайте порт 23456 от Вашей домашней машины до 12 345 на сервере (откуда, это передается officepc:22, как настроено на шаге 1),
На шаге 3 Вы соединяетесь с локальным портом 23456 с Вашим офисом вход в систему ПК. Это передается шагом 2 к порту 12345 на Вашем сервере, и шагом 1 к Вашему офису ПК.
Обратите внимание, что я использую autossh для передач, поскольку это - ssh обертка, которая автоматически снова соединяется, туннель должен это быть разъединенным; однако нормальный ssh работал бы также, пока соединение не отбрасывает.
Существует возможная уязвимость: любой, кто может соединиться с localhost:12345 на serverpc, может теперь соединиться с officepc:22 и попытаться взломать его. (Обратите внимание, что при выполнении сервера SSH необходимо так или иначе защитить его выше основных мер защиты, которые идут по умолчанию; я рекомендую, по крайней мере, отключить корневой вход в систему и отключить аутентификацию по паролю - посмотрите, например, это),
Править: Я проверил это с той же конфигурацией, и она работает. 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's ServerAliveInterval
и ServerAliveCountMax
для того, чтобы продолжить туннель. Autossh имеет встроенную проверку, но по-видимому он имеет некоторые проблемы о Fedora. -M0
отключает это, и -oServerAliveInterval=20 -oServerAliveCountMax=3
проверки, если соединение закончилось - пробуют каждые 20 секунд, если оно перестало работать 3x подряд, 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
Если Вы можете ssh к внутреннему серверу из дома и от внутреннего сервера до Вашего офиса машина Linux, то из дома можно использовать ssh ProxyCommand
возвращаться тихо через сервер к внутренней машине через nc
(netcat)
# ~/.ssh/config on your home machine:
Host internalpc
ForwardAgent yes
ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p
Затем Вы просто ssh user@internalpc
и Вы тихо передаетесь через машину сервера, никакое открытие портов или туннелей, требуемых на любом конце.
Мне это походит вместо туннеля SSH, необходимо попробовать VPN: вид, который работает при помощи сервера над внешней стороной для проксирования через, такие как Hamachi. Существует другое бесплатное программное обеспечение как этот, но Hamachi является моим fav.