ProxyJump를 Bash로 교체

ProxyJump를 Bash로 교체

일부 원격 상자에서 수행해야 할 몇 가지 개발이 있습니다. 다행히 셸 액세스 권한이 있지만 AllowTcpForwarding이 false로 설정된 게이트웨이를 통과해야 합니다.

나는 문서에서 정점을 찍었고 다음과 같이 말합니다.

AllowTcpForwarding TCP 전달이 허용되는지 여부를 지정합니다. 기본값은 '예'입니다. 사용자는 언제든지 자체 전달자를 설치할 수 있으므로 TCP 전달을 비활성화해도 사용자가 셸 액세스도 거부되지 않는 한 보안이 향상되지 않습니다.

나만의 전달자를 설치(또는 구축)하려면 어떻게 해야 합니까? 여기서 내 목표는Pycharm을 사용한 원격 통역사SSH를 통해 일부 로컬 포트에 바인딩하고 해당 데이터는 SSH를 통해 공급되고 게이트웨이를 통해 코드가 실제로 실행되는 개발 상자에 연결됩니다. 나는 작업을 완료하는 데 도움이 될 nc나 다른 유닉스 유틸리티를 어떻게든 활용할 수 있을 것이라고 상상합니다.

다음을 수행하여 원격 상자에 SSH로 연결할 수 있다는 것을 알고 있습니다.

ssh -t user1@gateway ssh user2@devbox

그러나 분명히 이 옵션은 pycharm에서는 사용할 수 없습니다. 로컬 포트를 열 수 있어야 합니다.

ssh -p 12345 localhost
(or variant)

user2@devbox로 연결해 드리겠습니다. 이렇게 하면 원격 상자에 연결하기 위해 포트를 사용 12345하도록 원격 해석기를 구성할 수 있습니다 .localhost

답변1

실행할 수 있는 한socatlocal 및 on gateway(또는 심지어는 bashand caton gateway, 마지막 예 참조!) 및 다음이 허용됩니다.~ 아니다pty를 사용하여 8비트를 깨끗하게 유지하면 SSH를 통해 터널을 설정할 수 있습니다. 다음은 이전 예시를 개선한 4가지 예시입니다.

한 번만 작동하는 기본 예

(포크를 사용하려면 터널당 하나의 SSH 연결이 필요하지만 좋지 않습니다.) :exec 명령을 수락하려면 for socat를 이스케이프해야 합니다 .

  • 용어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:
    

사용하여ControlMasterSSH

게이트웨이에 대한 단일 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 버전입니다.프록시점프작동 안됨왜냐하면Tcp전달 허용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 클라이언트는 다음과 같이 평가합니다.개발자 상자그리고22
  • 2<&-STDERR을 닫습니다(/dev/null로 리디렉션할 수도 있음).
  • 고양이 <&3 &백그라운드에서 선택된 파일 설명자 3을 읽습니다.
  • 고양이 >&3파일 설명자를 포그라운드에 작성합니다.
  • $를 죽여라!"읽기"를 죽일 것입니다고양이 <&3연결을 닫거나 끊을 때 백그라운드에서 실행되는 명령입니다. 그렇지 않으면 계속 실행될 것입니다.

점프 서버에서 비활성화된 상황에서 ProxyJump를 대체할 수 있지만 저는 실제로 내 개인 키를 그곳으로 전달하거나 추가 암호화 수준 없이 비밀번호를 입력하고 싶지 않았습니다. 다른 SSH_AUTH_SOCK을 루트로 사용하거나 키 입력으로 완전히 터미널 세션을 기록하는 것은 모두 실제입니다.

하지만 귀하에게 적용되는 정책을 위반하지 않도록 항상 확인하시기 바랍니다!

답변3

아뇨, 우리는 Netcat을 거의 잊어버렸습니다!

점프 호스트에 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

이제 원하는 것은 무엇이든 전달할 수 있습니다.

관련 정보