이것은 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를 얻을 수 있습니다)