Конфигурация
- LOCAL: Локальный компьютер, который создаст соединение ssh и выдаст команды в поле REMOTE.
- PROXY: Экземпляр EC-2 с доступом ssh к LOCAL и REMOTE.
- REMOTE: Удаленная машина, сидящая за NAT-маршрутизатором (недоступна LOCAL, но откроет соединение с PROXY и разрешит LOCAL туннелировать его).
Шаги переадресации портов (через командную строку)
-
Создайте соединение ssh с REMOTE на PROXY, чтобы перенаправить ssh-трафик на порт 22 на машине REMOTE на порт 8000 на сервере PROXY.
# Запуск с машины REMOTE
ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER @PROXY_HOSTNAME -
Создайте туннель ssh из LOCAL в PROXY и переместите ssh-трафик из LOCAL: 1234 в PROXY: 8000 (который затем переместится на REMOTE: 22).
# Запуск из локальной машины
ssh -L 1234: localhost: 8000 PROXY_USER @PROXY_HOSTNAME -
Создайте перенаправленное ssh-соединение с LOCAL на REMOTE (через PROXY).
# Запуск из LOCAL машины в новом окне терминала
ssh -p 1234 REMOTE_USER @localhost# У меня теперь ssh'd в поле REMOTE и вы можете запускать команды
Исследование Парамико
Я рассмотрел несколько questions, связанных с переадресацией портов с помощью Paramiko, но они похоже, не затрагивают эту конкретную ситуацию.
Мой вопрос
Как я могу использовать Paramiko для выполнения шагов 2 и 3 выше? Я, по сути, хотел бы запустить:
import paramiko
# Create the tunnel connection
tunnel_cli = paramiko.SSHClient()
tunnel_cli.connect(PROXY_HOSTNAME, PROXY_PORT, PROXY_USER)
# Create the forwarded connection and issue commands from LOCAL on the REMOTE box
fwd_cli = paramiko.SSHClient()
fwd_cli.connect('localhost', LOCAL_PORT, REMOTE_USER)
fwd_cli.exec_command('pwd')