ssh -L 여러 포트 전달


129

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

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

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

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

답변:


195

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


20
처음에는이 대답을 이해하지 못했습니다. 그래서 누군가가 같은 고통을 겪을 경우를 대비하여 여기에 예제를 게시하십시오. 저자는 "ssh -L port0 : ip : port0 -L port1 : ip : port1 ..."을 의미했습니다.
Mong H. Ng

96

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

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

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


Nan의 대답에 대한 훌륭한 보완. 감사.
AFP_555

1
주의 : "참고 : localhost를 지정하지 않으면 -L localhost : 8822 : REMOTE_IP_1 : 22와 동일합니다." 이는 GatewayPorts 설정이 기본값 인 'no'인 경우에만 해당됩니다. 그러나 그렇지 않은 경우 의미를 고려하여 설정을 확인하거나 더 나은 방법으로 명시 적으로 "-L localhost : 8822 ..."를 사용해야합니다.
David

나는 @ 데이비드의 동의 By default, anyone (even on different machines) can connect to the specified port on the SSH client machine. However, this can be restricted to programs on the same host by supplying a bind address: ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com ssh.com/ssh/tunneling/example
칼 Pokus

24

다음 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}

2
-f백그라운드에서 실행하는 데 사용
Karl Pokus

음 ... 왜 그런 식으로하고 싶어?
Anton Bessonov

14

동일한 호스트를 통해 여러 포트를 전달하는 사람들 의 경우 ~ / .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집니다.


나는이 접근 방식을 좋아합니다.
BMW

8

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


3

포트 포워딩을 사용하여 서버에 로그인 할 때의 이점 중 하나는 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는 절차를 단순화하기 위해 동일 할 수 있습니다.


다른 서버의 동일한 포트는 다른 포트입니다. 따라서 항상 동일한 포트 번호를 지정하여 작업을 더 쉽게 만들 수 있습니다!
Fei Yao

3

우리 회사에서 나와 팀원 모두 연결할 수없는 "대상"서버의 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의 동일한 포트에 해당합니다 (제 경우에는 두 개의 웹 서비스를 호스팅합니다). ).


1

ssh 포워딩을 돕기 위해 loco 를 개발했습니다 . 동일한 포트에서 로컬로 원격으로 포트 5000 및 7000을 공유하는 데 사용할 수 있습니다.

pip install loco

loco listen SSHINFO -r 5000 -r 7000

1

백그라운드에서 실행되고 죽이기 쉬운 간단한 솔루션을 원한다면 제어 소켓을 사용하십시오.

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST

1

다음은 Yuval Atzmon에서 영감을 얻은 솔루션입니다.

초기 솔루션에 비해 몇 가지 이점이 있습니다.

  • 먼저 포트 당 하나가 아닌 단일 백그라운드 프로세스를 생성합니다.
  • 터널을 죽일 수있는 별칭을 생성합니다.
  • 약간 더 안전한 127.0.0.1에만 바인딩됩니다.

다음과 같이 사용할 수 있습니다.

  • tnl your.remote.com 1234
  • tnl your.remote.com {1234,1235}
  • tnl your.remote.com {1234..1236}

그리고 마지막으로 tnlkill.

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}

-1

이 zsh 함수를 사용할 수 있습니다 (아마도 bash에서도 작동 함) (Put it in ~/.zshrc) :

ashL () {
    local a=() i
    for i in "$@[2,-1]"
    do
        a+=(-L "${i}:localhost:${i}")
    done
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}

예 :

ashL db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.