Server Setting - 고정 ip 없이 주피터(jupyter) 원격 접속 설정하기

오늘은 머신러닝과 데이터 사이언스 분야에서 거의 필수적으로 사용하고 있는 주피터 (Jupyter notebook)를 원격으로 접속할 수 있도록 세팅해 보겠다.

이 과정은 동일한 ip를 사용중인 wifi 환경에서 벗어난 (예를 들어 카페나 학교 등) 곳에서도 집에 있는 서버를 접속하여 편안한 코딩을 할 수 있도록 하기 위함이다.

셋팅은 Ubuntu 18.04 기준으로 진행하였다.

공유기 설정하기

먼저, 주피터 노트북을 원격으로 접속하려면 서버가 있는 환경의 고정 ip가 필요하다.

마치 택배를 배송받을 집 주소가 있어야 하는 것인데, 일반적으로 학교나 연구실, 회사가 아닌 이상 고정 ip가 아닌 유동 ip를 사용한다.

쉽게 말하면, 우리집 주소가 계속 바뀐다는 것. 이러면 제대로 찾아갈 수가 없다..

그래서 먼저 DDNS 라는 기능을 제공하는 공유기를 준비하여 우리의 유동 ip와 특정 문자열을 연결시킬 것이다.

택배 회사와 계약해서 ‘정욱이네’ 로 물건을 배송해 주세요~ 하면 우리집으로 배송되는 것과 비슷하다.

하지만 그 전에 집에 있는 공유기가 DDNS 기능을 제공하는지 검색해서 확인해보자.

아니라면 새로 하나 장만하기를 추천한다. 세팅이 가장 쉬운 것은 iptime 공유기이다.

다나와에서 아래와 같이 검색하면 쉽게 제품을 확인할 수 있다. 나는 마침 굴러다니는 12,900원짜리 iptime N702R 공유기가 있어 이것을 사용했다.

DDNS 설정 진입

iptime 공유기 설정을 위해 192.168.0.1로 접속한다. 기본 아이디 비밀번호는 admin으로 동일하다. 혹시 비밀번호를 설정했는데 잊어버렸다면 공유기 reset 버튼을 꾹 눌러서 초기화하자.

접속해서 관리 설정을 누르면 아래와 같은 화면이 보일 것이다.

여기서 고급 설정 -> 특수 기능 -> DDNS 설정 으로 들어간다.

호스트 이름은 원하는 것으로 자유롭게 입력한다. 이 주소로 서버에 접속할 것이다.

사용자 아이디는 자주 사용하는 메일을 입력하고 (예시 : OOO@gmail.com)

오른쪽에 보이는 보안문자를 입력 후 DDNS 등록을 누르면 끝!

아래에 등록 IP 주소가 나오는데, 이것으로 외부에서 접속이 가능하게 한다. 방금 전 입력하였던 호스트 이름으로도 접속이 가능하다.

포트포워딩 설정

이번에는 포트포워딩 설정을 해보자. 특정 포트를 열고, 아까 전 설정한 DDNS 으로 등록된 ip 주소와 함께 입력하면 그것이 완전한 우리 서버의 주소이다. 등록된 ip는 전체 주소, 특정 포트 번호는 상세 주소라고 생각하면 된다.

고급 설정 -> NAT/라우터 관리 -> 포트포워드 설정 으로 들어간다.

적당한 규칙 이름을 지정하고, 내부 ip 주소는 현재 세팅하고 있는 서버의 주소를 입력하면 된다. 현재 접속된 IP 주소를 체크하여도 괜찮다.

프로토콜은 TCP로 하고, 외부 포트 및 내부 포트 번호를 모두 3389로 입력한다. (기본)

여기까지 진행한 내용을 간단히 정리해 보면,

외부에서 서버에 접속할 때 DDNS 설정 시 입력하였던 적당한 호스트 이름 주소 (OOO.iptime.org) 및 포트번호 (3389)를 입력하면, 포트포워딩을 설정한 내부 ip + 해당 포트(3389) 로 접속되는 것이다.

공유기 설정 접속 관리

마지막으로, 외부에서도 서버에 연결된 공유기의 설정을 변경하고 싶을때를 대비하여 세팅을 해보자.

고급 설정 -> 보안 기능 -> 공유기 접속/보안관리 로 들어간다.

외부 접속 보안에서 [원격 관리 포트 사용] 을 체크하고, 적당한 포트 번호를 입력한다. (예시: 1234)

적용 버튼을 누르면 끝! 이제 외부에서 공유기를 설정하고 싶을 때는 OOO.iptime.org:1234 로 접속하면 된다.

그리고 공유기를 혹시 초기화 하였다면 공유기 자체의 무선 비밀번호 또한 초기화 되어 있을 것이므로, 기본 설정에서 각자 세팅해 주자.

우분투에서 포트 열기

전반적인 공유기 설정은 완료되었다. 이제 주피터를 설정해야 하는데, 그 전에 아까 전 입력했던 포트를 우분투에서 열어놓자.

터미널을 열고, 아래와 같은 코드를 순차적으로 입력한다.

1
2
3
4
5
6
7
8
# 3389 포트 오픈
sudo iptables -I INPUT 1 -p tcp --dport 3389 -j ACCEPT

# 포트가 열렸는지 확인
sudo iptables -L -v

# 3389 포트의 방화벽 해제
sudo ufw allow 3389

주피터 노트북 설정하기

비밀번호 설정

먼저 주피터 노트북의 설정 파일을 만들고, 이를 우리의 세팅으로 수정할 것이다.

우분투 터미널을 켜고, 아래와 같은 코드를 순차적으로 입력한다.

1
2
3
4
5
conda activate ds_fox # 나의 가상 환경 activate
jupyter notebook –generate-config # 주피터 설정 파일 만들기
ipython
from notebook.auth import passwd
passwd()

passwd() 을 입력하면 아래에 패스워드를 입력하라고 뜨는데, 이것이 차후 주피터 서버에 접속할 때 요구하는 자신만의 비밀번호이다.

입력을 완료하면 Output으로 sha1:---- 이런 형태의 긴 암호화된 문자열이 출력되는데, 반드시 어딘가에 복사/붙여넣기 를 해놓도록 하자.

주피터 환경 설정

이제, 아까 만든 주피터 설정 파일을 vi 편집기로 열어서 수정할 것이다. 아래와 같은 코드를 입력한다.

1
2
3
# config file 열기
# jeongwook 자리에는 username 을 입력할 것
vi /home/jeongwook/.jupyter/jupyter_notebook_config.py

입력하면 vi 편집기가 열릴 것이다. 처음 다루는 사람이라면 조금 어려울 수 있지만 간단한 규칙 몇가지만 알면 삽질을 피할 수 있을 것이다.

  1. 방향키를 함부로 누르지 말것. 항상 ctrl 키를 누른 채로 움직인다.
  2. 명령어를 입력하고 싶으면 esc 키를 한번 누른 후 : 을 입력할 것
  3. 코드를 추가하고 싶을 때는 i (커서 오른쪽 시작) or a (커서 왼쪽 시작) 을 한번 누르고 입력할 것
  4. 코드를 수정하고 싶을 때는 backspace 키가 아닌 delete 키를 사용할 것

이정도면 따로 찾아보지 않아도 대충은 코드 입력/수정이 가능하지 않을까 싶다.

이제 차례대로 수정해보자. 순서대로 입력하면 된다.

a. 비밀번호 등록

:/pp.pass/ 명령어를 입력하여 password 가 있는 위치를 찾는다. 찾으면 주석 아래에 코드를 입력한다.

1
2
c = get_config()
c.NotebookApp.password = u‘내비밀번호붙여넣기’ # sha1:--- 붙여넣기

b. 외부 접속 허용

:/pp.allow/ 를 입력 후 대충 위쪽을 보면 #c.NotebookApp.alloworigin = '' 이런 주석이 있다. 바로 아래에다가 코드를 추가한다.

1
c.NotebookApp.allow_origin = ‘*’

c. 아이피 설정

:/pp.ip/ip 가 있는 위치를 찾고, 주석 아래에 추가한다.

1
c.NotebookApp.ip = '192.168.0.2' # DDNS 설정 시 입력했던 내부 ip주소

d. 포트 설정

:/pp.port/port 가 있는 위치를 찾고, 주석 아래에 열어놓은 포트 번호를 추가한다.

1
c.NotebookApp.port = 3389

e. 시작 시 브라우저 실행 여부

:/pp.op/open 이 있는 위치를 찾고, 주석 아래에 추가한다.

1
c.NotebookApp.open_browser = False

차례대로 주피터 설정 파일을 수정하고, 명령어 :wq 를 입력하여 저장하고 밖으로 나온다.

이것으로 주피터 외부 접속 환경설정이 끝났다.

잘 설정되었는지 확인해 보려면, 서버 컴퓨터에서 jupyter notebook을 입력해서 서버를 켠 후, 다른 외부망을 사용중인 PC에서 OOO.iptime.org:3389 를 입력해 보면 된다.

아래와 같은 창이 뜨면 성공!!

세팅하는데 참고한 블로그들
https://light-tree.tistory.com/111
https://breath91.tistory.com/
https://ironmask.net/354
https://linguist79.tistory.com/45