처음‎ > ‎지식기반‎ > ‎

Pagekite, 공인IP 없이 외부에서 RPi 접속 하기

게시자: Sundew Shin, 2016. 12. 1. 오전 8:26   [ 2016. 12. 2. 오전 11:09에 업데이트됨 ]




새로 RPi를 홈네트웍에 연결 시킨 후 외부에서 원격접속(SSH 등) 할 수 있는 방법을 소개 합니다.
공유기나 방화벽 등, 기타 다른 설정 없이 해당 RPi에서만 필요한 설정을 하면 그만이니 이용이 간단합니다.

같은 방법으로 웹서버 나 기타 서버를 운영 할 수도 있는데, 이 글의 초점은 그 원격에서의 연결성에 있고, RPi가 서버 용도로 적합한지에 대한 논의는 따로 하지 않을 생각입니다. 관련해서는 'RPi.서버' 게시판 그룹을 참고 해 주세요.

다음은 약간의 배경설명이고 필독 사항은 아니니 1단으로 바로 점프하셔도 좋습니다.

비교해서 볼때, DynDNS (Dynamic DNS)류는 동적으로 할당 되는 임시 공인IP에 사용자가 원하는 도메인네임을 연결 해 주는 서비스입니다. 인터넷 서비스 공급자 (ISP)가 서버 호스팅을 위한 포트를 따로 막거나 트래픽 제한 같은 것을 하지 않는다는 전제조건 아래서 서버 호스팅을 가능하게 해줍니다. 일부 ISP는 심지어 할당 데이터 트레픽량이 넘으면 인터넷 속도를 낮추는 등 패널티를 가하는 경우도 있죠!
Pagekite는, reverse proxy 기술로, 이와 같은 터널링 기법은 공인이든 사설 IP 든, 상관없이 단말 (RPi)에 인터넷만 연결이 된다면 외부에서 접속이 가능하도록 준비 해 줍니다. ISP로 부터 부여 되는 임시 공인 IP가 인터넷공유기에 할당 되고 RPi가 사설 (로컬) IP를 받아 사용하는 일반적인 가정 환경이나 소규모 로컬 네트웍에서 사용이 적합 합니다. Pagekite는 서비스를 제공하는 클라이언트에서 설정이 가능하므로 변경/관리가 편하고 기타 방화벽 규칙 등 제약 조건이 없습니다.
홈네트웍에서 인터넷공유기가 RPi를 DMZ로 할당하든 아니면 외부로 특정 서비스 (예: 웹호스팅용 80)를 열기 위해 포트포워딩 (port forwarding) 같은 것을 사용하기도 하지만, 단말측 (RPi)이 아닌 공유기에서 설정을 매번 바꿔줘야 하는 번거러움이 있고, 무엇보다, 앞에서 서술한 ISP에 의한 제약 조건이 있다면 무용지물이 됩니다. 혹시 포고플러그 (pogoplug.com) 서비스를 기억하시는 분이 있다면 그것과 비슷한 프로그램이라고 이해하시면 쉬울 것 같습니다.

'reverse proxy'는 서버쪽에서 구현된 자료 전달 기술입니다. 단말(클라이언트)로 부터 자료가 요청되는 행태 (context)에 따라 그 요청을 어느 백엔드(backend) 호스트에 연결 해 줄지를 결정하고 조율 합니다. 반대로 우리가 보통 프록시라고 부르는 것은 'forward proxy'를 말하고, 이것은 단말측에 구현된 기술이고 접속위치를 숨기거가 반복 요청되는 컨텐츠에 대한 로컬 캐싱 등의 목적으로 사용합니다.
벌써 오래전에 오드베리님이 reverse proxy의 개념에 대한 글을 올려 주신적이 있습니다. 참고 하시라고 좌표 남깁니다. http://cafe.naver.com/pipc/14029



1단: Pagekite.me 이용

이 방법은 가장 손쉬운 것으로 pagekite가 내게 도움이 되는 툴인지를 10분안에 판단 할 수 있도록 도와 줄 것입니다.
무료이지만, 기간/데이터량에 제한이 있다는 단점이 있습니다.  사용법은 다음과 같습니다:

  1. RPi에 로그인 합니다. 자신이 파일을 쓰고 지울 수 있는 폴더로 이동 해서,

  2. PageKite 클라이언트를 다운로드 합니다.
    wget https://pagekite.net/pk/pagekite.py

  3. 다운받은 파일에 필요한 실행권한을 준 다음,
    chmod +x pagekite.py

  4. 실행합니다. 자신이 원하는 호스트이름을 정해서 아래와 같이 실행 시키면 됩니다. (예: pipc.pagekite.me)
    ./pagekite.py pipc.pagekite.me

  5. 입력: Y


  6. 입력: 메일확인이 가능한 이메일


  7. 그러면 잠시후에 아래와 같이 활성화 링크를 포함한 안내 이메일이 옵니다. 링크를 눌러 계정을 활성화 합니다.


  8. 입력: Y (계정 활성화 후)


  9. 그럼 다음과 같이 '연이 난다' 라는 성공 메시지와 함께 'http://localhost'가 이제 'http://pipc.pagekite.me'로 외부에서 접속이 가능하다는 안내가 표시 됩니다.

    참고로, 'Ctrl+C'를 누르지 않는 한 이 서비스는 계속 이뤄집니다.

  10. 원격에서 접속 해 보고 확인되면 성공. 끝.

따로 돈을 내지 않으면 시험판 (trial) 라이센스가 할당 되고 위에 메시지 처럼 31일동안 2.5 GB의 데이터 전송이 허락 됩니다. RPi 뿐만아니라 Windows를 포함한 대부분의 OS도 지원해 주는데 각 운영체제별 안내는 http://pagekite.net/downloads를 참고하시기 바랍니다.

[주의]
생각 하고 넘어가야 할 점은 'root' 권한 없이 이 모든 작업이 이뤄졌다는 사실입니다. 방화벽 안에 있다고 민감한 정보를 무신경하게 로컬 웹서버에 올려 댔다가, 사용자중 한사람이 이렇게 '연을 날려' 외부로 http포트를 열어 버리면, 중간에 어떤 보안장치도 무용지물이 되버린 다는 사실을 잊지 말아야 하겠습니다.



2단: 내 Pagekite 서버 만들기

앞서 본 pagekite.me 사이트와 같은 유료 서비스들은 많이 있는데, pagekite가 특별한 이유는 자신이 직접 그 서버를 운영할 수 있다는 점입니다. 이미 데비안 리눅스 (= 라즈비안)에 포팅이 되어 있어 apt-get으로 소스 추가 없이 간단히 설치할 수 있어 더욱 편리합니다.

이를 위해 먼저 필요한 것은 자신이 root권한이 있고 공인 IP로 인터넷에 연결 되어 있는 서버입니다.
이 글에서 우리는 예로 'i.wednus.com'이라는 도메인 이름이 달린 데비안 리눅스 서버를 사용하겠습니다.

  1. 먼저 pagekite를 설치 할 서버에 로그인 합니다. 그리고,

  2. Pagekite 페키지를 설치합니다.
    sudo apt-get install pagekite

  3. 다음과 같이 실행 시키면 되는데 '암호'라고 된 부분은 RPi가 접속할 때 사용하게 될 암호를 말합니다.
    pagekite
     --clean --isfrontend --ports=12345 --domain=http,https,raw:*.i.wednus.com:암호
     --rawports=virtual

    이 명령줄의 의미를 풀어 보면,
    "명령줄의 설정만은 읽어서 (--clean) 프로그램을 실행하고, 너는 지금부터 서버다 (--isfrontend), 그리고, 우회 경유하는 포트는 12345 이고, http, https, raw(임의) 포트 서비스를 지원 하고 (--domain), 연결되는 단말 (RPi)들은 'i.wednus.com'으로 끝나는 도메인 이름이 주어 지고, 접속을 위해 '암호'가 필요하며, raw포트는 실제가 아닌 가상이다."

    실행했을때 다음 화면과 같이 'backend의 접속을 기다린다'고 나오면 준비가 끝난 것입니다.



3단: 내 Pagekite 서버 이용

1단에서 했듯이 'pagekite.py'를 다운 받아 사용할 수도 있지만, 이번에는 pagekite 패키지를 설치하는 방법을 사용 해 보겠습니다. 프로그램 설치가 필요한 만큼 여기서는 'root' 권한이 필요합니다.

  1. RPi에 로그인 합니다.

  2. 서버를 만들때와 똑같은 방법으로 pagekite 패키지를 설치합니다.
    sudo apt-get install pagekite

  3. 명령줄에서 다음과 같이 실행합니다. '암호'는 서버에서 설정했던 암호를 넣습니다.
    밑에는 이해가 쉽도록 명령줄을 여러라인으로 나눴지만 이렇게 해도 좋고 아니면 각줄끝에 '\' 문자 없이 한줄로 죽 붙여서 입력해도 됩니다.

    sudo pagekite --clean --frontend=i.wednus.com:12345 \
    --service_on=http:w.i.wednus.com:localhost:80:
    암호 \
    --service_on=https:w.i.wednus.com:localhost:10000:
    암호 \
    --service_on=raw/22:w.i.wednus.com:localhost:22:
    암호

  4. 지금까지 실수가 없었다면 1단 후미에 보였던 화면 처럼 내 pagekite 서버에 접속해서 연이 날아 오를 것입니다.

  5. 원격에서 접속 해 보고 성공하면 끝.

잘 동작 되는게 확인 되면 이제 다음 단에서 서비스로 등록 해서 항상 연결 되도록 사용 할 수 있습니다.



4단: 항상 실행 시키기

앞서 본 것 처럼 명령줄에서 필요할 때 마다 서비스를 외부로 열 수 있지만, 항상 열어 두기를 원한다면 자동실행 서비스로 등록시키는 것이 편리합니다.

[서버쪽 작업]

  1. 내 Pagekite 서버에 접속합니다.

  2. 지금 부터 설정파일을 변경 해 주는데,
    sudo nano /etc/pagekite.d/10_account.rc

  3. 아래와 같이 'abort_not_configured'줄을 지우거니 '#'을 앞에 붙여서 주석 처리 시켜 줍니다.
    참고로 이것은 root 설정전에 실행되는 것을 막는 보호장치입니다.


  4. 다음은 '20_frontends.rc'을 변경합니다. 
    sudo nano /etc/pagekite.d/20_frontends.rc

  5. 여기서는 접속할 대상과 연결할 서비스를 정의 하는데요, 이해를 위해 앞서 3단에서 명령줄로 입력했던 설정을 똑같이 내용으로 설정파일을 변경 해 보겠습니다. 역시 여기서 빨간 빈칸은, 단말이 접속 해 올때 사용 할 암호를 넣는 곳입니다.


  6. 편집기에서 나와서 pagekite 서비스를 재실행 시키면 준비 끝.
    sudo /etc/init.d/pagekite restart

[단말(RPi) 쪽 작업]

여기서 부터의 RPi에서 하는 작업입니다.
pagekite 프로그램은 서버나 클라이언트로도 동작할 수 있기 때문에 '20_frontends.rc' 파일에서 설정하는 방법만 다릅니다. 그러니 위의 단계와 헛갈리시면 안됩니다.

  1. 서버쪽 작업과 동일하게 '10_account.rc'를 열어 해당줄을 주석 처리 해줍니다.
    sudo nano /etc/pagekite.d/10_account.rc

  2. 다음으로 '20_frontends.rc'을 변경합니다.
    sudo nano /etc/pagekite.d/20_frontends.rc

  3. 앞단에서 했듯이 여기서도 http, https, ssh 서비스를 요청하는 설정을 해 줍니다.


  4. 편집이 끝났으면 나와서 pagekite 서비스를 재실행 시킵니다.
    sudo /etc/init.d/pagekite restart

  5. 대략 1~2분 내에 연결이 이뤄지고, 이제 원격지에서 RPi로 연결 이 가능 해 집니다.
    http://w.i.wednus.com:12345  -> 실제로는 RPi의 http://localhost:80 으로 연결
    https://w.i.wednus.com:12345  -> RPi의 https://localhost:10000 으로 연결

SSH의 연결은 프록시(proxy) 설정이 필요하므로 조금 더 설명이 필요한데 다음 단에서 Putty로 손쉽게 접속 하는 방법을 소개 하겠습니다.

[요청]
혹시 위와 같이 경유포트를 일일이 명시 해 주지 않아도 그냥 주소창에:
http://w.i.wednus.com나 https://w.i.wednus.com로 쳐서도 접속할 수 있는 방법을 아시면 공유 부탁 드립니다.
아파치의 URL_Rewrite 모듈을 쓰는 생각도 들지만 웹 이외에 서비스 호스팅에도 적용을 하려면 그것도 한계가 있는것 같습니다..



5단: 원격에서 SSH 접속

이제 우리집에서 열심히 연을 날리고 있는 RPi에 SSH 접속하는 방법을 안내 합니다.
앞단에서 작업에 실수가 없었다면 내 RPi는 이제 'w.i.wednus.com'라는 도메인 이름으로 접속을 기다리고 있을 것입니다. 이것을 Putty의 HTTP 프록시 설정 기능으로 접속 가능한데, 다음은 설정창의 모습입니다.



위와 같이 설정 하고 저장(!) 한 후 실행 해서 아래와 같이 로그인이 확인 되면 끝.

수고 하셨습니다.



말단: 맺는 글

끝까지 읽어 주셔서 감사합니다.
많은 분들께 유용한 정보였기를 바라며, 불충분하거나 잘못 된 내용이 있으면 지적 부탁 드립니다.
Comments