Заменить ProxyJump на Bash

Заменить ProxyJump на Bash

Мне нужно сделать некоторую разработку на каком-то удаленном ящике. К счастью, у меня есть доступ к оболочке, но мне нужно пройти через шлюз, у которого AllowTcpForwarding установлен на false.

Я заглянул в документацию и там написано:

AllowTcpForwarding Указывает, разрешена ли пересылка TCP. Значение по умолчанию — «да». Обратите внимание, что отключение пересылки TCP не повышает безопасность, если только пользователям также не запрещен доступ к оболочке, поскольку они всегда могут установить собственные пересылки.

Как бы я подошел к установке (или созданию) собственного форвардера? Моя цель здесь — настроитьудаленный переводчик с использованием Pycharmчерез SSH и привязывая его к какому-то локальному порту, эти данные передаются через ssh, те через шлюз, а затем на коробку разработки, где код фактически запускается. Я думаю, что я мог бы как-то использовать nc или какую-то другую утилиту unix, которая поможет выполнить работу.

Я знаю, что могу подключиться по ssh к своему удаленному компьютеру, выполнив:

ssh -t user1@gateway ssh user2@devbox

Но очевидно, что эта опция недоступна в pycharm. Мне придется открыть какой-нибудь локальный порт, чтобы

ssh -p 12345 localhost
(or variant)

подключит меня к user2@devbox. Это позволит мне настроить удаленный интерпретатор на использование порта 12345для localhostподключения к удаленному ящику.

решение1

Пока можно исполнятьsocatлокально и на gateway(или даже просто bashна , см cat. gatewayпоследний пример!) и разрешенонетиспользуйте pty, чтобы быть чистым 8 бит, возможно установить туннель через ssh. Вот 4 примера, улучшающие предыдущий:

Базовый пример, работающий один раз

(если бы он разветвился, потребовалось бы одно ssh-подключение на туннель, что нехорошо). Необходимо экранировать :for socat, чтобы принять команду exec:

  • термин1:
    $ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork
    
  • термин2:
    $ ssh -p 12345 user2@localhost
    
  • термин1:
    user1@gateway's password:
    
  • термин2:
    user2@localhost's password: 
    

Поменяв местами первый и второй адреса, сокет становится немедленно доступен

socatдолжен оставаться у власти, поэтому нет nofork:

  • термин1:
    $ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
    user1@gateway's password:
    
  • термин2:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

ИспользуяControlMasterсш

Позволяет выполнить разветвление, используя только одно SSH-подключение к шлюзу, тем самым обеспечивая поведение, похожее на обычную переадресацию портов:

  • термин1:
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • термин2:
    $ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'
    
  • термин3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

Имея только bashи catдоступно наgateway

Используяbashвстроенное перенаправление tcp, и две полудуплексные catкоманды (для полнодуплексного результата) одна даже не нуждается в удаленном socatили netcat. Обработка нескольких слоев вложенных и экранированных кавычек была немного неудобной и, возможно, может быть выполнена лучше или упрощена с помощью удаленного bashскрипта. Необходимо позаботиться о том, чтобы форк был catтолько для вывода:

  • term1 (без изменений):
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • термин2:
    $ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
    
  • термин3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

решение2

Заменить ProxyJump на Bash

Идея выше хороша! Вот моя общая версия ssh_config, когдаProxyJumpне работаетпотому чтоРазрешитьTcpForwardingустановлено значение no, а моей оболочкой по умолчанию является BASH:

ProxyCommand=ssh -T user1@gateway "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
  • Отключить псевдотерминальное распределение
  • исполнительныйНовый процесс (bash) не будет создан.
  • 3<>это просто перенаправление на доступный файловый дескриптор
  • /dev/tcp/...попросит bash открыть соответствующий TCP-сокет.
  • %часи%пбудет оценен вашим клиентом OpenSSH какdevboxи22
  • 2<&-закроет STDERR (вы также можете перенаправить его в /dev/null)
  • кот <&3 &прочитает выбранный файловый дескриптор 3 в фоновом режиме
  • кот >&3запишет наш файловый дескриптор на переднем плане
  • убей $!убьет "чтение"кот <&3команда, работающая в фоновом режиме, когда вы закрываете/разрываете соединение. В противном случае она бы продолжала работать.

Он мог бы заменить ProxyJump для меня в ситуациях, когда он был отключен на сервере перехода, но я действительно не хотел пересылать туда свой закрытый ключ или вводить какие-либо пароли без дополнительного уровня шифрования. Использование других SSH_AUTH_SOCK в качестве root или полная запись сеансов терминала с нажатиями клавиш — это обе реальные вещи.

Но, пожалуйста, всегда следите за тем, чтобы вы не нарушали никаких политик, которые к вам применимы!

решение3

О нет, мы чуть не забыли про Netcat!

Если на вашем хосте Jump есть Netcat (любой версии), вы можете использовать его вместо ProxyJump в своей конфигурации, как обычно:

ProxyCommand=ssh -T user1@gateway "exec nc %h %p"

Или из командной строки:

ssh user2@devbox -oProxyCommand="ssh -T user1@gateway 'exec nc devbox 22'"

решение4

Я бы просто настроил другой sshd для работы на другом порту.
Отредактируйте настройки так, чтобы tcpforwarding был разрешен.

cp /etc/ssh/sshd{,-second}_config 

Редактировать sshd-second_config

Port 22220
cp /usr/lib/systemd/system/sshd.service  /etc/systemd/system/sshd-second.service

Измените /etc/systemd/system/sshd-second.service следующим образом:

Description=OpenSSH server second instance daemon
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS

Строка ExecStart может отличаться в зависимости от версии.

systemctl daemon-reload
systemctl enable sshd-second.service --now

Более подробную информацию можно найти здесь:
https://access.redhat.com/solutions/1166283

Теперь вы сможете пересылать все, что захотите.

Связанный контент