СПОСІБ 1 (використовуйте ssh-ключ на інтерфейсі)
Якщо потрібно зберегти потік автентифікації
local -- authenticate --> inter -- authenticate (ask password) --> final
Це неможливо зробити з .ssh / config proxyhost.
Що вам потрібно, це псевдонім оболонки bash (сподіваюся, ви використовуєте bash).
В ~/.bashrc
, додайте наступний рядок
alias ssh-final='ssh -t inter ssh user2@final.com'
У командному рядку просто введіть наступні
ssh-final
final
розділ у ~/.ssh/config
не використовується.
Деталі підключення (1)
ssh -t inter ssh user2@final.com
можна розглядати наступним чином
local# ssh inter
inter# ssh user2@final.com
local
лише "розмовляє" inter
. Немає прямого або непрямого ssh-з'єднання між ними local
і final
. local
просто відображає вихід ssh user2@final.com
.
СПОСІБ 2 (використовуйте ssh-ключ на локальному)
Аутентифікація з тим же ssh-ключем
Host inter
User user1
HostName inter.example.com
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
Копіювати місцеві ~/.ssh/id_ras.pub
до
/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`
Подробиці про з'єднання (2)
ssh тунелювання
Перш ніж ми підемо в деталі ProxyCommand
, давайте розглянемо наступний приклад
Крок 1, на вікні терміналу 1
local# ssh inter -L 2000:final.com:22
Етап 2, на вікні терміналу 2
local# ssh localhost -p 2000
У терміналі 1 тунель налаштовується між локальним портом 2000 і final.com порт 22. Все, що надіслано до локального порту 2000, буде перенаправлено до порта final.com 22 і навпаки.
У терміналі 2 ssh підключається до локального порту 2000, але насправді спілкується з final.com port 22, який є sshd.
З тунелювання, локальний клієнт SSH на кроці 2 пов'язаний з final.com sshd безпосередньо.
"Висновок" локальних портів 2000, є "сирим" трафіком демон ssh.
Загальним використанням такого тунелю є доступ до внутрішнього веб-сервера або сервера електронної пошти. Нижче наведено приклад для веб-сервера
local# ssh inter -L 2000:final.com:80
У браузері використовуйте наступну URL-адресу
http://localhost:2000
Дві кінцеві точки тунелю - локальний порт 2000, а final.com порт 80.
Трафік, що надходить і виходить з кінцевої точки тунелю "ЯК Є". Давайте назвемо це "сирим" трафіком.
ProxyCommand
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
The ProxyCommand
зробіть це на крок далі. Він пропускає крок створення локального порту і підключається до нього.
Клієнт ssh виконуватиме будь-яку команду, що надається позаду ProxyCommand
і обробляти вихід цієї команди як "необроблений" трафік. Він утримує локальну кінцеву точку, а потім починає з нею ssh-з'єднання.
Чому одна робота іншого не робить?
Наступна команда
ssh inter nc final.com 22
в основному означає (1) підключення inter
, потім (2) увімкнено inter
, запустіть команду nc final.com 22
.
nc - arbitrary TCP and UDP connections and listens
Тому nc final.com 22
підключиться до порту final.com 22, роздрукує весь вхідний трафік до stdout і надішле всі stdin на іншу сторону. Це "тунель" між nc stdin / out та final.com port 22.
З nc
виконується в сеансі ssh, весь його stdout передається назад до клієнта ssh, як "raw" трафік. А клієнт ssh може передати трафік в nc stdin, що закінчиться на final.com port 22.
Через вищезгаданий "тунель" локальний клієнт ssh почне сеанс ssh з final.com
безпосередньо.
Наступна команда
ssh -t inter ssh user2@final.com
не працює ProxyCommand
тому що вихід з нього не є "сирим" трафіком від демона ssh. Це вихідний сигнал a ssh клієнт . Клієнт розмовляє з клієнтом означає не бізнес.
Аутентифікація з іншим ssh-ключем (оригінальна конфігурація OP)
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
Копіювати місцеві ~/.ssh/id_ras.pub
до
/home/user1/.ssh/authorized_keys in `inter`
Копіювати місцеві ~/.ssh/id_ras_2.pub
до
/home/user2/.ssh/authorized_keys in `final`
Обидва вищезгадані дії дозволять наступне використання
local# ssh final
Додаткова перевірка
Використовуйте багатослівний
local# ssh -v final
Це допоможе виявити проблему ssh.
Перевірте nc
ProxcyCommand
виконується nc
на inter
. Перевірте, якщо nc
фактично доступний на inter
.
local# ssh inter
inter# nc final.com 22
Перевірте ключ rsa належним чином
Якщо використовуються різні ключі inter
і final
наступні файли повинні існувати в локальній машині
local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub
Оскільки ви можете ssh to inter
вже, перевірте налаштування клавіш на final
. З локальної машини
local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys
Ви повинні побачити вміст id_rsa_2.pub
там.
ssh -t
, але що я хотів би зробити, це точно моделювати поведінку, яку я маю від використанняssh -t
використовуючи лише конфігурацію на.ssh/config
.