[ssh] ssh -L 여러 포트 전달

현재 다음을 실행하고 있습니다.

sudo ssh -L PORT:IP:PORT root@IP

여기서 IP는 보안 시스템의 대상이고 PORT는 내가 전달하는 포트를 나타냅니다.

이 포워딩 없이는 액세스 할 수없는 애플리케이션을 많이 사용하기 때문입니다. 이 작업을 수행 한 후을 통해 액세스 할 수 있습니다 localhost:PORT.

실제로 전달해야하는이 포트 중 4 개가 있으므로 주요 문제가 발생했습니다.

내 해결책은 4 개의 셸을 열고 지속적으로 내 기록을 뒤로 검색하여 정확히 어떤 포트를 전달해야하는지 등을 찾은 다음이 명령을 각 셸에서 하나씩 실행하는 것입니다 (암호를 입력해야 함).

다음과 같이 할 수만 있다면 :

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

그러면 이미 정말 도움이 될 것입니다.

더 쉽게 할 수있는 방법이 있습니까?



답변

-L옵션은 동일한 명령 내에서 여러 번 지정할 수 있습니다. 다른 포트로 매번.


답변

NaN이 정확히 대답 한대로 여러 -L 인수를 지정합니다. 나는 항상 이것을한다. 다음은 다중 포트 전달의 예입니다.

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

참고 : 이는 -L localhost:8822:REMOTE_IP_1:22지정하지 않은 경우 와 동일 localhost합니다.

이제 이것으로 (다른 터미널에서) 다음을 수행 할 수 있습니다.

ssh localhost -p 8822

에 연결하는 REMOTE_IP_1포트22

유사하게

ssh localhost -p 9922

에 연결하는 REMOTE_IP_2포트22

물론,이를 스크립트로 래핑하거나 특정 특정 포트로 전달할 호스트 / 포트가 많은 경우 자동화하는 것을 막을 수는 없습니다.

도움이 되었기를 바랍니다.


답변

다음 bash 함수를 사용할 수 있습니다 (단지에 추가하십시오 ~/.bashrc).

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done
}

사용 예 :

pfwd hostname {6000..6009}


답변

동일한 호스트를 통해 여러 포트를 전달하는 사람들 의 경우 ~ / .ssh / config 에서 이와 같이 설정할 수 있습니다.

Host all-port-forwards
Hostname 10.122.0.3
User username
LocalForward PORT_1 IP:PORT_1
LocalForward PORT_2 IP:PORT_2
LocalForward PORT_3 IP:PORT_3
LocalForward PORT_4 IP:PORT_4

단순 해 ssh all-port-forwards집니다.


답변

jbchichoko와 yuval은 실행 가능한 솔루션을 제공했습니다. 그러나 jbchichoko의 대답은 함수로서의 유연한 대답이 아니며 yuval의 대답에 의해 열린 터널 ctrl+c은 백그라운드에서 실행되기 때문에 종료 할 수 없습니다 . 두 가지 결함을 모두 해결하는 아래 솔루션을 제공합니다.

~/.bashrc또는 에서 함수 정의~/.zshrc :

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

함수 실행의 예 :

fsshmap 6000 6010 hostname

이 예의 결과 :

127.0.0.1:16000~16009다음과 동일하게 액세스 할 수 있습니다 .hostname:6000~6009


답변

포트 포워딩을 사용하여 서버에 로그인 할 때의 이점 중 하나는 Jupyter Notebook을 쉽게 사용할 수 있다는 것입니다. 이 링크 는 그 방법에 대한 훌륭한 설명을 제공합니다. 여기에 여러분 모두가 참고할 수 있도록 요약과 확장을하고 싶습니다.

상황 1. Host-A라는 로컬 컴퓨터 (예 : 자신의 랩톱)에서 Host-B라는 원격 작업 컴퓨터에 로그인합니다.

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

그런 다음 브라우저를 열고 http : // localhost : port_A / 를 입력 하여 Host-B에서 작업을 수행하지만 Host-A에서 볼 수 있습니다.

상황 2. Host-A라는 로컬 시스템 (예 : 자신의 랩톱)에서 Host-B라는 원격 로그인 시스템에 로그인하고 거기에서 Host-C라는 원격 작업 시스템에 로그인합니다. 이는 일반적으로 대학 내 대부분의 분석 서버에 해당 ssh -L하며 -t.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

그런 다음 브라우저를 열고 http : // localhost : port_A / 를 입력 하여 Host-C에서 작업을 수행하지만 Host-A에서 볼 수 있습니다.

상황 3. Host-A라는 로컬 시스템 (예 : 자신의 랩톱)에서 Host-B라는 원격 로그인 시스템에 로그인하고 거기에서 Host-C라는 원격 작업 시스템에 로그인하고 마지막으로 원격 작업 시스템 Host-에 로그인합니다. 디. 이것은 보통은 아니지만 언젠가 발생할 수 있습니다. 상황 2의 확장이며 동일한 논리를 더 많은 컴퓨터에 적용 할 수 있습니다.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

그런 다음 브라우저를 열고 http : // localhost : port_A / 를 입력 하여 Host-D에서 작업을 수행하지만 Host-A에서 볼 수 있습니다.

port_A, port_B, port_C, port_D는 여기에 나열된 일반적인 포트 번호를 제외하고 난수 일 수 있습니다 . 상황 1에서 port_A와 port_B는 절차를 단순화하기 위해 동일 할 수 있습니다.


답변

우리 회사에서 나와 팀원 모두 연결할 수없는 “대상”서버의 3 개 포트에 액세스해야하므로 연결 가능한 서버에서 연결 가능한 영구 터널 (즉 , 백그라운드에서 무한히 실행될 수있는 터널 , params -f및 참조 -N)을 만들었습니다. 목표 하나. 도달 가능한 서버의 명령 줄에서 다음을 실행했습니다.

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

사용자를 사용 root했지만 자신의 사용자가 작동합니다. 선택한 사용자의 암호를 입력해야합니다 (해당 사용자로 연결 가능한 서버에 이미 연결되어있는 경우에도).

이제 연결 가능한 컴퓨터의 포트 8822는 대상 1 (ssh / PuTTY / WinSCP의 경우)의 포트 22에 해당하고 연결 가능한 컴퓨터의 포트 9006 및 9100은 대상 1의 동일한 포트에 해당합니다 (제 경우에는 두 개의 웹 서비스를 호스팅합니다). ).