깨록

핸드폰으로 개인서버 만들고 SSH로 접속하기 본문

개발하다

핸드폰으로 개인서버 만들고 SSH로 접속하기

쓰온 2024. 12. 12. 22:11

쉽지 않았다...

글을 시작하며

배경

처음 동기는 따로 비용을 지불하지 않고 개인 서버를 운영해서 이런저런 개발을 하고 인터넷에 올려보면 재밌을 것 같다라는 생각으로 시작하게 되었습니다.

 

대상 독자

처음 도전하는 것이고 정리가 잘 되지 않은 상황에서 하다보니 학문적 정리보다는 경험을 정리하는데 초점을 둔 글입니다.
그래서 그냥 편하게 읽고 경험을 공유하시고 싶은 분께 추천… 그냥 좋을 것 같습니다.

 


1. 사용한 기기와 환경

  • 갤럭시 노트 9
  • userland

기기는 삼성의 “갤럭시 노트 9” 공기계를 사용했습니다.

 

어떻게 서버 세팅을 해야하는지 이것저것 찾아보다가 결국 안드로이드폰에서 설치와 세팅이 가장 간편한 “userland”라는 어플을 알게 되었고 이번에 처음 사용해보며 동시에 진행했습니다.

 


2. 세팅 전에 알아본 네트워크 개념 (인터넷 주소 체계의 발전)

제가 Computer Science에 관한 지식이 부족하다보니 찾아보는 시간이 남들보다 더 많이 걸린 것 같네요.


비슷한 경험을 하셨거나 궁금하신 분들은 ‘아 이런 느낌이구나’라고 생각하시면서 보시면 좋을 것 같습니다.

 

이미 네트워크에 대한 기본적인 개념이 잡히신 분은 패쓰하셔도 좋습니다!!

 

 

2.1 IPv4와 주소 고갈 문제

IPv4는 32 비트 주소 체계(예: 192.168.0.1)로, 약 43억 개의 주소를 제공합니다.


얼핏보면 굉장히 많은 양을 제공하는 것 같고 만들어질 당시에도 충분하다고 생각하고 만들었지만,
인터넷 사용자가 폭발적으로 늘어나면서 주소가 부족해지게 됩니다.


그래서 몇가지 해결책이 제시되는데, 다음과 같습니다.

  • 단기적인 해결책 : NAT, 사설 IP의 도입
  • 장기적인 해결책 : IPv6의 개발

 

 

2.2 NAT와 사설 IP의 도입

먼저, 공인 IP와 사설 IP에 대해 알아보겠습니다.

 

공인 IP는 인터넷 상에서 직접적으로 접속할 수 있는 고유한 주소이고, 사설 IP는 내부 네트워크에서 사용되는 주소입니다.


바로 이해가 잘 되지 않으니 아파트 주소에 비유해보면,


하나의 아파트는 하나의 대표 주소(예: 서울시 강남구 테헤란로 000)를 가집니다.


그리고 아파트 내부에 수많은 세대가 살고 있고, 각 세대는 동과 호수(예: 100동 1000호)를 가집니다.


즉, 아파트의 대표 주소가 공인 IP, 각 세대의 동과 호수가 사설 IP로 이해할 수 있습니다.

 

 

다음은 NAT에 대해 알아보겠습니다.

 

NAT는 사설 IP를 공인 IP로 변환해주는 기술입니다.


이 아파트의 하나의 세대로 우편물을 배달한다고 해보죠.

 

외부에서 편지나 택배가 올 때 가장 먼저 아파트의 대표 주소를 보고 그 위치를 특정할 수 있습니다.

 

그렇게 배달된 택배는 아파트 관리실에 도착하게 됩니다.

 

(일반적인 경우는 아니지만 이해를 돕기위해) 관리실에서는 동과 호수를 확인하고 해당 세대에 우편물을 최종적으로 배달해준다고 가정한다면, 여기서 관리실이 우리가 얘기하는 NAT의 역할을 했다고 볼 수 있습니다.


NAT는 위에서 설명한 아파트 관리실처럼 내부와 외부 사이의 중개자 역할을 하면서, 제한된 공인 IP 주소를 효율적으로 사용할 수 있도록 하는 중요한 기술입니다.

 

 

2.3 포트포워딩의 필요성

문제없이 잘 동작할 것만 같았던 NAT 환경에 한 가지 제한사항이 있는데,


바로 외부에서 내부 기기로 직접 접근이 불가능하다는 문제가 있었습니다.


이 문제를 해결하기위해 포트포워딩이라는 방식을 사용하게 되었는데 이또한 비유를 들어 설명해보죠.

 

아파트 우편 시스템에서 한 세대가 집에서 수학 학원을 운영한다고 할 때

아파트 외부에서 학원을 가기 위해 학생들이 찾아오지만 아파트 현관문이 외부인의 출입을 막기위해 잠겨있다고 봅시다.


이런 상황에서 아파트 관리실은 특정 세대 즉, 수학 학원을 방문하기 위해 온 손님들을 위해

어디로 어떻게 가야하는지에 대한 안내와 함께 전용 출입증을 만들어주게 됩니다.

 

인터넷에서 포트포워딩도 이와 비슷하게 동작합니다.


만약 집에서 게임 서버나 웹 사이트를 운영하고 싶을 때,

평소에는 보안을 위해 외부 접속을 제한하는 공유기에 특별한 통로(포트)를 하나 만들어 접속할 수 있도록 만들 수 있습니다.

 

 

2.4 NAT와 포트포워딩의 역할

그러면 여기서 좀 헷갈릴 수 있는게, NAT를 사용할 때 꼭 포트포워딩을 사용해야하는가?에 대한 질문입니다.

 

이 부분을 이해하기 위해서는 통신 방향을 중점으로 이해하시면 좋습니다.

 

만약 내부에서 외부로 통신해야하는 경우(예: 유튜브 시청, 웹 브라우징, 이메일 확인 등)에는 NAT만으로 통신이 가능합니다.

 

즉, 내부 기기가 먼저 연결을 시작하면 NAT가 자동으로 처리합니다.

 

반대로 외부에서 내부로 통신하는 경우(예: 홈 서버 운영, 게임 서버 호스팅, 원격 데스크톱 등)에는 포트포워딩이 필요합니다.

 

외부에서 먼저 연결을 시작하는데 NAT만으로는 어떤 내부 기기로 연결되야 하는지 알 수 없기 때문입니다.

 

아파트 주민이 외부로 나가는 것은 관리실에서 주민인 것을 알아보고 나갈 때 들어올 때 모두 현관문을 열어주지만,

외부인이 특정 집을 방문하려고 한다면 관리실에 그 집이 외부인 방문을 허용한 경우에만 들여보내주고, 아닌 경우에는 차단한다고 생각하면 됩니다.

 

 

2.5 방화벽의 도입

네트워크가 발전하고 형태가 복잡해지면서 보안의 중요성도 함께 높아지게 됩니다.

 

이 때 등장하는 개념이 바로 방화벽입니다.

 

익숙한 아파트로 비유하자면, 방화벽은 아파트의 보안 시스템과 비슷하다고 볼 수 있습니다.

 

아파트 출입구 잠금부터 각 세대에 도어락이 있는 것처럼

네트워크에도 두 가지 방화벽이 있습니다.

 

공유기에 내장된 하드웨어 방화벽과 컴퓨터에 설치된 소프트웨어 방화벽입니다.

 

또 중요한 점은 앞서 언급한 포트포워딩을 통해 서버를 연결한다고 해도 방화벽에서 이를 허용하지 않으면 접속할 수 없습니다.

 

 

2.6 IPv6는?

이제 IPv4에 대한 얘기가 지나가고 IPv6에 대해 간단히 정리하면,

일단 IPv6는 앞서 얘기한 NAT나 사설 IP가 필요하지 않습니다.

 

그 이유는 128 비트의 주소체계라는 거의 무한대에 가까운 주소를 제공하기 때문입니다.

 

집을 지을 수 있는 공간이 부족하면 아파트를 세워서 여러 세대를 하나의 토지 위에 두고 관리해야 하지만

집을 지을 수 있는 공간이 충분하다면 굳이 아파트를 세우지 않고 단독 주택으로 수없이 지어도 문제가 없는 것과 같습니다.

 

그래서 주소 고갈의 해결책으로 사용한 NAT와 사설 IP를 사용하지 않고 직접 통신이 가능하다는 특징이 있습니다.

 

다만 아직 IPv4를 주도적으로 사용하는 중에 점진적으로 도입되고 있는 중입니다.

 

실제로는 IPv4/IPv6를 이중 체계로 운영 중인 경우가 많습니다.

 

 

2.7 정리하자면

  • IPv4 주소 체계 도입 → 주소 고갈 문제 발생
  • 단기 해결책으로 NAT와 사설 IP 도입
  • NAT의 한계를 보완하기 위해 포트포워딩 도입
  • 네트워크 보안을 위해 방화벽 도입
  • 근본적 해결책으로 IPv6 개발 및 점진적 도입

 


3. 이제 진짜 개인 서버 만들어보자!

3.1 나만 몰랐었던 IPv4와 IPv6

공유기 설정에 들어가서 외부 IP를 확인했더니 세상에나 뜻밖에 IPv6를 사용하고 있는걸 확인했습니다.

 

IPv4에 대한 설정은 업무 중에도 간간히 만져보아서 금방 할 수 있지 않을까 싶었지만 IPv6에 대한 개념이 거의 없다시피해서 잠시 블랙아웃이 올 뻔했습니다.

 

그래도 일단 포기할 수 없으니(실은 잠시 쉬었지만) 이런저런 것들을 알아본 결과:

  • IPv4와 IPv6는 서로 다른 프로토콜이라 직접 통신이 불가능하다. 그래서 현재는 대부분 두 방식을 함께 사용한다.
  • 내부 네트워크는 IPv4와 IPv6 주소를 모두 할당 받을 수 있고, 이를 듀얼 스택이라고 한다.
  • IPv4는 주소 부족으로 NAT나 사설 IP, 포트포워딩과 같은 우회 방법을 사용하고, IPv6는 주소가 충분해서 기기간 직접 통신이 가능하다.

 

 

3.2드디어 서버 설치…!

실제 서버를 설치하는 과정은 생각보다 조금더 험난(?)했던 것 같습니다.

 

3.2.1 userland에서 ubuntu 세팅

userland 초기화면

처음 userland를 설치하고 들어가면 다음과 같은 화면이 나옵니다. 여기서 Ubuntu를 선택하고 설치를 진행합니다.

 

ubuntu 서버 내부 진입 화면

설치가 완료되고 들어가면 다음과 같은 터미널 화면을 볼 수 있습니다.

 

찾아본 글에서는 ubuntu가 생성되고 나면 Id와 passwd를 입력할 수 있다고 했는데 바로 지나가고 터미널이 열려서 당황했습니다.

 

다행이 확인해보니 확인할 수 있는 페이지가 있었습니다.

(비슷하게 userland를 사용하시려는 분들은 참고하시면 좋을 것 같아요!)

userland 초기 아이디 및 비밀번호 설정 화면

 

 

3.2.2 ssh 설치와 연결

ssh 연결을 위해 몇가지 작업을 진행했습니다.

 

먼저 ssh를 설치(명령어)합니다.

# 시스템 패키지 업데이트
sudo apt update
sudo apt upgrade

# OpenSSH 서버 설치
sudo apt install openssh-server

 

 

다음으로 포트 변경과 몇가지 설정을 수정해줍니다.

# sshd_config 수정
$ sudo vi /etc/ssh/sshd_config

...

# Port 22를 Port 2222로 변경합니다.
    - Port 2222
  - PasswordAuthentication yes
  - PermitRootLogin no

 

이후에 실행을 하면 됩니다.

 

먼저 22번 포트를 사용하려 했으나 userland 설정 상의 문제인지 정상적으로 동작하지 않아서 2222번 포트로 사용했습니다.

(사용할 포트는 자유롭게 선택해서 지정하시면 됩니다.)

 

실행하는 방법도 자주 사용하는 방식인 systemctl을 사용하려 했으나 잘 동작하지 않아서 daemon 프로세스로 직접 실행하는 방법을 사용했습니다.

# 데몬(daemon) 프로세스 직접 실행
sudo /usr/sbin/sshd

 

 

제대로 올라갔는지 점검하는 명령어는 다음과 같습니다.

# 새 터미널에서 실행
ps aux | grep sshd

# 또는 2222 포트 리스닝 상태 확인
sudo lsof -i :2222

 

그리고 동일한 네트워크에 존재하는 노트북을 통해서 해당 서버로 접근하였습니다.

 

 


4. 트러블 슈팅

굉장히 기본인 개념들인데 직접 다뤄보지 않아 정리되지 않았던 걸들을 이번 개인서버 구축을 하면서 이해하게된 것 같습니다.

 

그중에 몇가지 사항들을 정리해보려고 합니다.

 

4.1 내부 네트워크 접속

실은 처음부터 내부 네트워크로 접속을 시도한 것은 아니고

외부에서 멋지게 집에 있는 홈서버에 접속해서 이런저런 개발을 하는 멋진 모습을 상상하고 시작했습니다.

 

하지만 IPv6의 문턱을 넘지못하고 이번에는 내부 네트워크 접속으로 그 방향을 바꾸게 된 것 같습니다.

 

내부 네트워크 접속은 비교적 간단한데 네트워크에 대한 이해가 부족했던 탓에 알아간다는 마음으로 스터디와 함께 접속까지 진행하게 되었습니다.

 

 

4.2 IPv6...네이놈...

가장 큰 이슈였던 IPv6를 완벽히 정리하지는 못했지만

차후에 외부 접속까지 진행할 예정이라…

대신 이번에 앞에서 정리한 것과 같이 IPv4와 IPv6의 차이와 특징을 제대로 정리한 것 같아서 마음의 위안을 얻고 있습니다.

 

 


5. 결과

아무생각없이 인터넷 따라해보고 개인서버 만들고 이런저런거 해봐야지 룰루랄라 했다가 호되게 당한 시간이었습니다.

 

그래도 아예 모르고 지났으면 나중가서 또 헷갈렸을만한 개념들이 잡히고 있는 느낌이라 지금이라도 알게되어 다행이다 싶기도 합니다.

 

부족한 부분은 항상 있겠지만 어떻게 하면 계속해서 채워갈 수 있을까에 대해서 고민하고 다음에는 뭘 또 도전해볼까 생각해보는 경험이었습니다.

 

그래서 이번 경험을 통해 제가 얻은 것은,

  • IPv4와 IPv6의 차이는 확실하게 알았다.
  • 내부 연결을 통해 ssh 연결하는 방법을 배웠다.
  • 외부에서 IPv6와 연결하려면 IPv6 통신이 되는 네트워크여야 가능하다는 것을 알았다.

입니다.

 

 

 


글을 마무리하며

어찌보면 되게 간단한 개념이라서 개발자면서 모르는게 말이 되냐라고 한다면 할 말이 없을 정도로 중요한 주제였습니다.

 

누군가가 지적해서 억지로 알게되는 것보단 스스로 부족한 부분을 찾아서 채울 수 있었다는 것이 다행이었고

경험하면서 생각보다 네트워크 관련해서 재밌는 개념들이 많아서 앞으로도 자주 공부해보려고 합니다.

 

생각보다 주저리주저리 말은 많았지만 생각보다 알맹이가 없는 글이 되지 않았을까 고민되네요.

 

이런 경험을 정리해보는게 처음이다보니 이해해주시면 감사드리겠습니다.

 

잘못된 내용에 대한 지적은 언제든지 환영합니다.

읽어주셔서 감사합니다.