Мне нужно сделать некоторую разработку на каком-то удаленном ящике. К счастью, у меня есть доступ к оболочке, но мне нужно пройти через шлюз, у которого 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
Теперь вы сможете пересылать все, что захотите.