У меня в локальной сети несколько машин. Один используется в качестве http-прокси для нацеливания на веб-сайты, расположенные на других (теперь он отлично работает благодаря ServerFault). На моем маршрутизаторе порт 22 подключен к этой прокси-машине через NAT. Я хотел бы иметь доступ к другим машинам в Интернете, например:
ssh user@first_machine.my_domain.tld ssh user@second_machine.my_domain.tld
Могу ли я использовать прокси-машину для «фильтрации» входящих ssh-запросов и перенаправления их на правильный компьютер? (точно так же это можно сделать для веб-сайтов, используя сочетание mod_proxy и namevirtualhost в Apache)
Большое спасибо Люк
Вы можете настроить это в своем .ssh/config
файл для автоматической настройки туннеля
http://backdrift.org/transparent-proxy-with-ssh
в основном вы просто добавляете что-то вроде
Host machinebehindrouter
ProxyCommand ssh user@externalhost nc %h %p
Вы можете сначала использовать VPN для подключения к удаленной сети, а затем напрямую через SSH. Это может или не может быть возможным, может быть, а может и не быть тем, чего вы хотите достичь в первую очередь, но это сработает.
Я настоятельно рекомендую вам подключить к Интернету как можно меньше машин через отображение портов! Особенно, если разрешена интерактивная аутентификация по паролю / клавиатуре. У людей действительно слабые пароли.
Еще одно предложение может заключаться в подключении к вашей прокси-машине и явной настройке туннелей для каждой машины, к которой вы хотите напрямую подключиться, за вашим NAT. Вы можете указать один (или несколько) туннелей SSH прямо из командной строки следующим образом:
ssh -L localport:hostnameOrIPofMachineBehindNAT:remoteMachinePort yourusername@proxy.example.com
куда localport
Это номер порта, который вам нужно подключить на вашем локальном хосте, который будет перенаправлен на машину за NAT, SSH туннелируется через ваш прокси.
hostnameOrIPofMachineBehindNAT
это LAN IP или LAN DNS машины без прокси, к которой вы хотите подключиться за NAT. Часто в частном диапазоне IP, таком как 10/8, 192.168 / 16 или 172.16 / 12.
remoteMachinePort
- это номер порта службы, к которой вы хотите подключиться на удаленном компьютере за NAT. В случае SSH скорее всего это будет стандартный порт 22.
Думаю, yourusername@proxy.example.com - это банально.
Затем вы можете подключиться к другому компьютеру из другой локальной оболочки следующим образом:
ssh usernameOnRemoteBoxBehindNat@localhost
Поскольку командная строка может легко стать очень длинной и утомительной для ввода, лучше заполнить все это желаемым количеством опций SSH и таким количеством туннелей портов, которые вам нравятся. ~/.ssh/.ssh_config
файл. Это сократит ввод текста до ssh connectionNickname
и всегда автоматически устанавливайте все переадресации и параметры.
Видеть man 5 ssh_config
для подробного объяснения и списка параметров конфигурации, которые вы можете использовать в ~/.ssh/.ssh_config
.
Я бы выбрал первый вариант и защитил другие машины, чтобы разрешить ssh только с первой машины.
Другие люди внесли хорошие предложения, но я думаю, что самый простой и гибкий ответ уже содержался в вашем вопросе, когда вы давали пример команды. То есть, если у нас есть исходный хост, промежуточный хост и целевой хост; и с тех пор ssh
может выполнять команды на удаленном хосте для нас, вы можете запустить эту команду с исходного хоста:
ssh -t $intermediate ssh $destination
Конечно, вы можете добавить другие параметры, если необходимо, либо ssh
или напишите оболочку оболочки (сценарий, псевдоним, функцию) для обработки любых переменных. В -t
flag заставляет выделить псевдотерминал, что я считаю необходимым, но вы можете протестировать соединение без него, чтобы убедиться в этом. Кроме того, если вы создаете пары открытого / закрытого ключей для каждого хоста в цепочке и используете ssh-agent, вы можете избежать ввода паролей.
Я бы посмотрел, просто подключился к вашему прокси-серверу или другому хосту, а затем использовал бы GNU screen
утилита, чтобы иметь несколько сеансов, работающих с другими вашими устройствами.
В качестве бонуса вы узнаете, как использовать screen
, это фантастическое приложение, о котором каждый должен знать больше!