일부 원격 상자에 대한 개발을 수행해야 합니다. 다행히 셸 액세스 권한이 있지만 AllowTcpForwarding이 false로 설정된 게이트웨이를 통과해야 합니다.
나는 문서에서 다음과 같은 최고점을 보았습니다.
AllowTcpForwarding TCP 전달이 허용되는지 여부를 지정합니다. 기본값은 "예"입니다. 사용자는 언제든지 자체 전달자를 설치할 수 있으므로 TCP 전달을 비활성화해도 사용자가 셸 액세스를 거부하지 않는 한 보안이 향상되지 않습니다.
내 자신의 중계기를 어떻게 설치(또는 구축)합니까? 내 목표는Pycharm의 원격 인터프리터 사용데이터는 SSH를 통해 공급되고 게이트웨이를 통해 일부 로컬 포트에 바인딩된 다음 코드가 실제로 실행되는 개발 상자에 바인딩됩니다. 나는 어떻게든 nc나 다른 유닉스 유틸리티를 활용하여 작업을 완료할 수 있을 것이라고 생각합니다.
다음을 통해 원격 상자에 SSH로 연결할 수 있다는 것을 알고 있습니다.
ssh -t user1@gateway ssh user2@devbox
하지만 분명히 이 옵션은 pycharm에서는 사용할 수 없습니다. 일부 로컬 포트를 열 수 있어야 합니다.
ssh -p 12345 localhost
(or variant)
user2@devbox로 연결해 드리겠습니다. 이렇게 하면 원격 상자에 12345
연결하기 위해 포트를 사용하도록 원격 통역사를 구성할 수 있습니다 .localhost
답변1
실행될 수 있는 한socat
local 및 on gateway
(또는 심지어는 bash
and cat
on gateway
, 마지막 예를 참조하세요!) 및 허용아니요pty를 사용하면 8비트가 깨끗하고 SSH를 통해 터널링할 수 있습니다. 다음은 이전 예시를 개선한 4가지 예시입니다.
기본 예제는 한 번만 작동합니다.
(포크하려면 터널당 하나의 SSH 연결이 필요하므로 좋지 않습니다.) :
exec 명령을 수락하려면 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:
사용하다ControlMaster
SSH
A는 게이트웨이에 대한 단일 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 리디렉션및 2개의 반이중 cat
명령(전이중 결과용)은 원격 socat
또는 netcat
. bash
원격 스크립트. 분기는 cat
출력용으로만 사용된다는 점에 유의하는 것이 중요합니다 .
- 항목 1(변경 사항 없음):
$ 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
이제 원하는 것은 무엇이든 전달할 수 있습니다.