NAT 라우터 뒤의 사무실 호스트에 대한 SSH 액세스


33

집에서 내 사무실 리눅스 호스트의 ssh 포트에 액세스하고 싶습니다. 불행히도 호스트는 NAT 라우터 뒤에 있습니다. 따라서 IP 주소는 공개적으로 사용할 수 없습니다. 그러나 불행히도 루트가 아닌 다른 인터넷 호스트 (서버)에 액세스 할 수 있습니다. 검색하는 동안 적절한 해결책을 찾지 못했습니다.

다음 설정 :

  • NAT 뒤에는 사무실 PC (리눅스, 루트 액세스) (공개가 아닌 IP)이지만 완전한 인터넷 액세스
  • 서버 PC (리눅스, 루트 액세스 권한 없음) 정적 및 공용 IP 및 전체 인터넷 액세스
  • NAT (공개가 아닌 IP) 뒤에있는 홈 PC (Linux, 루트 액세스)이지만 완전한 인터넷 액세스.

가능한 연결 : Office PC-> 서버 <-홈 PC

불가능 : Office PC <-X- Server -X-> 홈 PC

가정용 PC 나 서버 모두 Office PC에 대한 액세스를 시작할 수 없습니다. 그러나 Office PC와 Home PC 모두 서버 연결을 시작할 수 있습니다.

역방향 SSH 터널을 사용할 수 없음 : reverse ssh-tunnel이라는 방법을 시도했습니다. 불행히도 이것은 루트 액세스 권한이없는 / etc / ssh / sshd_config에서 서버의 GatewayPorts가 "yes"로 설정되어 있어야합니다.

원칙적으로 가능해야합니다.

0) 서버에서 2 포트 (1 수신, 1 송신)에서 수신 대기하는 사용자 공간 프로그램을 시작합니다

1) 내 사무실 PC에서 TCP 연결을 서버의 발신 포트로 열어 두는 다른 프로그램을 실행합니다.

2) 집에서 서버의 들어오는 포트에 연결합니다.

이를위한 표준 솔루션이 있어야합니다.

이 문제를 해결하는 가장 빠르고 깨끗한 솔루션은 무엇입니까?

솔직한


1
업무용 PC를 가정에 연결하여 ssh 터널을 설정할 수 있습니까? en.gentoo-wiki.com/wiki/Autossh

sftp 및 포트 전달과 함께 FileZilla를 사용할 수 있습니다. 체크 아웃 : superuser.com/a/1286681/141314
Noam Manos

답변:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

후에:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

수행 할 수있는 작업은 다음과 같습니다. 1 단계에서 원격 PC를 사무실 PC에서 서버로 전달합니다 ( 12345예 : 1024보다 큰 포트가 사용됨). 이제 서버에서 12345에 연결하면 officepc의 포트 22에 연결됩니다.

2 단계에서 포트 23456을 가정용 컴퓨터에서 서버의 12345로 전달하십시오 (1 단계에서 설정 한대로 officepc : 22로 전달됨)

3 단계에서 사무실 PC 로그인으로 로컬 포트 ​​23456에 연결합니다 . 2 단계에서 서버의 포트 12345로 전달되고 1 단계에서 사무실 PC로 전달됩니다.

전달을 위해 autossh를 사용하고 있습니다. 터널이 끊어지면 터널을 자동으로 다시 연결하는 ssh 래퍼입니다. 그러나 연결이 끊어지지 않는 한 정상적인 ssh도 작동합니다.

serverpc에서 localhost : 12345에 연결할 수있는 사람은 이제 officepc : 22에 연결하여 해킹을 시도 할 수 있습니다. (주 당신이 SSH 서버를 실행하는 경우, 당신은 어쨌든 기본적으로에있는 기본적인 보호 위를 확보해야 - 예를 들어 볼 나는 루트 로그인을 비활성화하고 암호 인증을 사용하지 않도록 적어도 추천 )

편집 : 동일한 구성으로 이것을 확인했으며 작동합니다. GatewayPorts no로컬 터널이 아닌 전 세계에 열려있는 포트에만 영향을줍니다. 전달 된 포트는 다음과 같습니다.

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

그래서, 지금까지의 네트워크 스택에 관한 한, 그것은 각각의 루프백 인터페이스 (플러스 SSH 연결에 대한 모든 로컬 트래픽의 serverpc는) 따라서 GatewayPorts전혀 확인되지 않습니다.

그러나 지시어가 있습니다 AllowTcpForwarding. 즉 no,이 설정은 루프백 인터페이스를 통하지 않고 전달이 전혀 허용되지 않으므로 실패합니다.

주의 사항 :

  • autossh 최근 SSH를 사용하는 경우, 당신은 SSH의 사용할 수 있습니다 ServerAliveIntervalServerAliveCountMax터널을 유지하기위한합니다. Autossh에는 내장 검사 기능이 있지만 Fedora에 문제가있는 것 같습니다. -M0그것을 비활성화 -oServerAliveInterval=20 -oServerAliveCountMax=3하고 연결이 작동하는지 확인합니다-20 초마다 시도하고 3 번 연속 실패하면 ssh를 중지합니다 (autossh는 새로운 것을 만듭니다).

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • 포워드가 실패하면-ssh 터널을 다시 시작하는 것이 유용 할 수 있습니다 -oExitOnForwardFailure=yes.

  • ~/.ssh/config옵션 및 포트에 사용 하는 것이 좋습니다. 그렇지 않으면 명령 줄이 너무 자세합니다. 예를 들면 다음과 같습니다.

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

그런 다음 서버 별명 만 사용할 수 있습니다.

    autossh -M0 fwdserverpc

나는 당신이 생각하는이 방법을 "역 ssh- 터널"이라고 생각합니다. 불행히도 이것은 / etc / ssh / sshd_config에서 서버의 GatewayPort가 "yes"로 설정되어 있어야합니다. 이 서버에는 게이트웨이 포트를 사용할 수 없으며 루트 액세스 권한이 없습니다.

3
@Frank : 사실, 그렇게 생각하지 않습니다 : GatewayPorts no열린 포트가 루프백 인터페이스에서만 액세스 할 수 있도록 제한합니다. 2 단계에서 루프백 인터페이스를 전달하고 있습니다 (실제로 두 전달은 "localhost 만"입니다).이 경우 작동 할 수 있습니다 ( AllowTcpForwarding nosshd 구성에서이 문제가 발생 함).
Piskvor

3
@ 프랭크 : 예, 확인했습니다. 이것은 심지어 작동합니다 GatewayPorts no; 답변을 편집했습니다. 이 설정을 위반할 수 있는 다른 지시문 (예 : PermitOpenAllowTcpForwarding)이 있습니다. manpagez.com/man/5/sshd_config
Piskvor

1
훌륭한 답변! 작동합니다. 주말을 저축했습니다! 많은 감사합니다 !!

1
내 autossh 버전 (Fedora Core)을 -M없이 터미널에서 실행할 수 없습니다. 나는 또한 그것을 경험 한 다른 사람과 연결되어 있습니다. 매뉴얼에서 옵션 인수로 표시되어있는 것이 맞습니다. 많은 사람들에게 효과가 있다면 좋을 것입니다.
Yaroslav Nikitenko

4

가정에서 내부 서버로, 내부 서버에서 사무실 Linux 시스템으로 내부 서버로 ssh 할 수있는 경우, 가정에서 ssh ProxyCommand를 사용하여 nc(netcat)을 통해 서버를 통해 내부 시스템으로 자동으로 바운스 할 수 있습니다.

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

그런 다음 ssh user@internalpc서버 시스템을 통해 자동으로 전달되므로 포트 나 터널을 열 필요가 없습니다.


1
답변 주셔서 감사합니다. 불행히도, 가정용 PC 나 서버는 Office PC에 대한 액세스를 시작할 수 없습니다. 그러나 Office PC와 Home PC 모두 서버 연결을 시작할 수 있습니다.

4

SSH에 원격으로 액세스하려는 컴퓨터에 Robo-TiTO를 설치하십시오.

  • 그러면 어디서나 Google 토크 클라이언트 앱을 사용하여 SSH에 액세스 할 수 있습니다.
  • 공개 IP 주소 나 특별한 설정이 필요하지 않습니다.
  • 더 이상 응용 프로그램 서비스를 지불하지 않는 무료 및 오픈 소스입니다.
  • SSH 포트를 열 필요가 없습니다 (컴퓨터를 안전하게 유지하십시오).
  • 터널링을 열 필요가 없습니다 (예 : VPN 또는 이와 유사한 것)

사이트가 이동함에 따라 다음 설치 지침은 더 이상 사용되지 않습니다. 새 URL은 https://github.com/formigarafa/robotito입니다.

Raspberry Pi의 Raspbian OS에서 테스트 한 스크립트를 만들었으므로 Robo-TiTO를 Raspberry Pi, Debian 또는 Ubuntu Box (Debian 패키지 배포)에 쉽게 설치할 수 있습니다. 다음은 Linux 상자를 원격으로 가져 오는 단계입니다.

  1. 쉘 명령을 열거 나 터미널이라고 부르고 홈 폴더로 이동하여 명령으로 설치 스크립트 다운로드 :

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. 그런 다음 command를 입력하여 스크립트를 실행하십시오.

    $ sudo ./robotito
    
  3. credentials.rbGTalk 계정을 사용하여 Robo-TiTO의 구성 폴더에서 파일 을 편집 하고 Ctrl+ X및 을 눌러 파일 을 저장할 수 Y있습니다. 기본값은 nano 편집기를 사용하는 것입니다.

  4. 명령으로 Robo-TiTO 폴더에서 Robo-TiTO 실행

    $ cd robotito
    $ ./jabbershd start
    
  5. 이제 모든 Google 토크 클라이언트에서 SSH를 사용할 수 있습니다. Robo-TiTO GTalk 계정을 Google 토크 계정에 추가하고 계정을 사용하기 전에 서로 채팅하여 테스트해야합니다.


5
"SSH 포트를 열 필요가 없습니다 (컴퓨터를 저장 하지 마십시오 )" 와 관련 하여 심각한 문제가 있습니다. 제안하는 쉘 오버 재버 봇 은 일반 텍스트로 인용, 인용 됩니다. 말 그대로 보안 은 제로 입니다. 누구나 들어올 수있는 트럭 크기의 구멍을 만들고 있습니다. SSH 공개 키 인증과는 대조적으로 : 유선을 통과하지 않는 자격 증명을 사용하여 보안 채널을 통해 인증하고 있습니다. 누가 컴퓨터를 안전하게 지키고 있습니까? CLIENT_PASSPHRASE = "logmein"
Piskvor

@Piskvor, robotito는 허용 된 연락처의 명령 만 실행합니다. github.com/formigarafa/robotito/blob/master/config/…
formigarafa

화이트리스트 기반 인증으로 인해 문제가 발생하지 않습니다. 내가 틀리지 않으면 GTalk와 함께 사용할 때 메시지 전송이 암호화됩니다. 어쨌든 최근에 변경 한 결과 이제는 Google OTP 또는 이와 유사한 도구에서 일회용 암호를 사용하여 액세스 할 수 있습니다.
formigarafa

1
@formigarafa : (1)이 제품의 개발에 참여했거나 관련된 경우 명시 적으로 말해야합니다. 같은 이름을 사용하는 것만으로는 충분하지 않습니다. 대부분의 사람들은 그것을 눈치 채지 못할 것입니다. ( 프로필 에서 언급 할 수 있습니다 .) (2) 게시물을 편집 할 때 최대한 수정해야합니다. 예를 들어“I'ts”와 같은 오타를 잡으십시오. 링크가 다운 된 경우 링크를 죽은 링크로 표시하지 마십시오. 새 URL 을 게시물에 넣습니다 . 사람들은 정확한 정보를 찾기 위해 의견을 파헤칠 필요가 없습니다.
G-남자 '는 분석 재개 모니카'말한다

@ G-Man, 원래 답변과 편집은 내 것이 아닙니다. 그리고 나는 그것을 내 것처럼 보이려는 의도가 없었습니다. 답변에 죽은 링크가 있음을 발견하고 링크를 만들지 않았습니다. 나는 실제로 그 내용을보고 싶어했고 그것을 따르려고했습니다. 불행히도 나는 자원을 찾을 수 없었다. 나는 그 답을 쓴 사람이 그 변경에 의해 통보되고 그것을 고치려고 노력하기를 희망하는 데 죽은 링크로 표시했다.
formigarafa

3

Piskvor의 솔루션은 효과적이고 훌륭합니다. 그러나 로그인 쉘이 걸려있는 상태에서 터미널이 매달려있는 상태를 유지합니다. 별로 시원하지 않습니다.

나는 항상 서버에 연결하고 cron에서 실행하여 연결을 유지하기 위해 작성한이 작은 스크립트를 사용했습니다.

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

우리는 분리 된 화면과 함께보다 우아한 autossh를 사용하여 Piskvor의 솔루션을 수정하거나 -NT ssh 인수를 사용하여 백그라운드에서 연결을 유지할 수 있습니다.


칭찬에 감사드립니다 :) 내 사용 사례의 경우 포워딩뿐만 아니라 쉘 액세스가 정기적으로 필요합니다. 또한, 나는 최소한의 경우 를 보여 주려고 노력했습니다 (투명한 SSH 호스트 호핑을 사용하여 위의 명령을 두 가지 명령으로 단순화 할 수는 있지만 homepc컴퓨터 에서 추가 구성이 필요 합니다).
Piskvor

2

나에게는 마치 SSH 터널 대신, 외부 서버를 사용하여 Hamachi 와 같은 프록시를 통해 작동하는 VPN 인 VPN을 사용해보십시오 . 이와 같은 다른 무료 소프트웨어가 있지만 Hamachi가 가장 좋습니다.


1
이제 것을 5.0.0.0/8네트워크가 실제로 할당 된 공용 IPv4 주소가, Hamachi를은 (Hamachi를 실행중인 경우, 당신은 인터넷의 다소 랜덤 부분에 액세스 할 수 없습니다) 문제이다. 또한 Hamachi는 더 이상 무료로 사용할 수 없습니다.
Piskvor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.