Я хочу подключиться по ssh к удаленному частному хосту, используя промежуточный сервер (bastion, jump, gateway). Эта команда работает отлично:
ssh gateway ssh private
С этой настройкой ~/.ssh/config:
Host gateway
User gateway-user
HostName XX.XX.XX.XX
RequestTTY force
Как мне реализовать это в моем ~/.ssh/config? Я пробовал многочисленные итерации ProxyCommand, но безуспешно. Я хочу использовать файл идентификации, расположенный на хосте шлюза, для доступа к частным хостам. Я хочу иметь возможность делать:
ssh private
Я знаю об описанной здесь методике, но она требует, чтобы мой открытый ключ был на всех частных хостах, а мне это не нужно:
http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/
решение1
Сначала настройте ключи ssh на шлюзе, чтобы вы могли подключаться по ssh к приватному. Затем на клиенте создайте отдельную пару ключей приватный/публичный, которую вы будете использовать для аутентификации на шлюзе. Например ssh-keygen -t rsa -f id_gateway
, .
Затем на шлюзе используйте command=
синтаксис в вашем файле authorized_keys. Например, ваша запись может выглядеть так:
command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....
Найдите страницу руководства sshd для command="command"
получения дополнительной информации. Обязательно добавьте ключ id_gateway.pub в эту строку. Затем в вашем .ssh/config
клиенте добавьте запись вроде этой:
Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Теперь из вашего клиента вы сможете ssh private
напрямую войти в него. Это работает даже для scp
и sftp
.
Дополнительный кредит
Если вы хотите использовать это для нескольких серверов, но хотите управлять только одним открытым ключом на шлюзе, вы можете использовать следующий трюк. sshd
по умолчанию позволяет получать только определенные переменные из локальной среды. Одна из них — LC_PAPER
которая редко используется для чего-либо. Поэтому мы можем использовать ее для передачи имени хоста сервера следующим образом:
Сначала измените запись открытого ключа на
command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...
Затем на клиенте добавьте в свой файл (или любую другую оболочку, которую вы используете) функцию .bashrc
, которая выглядит следующим образом:
ssh_proxy() {
LC_PAPER=$1 /usr/bin/ssh $*
}
Затем создайте псевдоним, если хотите:
alias ssh=ssh_proxy
Наконец, добавьте Host
разделы, .ssh/config
как показано выше. Например:
Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Теперь вы сможете сделать ssh private
это, ssh private2
используя только один открытый ключ на шлюзе.