동일한 터미널 명령을 사용하여 LAN 내부 및 외부에서 SSH 액세스


10

라즈베리 파이 (RPi)가 있는데 ssh를 사용하여 원격 연결을하고 있습니다. 로컬 영역 네트워크와 인터넷에서 (라우터에서 연 특정 포트를 사용하여) RPi에 액세스 할 수 있도록 ssh를 올바르게 설정했습니다.

사용자 이름 john과 이름 이 RPi 인 경우 raspi:

내부 LAN 액세스

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

외부 LAN 액세스

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

그러나 ssh raspiLAN 외부에서 간단하게 어떻게 할 수 있습니까? 하나는 LAN과 인터넷을 통해 두 개의 IP 주소를 가리 키도록 raspi를 구성하는 방법이 있습니까?

내가 기본적으로 원하는 것은 집에 있든 직장에 있든 단일 방식으로 내 RPi에 액세스하는 것입니다.


로컬 LAN에서 DNS 서버를 실행하면 로컬 LAN IP 주소로 "raspi"이름 요청에 응답합니다. 이제 같은 이름을 다른 외부 주소로 해석하려면 해결되는 방식으로 이름을 채워야합니다 (동적 DNS). 그러나 "raspi"보다 긴 이름이 필요할 것입니다.
ChuckCottrill

이 Q & A를보십시오 : unix.stackexchange.com/questions/61655/…
slm

답변:


7

질문을 자세히 살펴보면 LAN 내부와 외부에서 동일한 컴퓨터를 사용하고있는 것 같습니다. 이에 따라 답변을 수정했습니다.

에 다음 ~/.ssh/config을 추가하십시오.

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

그런 다음 ssh raspi-wanLAN 외부에서 또는 LAN ssh raspi-lan내부에서 DNS 서버를 조작하거나 /etc/hosts모든 사용자를 편집 하거나 루트로 수행 할 작업을하지 않아도됩니다. 현재 raspi위치에 따라 이름 을 다르게 해석하려면 네트워크를 감지하고 그에 따라 조치를 취하기 위해 쉘 스크립팅 마법이 필요할 것입니다.


1
감사합니다 DopeGhoti, 귀하의 솔루션에 매우 적합 -wan하며 -lan접미사 를 포함합니다 . 그러나 내 ssh는 Username필드를 싫어했습니다 (잘못된 구성 옵션). 그것없이 잘 작동합니다.
Aeronaelius

2
미안 해요, 올바른 구문은 User john, 없습니다 UserName. 나는 이것을 반영하기 위해 대답을 수정하고 있으므로 구성을 설정하면 ssh명령 줄 에서 사용자 이름을 생략 할 수 있습니다 .
DopeGhoti

5

이것은 lan 및 wan에 별도의 별칭을 사용하거나 추가 포트 전달을 만들지 않고도 ssh 구성으로 완벽하게 수행 할 수 있습니다. (하지만 당신은 당신이 당신의 랜 내부에 있는지 여부를 감지하는 자연스럽게 어떤 방법이 필요합니다)

에서 ~/.ssh/config다음과 같이 추가하려고합니다.

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

대신에 am_i_outside_of_my_lan당신은 당신이 당신의 홈 네트워크 내부에 있는지 여부를 결정하고 외부에 있다면 0 종료 코드와 함께, 그렇지 않으면 다른 것을 반환하는 명령을 원할 것입니다.

host조건은 아마 자기 설명이지만, exec조건 영장 몇 가지 설명 : 그것은 일치하는 경우에만 종료 코드 0, 즉와 주어진 명령으로 돌아갑니다. 오류가 없습니다.

다시 말해서, 이것이하는 일은 host raspi호스트 raspi에 연결하려고 할 때이 규칙을 exec "am_i_outside_my_lan"제한 하고, 더 나아가 홈 네트워크 외부에서 연결할 때만 적용되도록 제한합니다. 따라서 홈 네트워크 내부 ssh user@raspi는 정상적으로 정상적으로 작동하지만 외부에서는 규칙이 일치하고 대신에 해당 ssh -p 1234 user@12.345.67.89합니다.

대신에 사용 am_i_outside_of_my_lan하는 것은 전적으로 설정에 달려 있습니다. 인용을 맞추기가 약간 어려워 보이기 때문에 명령을 인라인으로 작성하지 않고 별도의 스크립트에 배치하는 것이 좋습니다.

개인적으로 다음 Python 스크립트를 사용하여 내 네트워크 내부에 있는지 여부를 감지했습니다. (도메인 이름이 내 네트워크 내부의 로컬 IP로 확인되므로)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

비슷한 설정이 없으면 다른 작업을 수행해야 할 수도 있습니다. (예를 들어, 연결된 무선 네트워크의 이름을 보거나 what-is-my-ip 서비스를 쿼리하여 연결된 네트워크의 외부 IP를 얻을 수 있습니다)


이것이 정답입니다. 다른 사람들이 더 많은 표를 얻는 것은 매우 슬픈 일입니다.
Jonathan Tomer

@JonathanTomer : 글쎄, 공정하게 말하면, 요청을받은 후이 3 년 동안 답변했습니다. 반면에 더 높은 점수를받은 답변은 몇 시간 내에 게시되었으므로 "조기 새가 벌레를 얻습니다"의 경우 일뿐입니다. -이 일반적인 솔루션의 Ellis Hoag의 특정 변형을 아주 좋아합니다. arp를 사용하는 것은 매우 영리하며 네트워크 감지 명령에서 모든 네트워크 설정에 대해 조정할 필요가 없으므로 솔루션을보다 일반적으로 만듭니다)
Aleksi Torhamo

3

컴퓨터 (연결 하는 컴퓨터 )에서에 호스트 이름을 설정할 수 있습니다 12.345.67.89. /etc/hosts파일을 열고 DNS 항목을 설정하십시오.

12.345.67.89    raspi

그런 다음 컴퓨터는 로컬 DNS 확인 프로세스의 일부로 "raspi"를 "12.345.67.89"로 변환합니다. 여러 대의 컴퓨터를 사용하는 경우 각 컴퓨터마다 변경해야합니다. 문제는 : 편집하려면 루트 액세스 권한이 필요하며 /etc/hosts어디서나 사용할 수는 없습니다.

"raspi"를 어디에서나 자동으로 인식하려면 죄송합니다 : 불가능합니다. "raspi"에 TLD가없고 DNS 루트 서버에 의존하지 않으므로 "raspi"를 도메인 이름으로 등록해야합니다. 그러나 도메인 이름을 등록 할 수 있습니다 (예를 들어 cfbaptista.meWAN IP 주소를 가리 킵니다. 포트 포워딩을 통해 다음을 통해 Raspberry Pi에 액세스 할 수 있습니다.

ssh (you@)(raspi.)cfbaptista.me

(여전히 거의 아무것도 돈을 쓰고 있지 않습니다 ...)

에 관한 user@부분, 그것은 다른 시스템에 로그인 이름에 따라 달라집니다. 당신이에 같은 이름이있는 경우 연결 기기 상의 원격 한 다음 필요는 지정 없습니다. 그렇지 않은 경우 원격 시스템의 사용자를 지정해야 합니다.


참고 : 다른 답변에서 언급했듯이 SSH 구성에서 호스트 별칭을 만들 수 있으며 루트는 필요하지 않습니다.
strugee

실제로! 여기에 작은 링크가 있습니다. 집합체
John WH Smith

0

목표 : ssh raspi LAN 내부와 공용 인터넷에서 작동해야합니다.

이렇게하려면 이름이 LAN의 내부 IP로, 외부의 공용 IP로 확인되는지 확인해야합니다.

먼저와 같은 도메인 이름을 얻어야합니다 raspi.yourdomain.com. 취미 사용을위한 무료 도메인은 http://freedns.afraid.org/ 를 확인하십시오 . 도메인을 퍼블릭 IP로 지정하십시오

LAN의 경우 DNSMasq를 실행하는 것이 좋습니다. 개방형 DD-WRT 펌웨어는 DHCP 및 DNS에 사용하여 DNSMasq와 긴밀하게 통합됩니다. 검색 도메인 ( "yourdomain.com")을 알려 주면 각 클라이언트의 요청 된 이름에 따라 DNS 이름이 자동 할당됩니다. 이 작업을 수행하려면 raspi의 / etc / hostname이 있어야합니다 raspi.

이것이 설정되면 raspi.yourdomain.com은 LAN의 로컬 IP로 확인해야합니다 (모든 컴퓨터에서 로컬 DNS를 사용하고 있는지 확인하십시오).

이제 스니퍼 트래픽이 많아 포트 22를 퍼블릭 인터넷에 노출하고 싶지 않을 것입니다. 따라서 라우터가 raspi : 22를 다른 포트 (예 : 1234)로 노출시킬 수 있습니다. 공용 및 내부 네트워크에서 동일한 포트를 사용하기 위해 raspi에 포트 리디렉션 규칙을 추가 할 수 있습니다. Linux에서 :

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(eth0을 ip link또는 로 표시된 네트워크 인터페이스 이름으로 변경 ifconfig하고 1234를 공용 포트로 변경하십시오)

이제 ssh -p 1234 raspi.yourdomain.com공용 및 LAN에서 모두 가능합니다.

ssh raspi@DopeGhoti에서 언급 한 것처럼 클라이언트 시스템에서 ~ / .ssh / config에 항목을 추가하여이를 단축 할 수 있습니다.

동일한 퍼블릭 IP에서 추가 머신의 SSH 포트를 노출하려면 다른 DNS 이름과 퍼블릭 포트로 프로세스를 반복하십시오. 건배!


0

다음은 curl을 사용하여 현재 공용 IP를 잡고 서버의 공용 IP와 일치하는지 확인하는 간결하고 작동하는 Aleksi Torhamo의 대답 버전입니다 (즉, 동일한 로컬 네트워크에 있음).

당신의 ~/.ssh/config추가

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234

나는 생각 ssh 때문에 이론적으로는 같은 것을 할 수 있어야 순서대로 일치하는 모든 지시를 처리 할 Match host raspi / User john / HostName 192.168.2.7다음을 Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234하나와 같은 효과를 얻을 curl, 호출시키는 == '12.345.67.89'경우는 제 2의 실패로 가정 할 Match규칙의 exec.
FeRD

(당신은 처음에 지정된 모든 인수가 있는지 확인해야 돌출 것 Match중 하나 동일하거나 또한 두 번째로 지정된 - 당신은 표준이 아닌 지정한 경우 Port xxxx처음에를 Match, 두 번째에서 표준 포트를 사용하고 싶었 Match, Port 22포트를 계속 사용하지 않도록 명시 적으로 다시 덮어 써야합니다 xxxx.)
FeRD

0

LAN에 연결했을 때 시스템에 IP 192.168.1. *가 있다고 가정하면 다음과 같은 구성으로 ~/.ssh/config이를 달성 할 수 있으므로 항상 동일한 명령 () 만 사용하여 ssh raspi연결할 수 있습니다.

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234

0

이 솔루션은 홈 네트워크에 일반적인 경우라고 생각되는 단일 라우터가 있다고 가정합니다.

에 추가 ~/.ssh/config

Match host raspi exec "test $(arp 192.168.1.1 | awk '{print $4}') = ROUTER_MAC_ADDRESS"
        Hostname 192.168.2.7
        User john

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