Step #0: Project Motivation
군대에 있을 때 나의 보직은 ‘전술C4I병’이었다. 이 보직은 쉽게 말하면 군대 내부에 존재하는 4개의 망(network)를 다루는 역할을 의미한다. 4개의 망은 다음과 같다.
- 국방망
- 군 전용 인트라넷. 일반 회사가 행정 업무를 처리하기 위해 가지고 있는 인타라넷과 비슷한 목적의 네트워크이다. 각 부대별 홈페이지, 업무보고, 이메일 등의 기능을 가지고 있다.
- 전장망
- 최상위 보안 네트워크. 전시 작전 정보와 부대 상황 정보(탄약 보유량, 병력 투입 현황 등)가 오고가는 네트워크이다. 최소 군사 2급 비밀 이상의 중요 정보를 다루며 다른 3개의 망과는 완전히 분리된 독자적인 프로토콜을 사용한다.
- 인터넷망
- 우리가 일상에서 사용하는 일반 인터넷망. 외부 정보 수집, 공개자료 열람 및 국방부 홈페이지 운영을 위해서 사용한다.
- 독립망
- 특수 목적을 위해 다른 그 어떠한 망과도 연결되지 않고 고립되어 사용되는 망이다. 주로 그 범위가 작다. 우리 부대에서는 주로 CCTV연결을 위해서 사용했다.
매일 아침에 일어나면 서버가 괜찮은지 확인하고, 매달 주기적으로 서버 백업해주고, 데이터베이스 오류 발생하면 고치고, 훈련 땐 LAN선 깔아서 훈련용 망 구축하고를 반복하면서 서버에 관한 흥미가 생겼고, 최근에 Computer Network 수업을 들었기에 이를 적용할 수 있는 프로젝트를 진행하면 좋겠다고 생각했다. 따라서 이번 [Personal Server] 프로젝트를 시작하게 되었다.
Step #1: Project Progress-1
먼저 구현할 서버의 기능을 추렸다. 나는 평소 Linux 개발환경 + 파일공유 + 개인 웹사이트 & 블로그를 만들고 싶다는 생각을 했기에, 최소로 구현할 기능은 다음과 같았다.
- NAS(Network Attached Storage)
- SSH Connection
- Apache Server
- Blog Server
이러한 기능을 구현하기엔 고성능 컴퓨터가 딱히 필요 없다. 적당한 성능이면 만족이고 저전력이면 매우 좋다. 그래서 Project에 사용할 컴퓨터를 고민하던 중, 망가진 컴퓨터를 재활용해보기로 했다.




이 컴퓨터는 예전에 미국에서 한국으로 이주하고 나서 전력을 신경쓰지 않고 연결하려다가 망가졌다. 따라서 파워서플라이어를 교체하여 고쳐보기로 하였다. 이 과정에서 컴퓨터를 해체하게 되었으니 추가로 CPU와 RAM 스펙도 물리적(?)으로 확인해주었다.
CPU는 Intel i7-6800T. 이미 단종된 제품으로 4코어 8스레드, 메모리 규격은 DDR4 & DDR3L에 내장그래픽을 탑재하였다. 등록년월은 2016년으로 거의 10년 전 제품이다. 굳이 사려면 알리 익스프레스에서 약 8만7천원에 싸게 구할 수 있다.
RAM은 SK hynix제품, 8gb 2rx8 pc4-2133p-ub0-11. 8GB DDR4 RAM이다.
목표로 하는 서버의 수준이 높지 않기에 성능 업그레이드는 따로 필요할까 싶지만 개인적으로 RAM은 추가하고 싶었다. 왜냐하면 요즘 최소로 요구하는 PC스펙이 16GB으로 올라섰기 때문이다. 근데 요즘 RAM가격이 금값이라서 바로 포기했다. 나중에 RAM가격이 좀 더 안정을 찾고 서버에 더 많은 기능을 추가할 때 작은 업그레이드를 진행할까 한다.
파워 서플라이는 500W의 안정적인 출력과 쿨링 시스템이 장착된 제품으로 구매했다. 서버가 설치되는 집이 여름에는 매우 덥기 때문이다. 이후 구매한 제품을 보드에 연결한 후 전력이 정상적으로 공급되는 것을 확인하였고, 모니터에 연결해 부팅이 되는 것을 확인했다.
기존에는 이 컴퓨터를 집의 용무를 처리하는 용도로 사용했다. 따라서 우리 가족의 중요한 서류들과 가족사진이 저장되어 있다. 따라서 이러한 파일들을 압축해 백업하고, 컴퓨터에 새로운 운영체제(Ubuntu->Linux)를 설치하였다.
서버가 될 이 컴퓨터에 백업해 둔 파일들을 옮기고 나니 저장장치의 확장이 필요하다고 판단하였다. 기존에는 500GB SDD하나만을 사용하고 있었기에 기존 파일과 앞으로 추가할 파일을 담기에 충분하지 않다고 생각했다. 따라서 용량이 크지만 좀 가격부담이 덜 한 HDD를 사용하기로 했다. SSD와 HDD를 잘 섞어 사용하면 충분히 원하는 성능을 낼 수 있다. HDD는 쿠팡에서 Seagate 2TB HDD를 구매해서 탑재했다.

다 추가해보니 컴퓨터 케이스가 너무 작아서 예전에 페달보드 사용할 때 쓰던 큰 하드케이스 안에 보관하기로 했다. 먼지가 쌓을 것을 대비해 임시방편으로 작은 천으로 덮어두었으나, 여름을 대비하여 좀 더 넓고 얇은 천이 필요할 것으로 보인다.


Step #1: Project Progress-2
Ubuntu 부팅은 성공적이었다. 원래는 윈도우와 유분투 듀얼부팅을 사용할까 하다가 윈도우를 쓸 일이 있을까 싶었다. 따라서 유분투 하나만 쓰기로 하였다.
VS Code를 우선 설치하고, Apache와 OpenSSH를 차례대로 설치했다. Apache와 OpenSSH 설치 & 설정이 꽤 복잡할 줄 알았지만 매뉴얼에서 크게 벗어나지 않았고, 꽤 유명한 소프트웨어이기에 ChatGPT가 잘 다루어서 쉽게 진행하였다.
SSH 연결 설정 외 디자인적인 요소들은 성균관대 ‘인의예지’서버를 따라해보고 싶었다. 그래서 OpenSSH 기준으로 SSH 접속 시 password 입력 전, 후에 보이는 화면을 설정하였다.
SSH 접속 직후, 즉 password 입력 전에 보이는 화면은 ‘SSH 배너’라고 한다. 이는 /etc/ssh/sshd_config를 확인해보면 Banner <파일 디렉션> 이라고 적혀있는 옵션을 볼 수 있다. 여기서 <파일 디렉션>이 배너 내용 파일이다. 여기에 원하는 문구(ASCII 아트, 경고문 등)을 넣으면 ssh user@host 입력 후 비밀번호 프롬프트 전에 출력된다.


위 사진처럼 sudo nano를 통해 /etc/issue.net에 원하는 문구를 넣어주면 … 아래처럼 배너가 표시된다. (설정 변경 후 반드시 sudo systemctl restart sshd를 실행하여 설정적용을 해준다)

로그인 성공 후 표시되는 메시지, SSH MOTD(Message of the Day)는 서버에 접속할 때 로그인 후 터미널에 표시되는 환영 메시지 또는 시스템 정보이다.



00-header에 원하는 문구를 넣어주면 로그인 시 바로 확인할 수 있다.

Step #1: Project Progress-3
SSH 설정은 끝. 이제 Apache를 다운로드 하고 개인 웹사이트를 만들 차례다. 터미널에 sudo apt install apache2 -y를 입력해 Apache를 설치하고 sudo systemctl status apache2 명령어를 입력해 서비스 상태를 확인.

이후 방화벽(UFW)를 설정해주고, 브라우저를 열고 http://localhost를 입력하면 아래 페이지가 뜨는 것이 정상.

이 화면은 apache2 설치 후 보이는 default 화면으로 /var/www/html 디렉토리에 저장된 index.html에 설정되어있다. 내가 원하는 것은 이 default page를 놔두고 내가 원하는 domain name에 접속했을 때 내가 원하는 웹사이트가 보이도록 하는 것이다. 그래서 우선 NAT의 설정을 변경해 내 서버에게 고유 IP를 부여하도록 하고, 포트포워딩을 설정해 NAT의 public IP:80으로 연결을 시도하는 모든 패킷을 내 서버로 향하도록 설정했다.
이후 domain name을 고민하다가 나만의 domain name을 구매하기로 하였다. ‘가비아’라는 웹사이트에서 mingimangi.com 이라는 domain name을 구매. DNS Server가 이 domain name을 정상적으로 내 서버 IP로 변환할 수 있도록 웹사이트에서 DNS 설정을 하였다.

www.mingimangi.com 하나만 사용하기 보다는 서버를 좀 더 기능별로 구분하여 접속할 수 있도록 설정하고 싶었다. 그래서 blog.mingimangi.com와 api.mingimangi.com이라는 domain name도 내 서버에 연결을 해주었고, VirtualHost 설정을 하여 한 서버에서 여러 사이트를 운영할 수 있도록 설정하였다. www.mingimangi.com이 내 서버의 매인 웹사이트가 될 것이므로 이 웹사이트 설정을 우선 진행하였다. (blog.mingimangi.com과 api.mingimangi.com은 각각 개인 블로그와 개인 웹사이트의 api를 수집/제공하기 위해 존재함)
VirtualHost 설정은 /etc/apache2/sites-available/에 존재한다. 여기에 api.mingimangi.com, blog.mingimangi.com, www.mingimangi.com의 VirtualHost 설정 파일이 저장된다. 각각의 파일에는 ServerName, DocumentRoot, ErrorLog의 위치 등을 표시한다.
<VirtualHost *:80>
ServerName mysite.local
DocumentRoot /var/www/mysite
<Directory /var/www/mysite>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mysite_error.log
CustomLog ${APACHE_LOG_DIR}/mysite_access.log combined
</VirtualHost>
www.mingimangi.com의 html코드는 /var/www/mingimangi.com/public_html에 존재하는 index.html를 수정하여 작성할 수 있다. HTML 언어는 한 번도 배워본 적이 없으나 딱히 어려운 언어가 아니고 ChatGPT가 있기에 손쉽게 내가 원하는 디자인으로 개발할 수 있었다.

디자인은 ‘시스템 프로그래머’ 이미지를 부여하고 싶어서 검은색과 녹생 형광색을 사용하였다. 이후 GitHub, Linked-in, Contact 링크를 연결해주었다. 지금은 개인 프로젝트만 list-up 했으나 산학협력프로젝트와 같은 팀 프로젝트도 추가할 예정이다.
Step #2: Self Feedback
이번 Personal Server 프로젝트는 전공 수업에서 배운 Computer Network 이론과 군 복무 시절 전술 C4I병으로서의 실무 경험을 실제 환경에 직접 적용해볼 수 있었다는 점에서 매우 의미 있었다. 군대에서는 각 망의 역할과 중요성을 “운용자 관점”에서 경험했다면, 이번 프로젝트에서는 하나의 서버를 직접 구축하며 네트워크 구조, 서비스 분리, 접근 제어, 운영 관점의 설정을 보다 능동적으로 이해할 수 있었다.
특히 NAT 설정, 포트포워딩, DNS 설정, Apache VirtualHost 구성 과정은 수업 시간에 추상적으로 이해했던 개념들이 실제로 어떻게 동작하는지를 체감하게 해주었다. 하나의 공인 IP에서 여러 도메인과 서비스를 분리해 운영하는 과정은 군에서 여러 망을 논리적으로 분리해 관리하던 경험과 자연스럽게 연결되었고, “왜 이런 구조가 필요한가”에 대한 이해도 함께 깊어졌다.
또한 단순히 서버를 ‘켜두는 것’이 아니라, SSH 접근 시 배너 및 MOTD 설정, 로그 관리, 디렉터리 구조 설계 등 운영과 관리 측면까지 고려하며 서버를 구성한 점도 개인적으로 만족스러웠다. 중간중간 여러 오류도 발생하였고 그걸 해결해 나가는 과정도 꽤 재밌었다. 한 예로 2026년 1월 1일 갑자기 서버 접속이 불가능해지는 문제가 발생했다. 원인불명. domain name으로 접근했을 때 뿐만 아니라 공인 IP로 ping을 날렸을 땐 ping이 날아갔지만, 사설 IP로 ping을 날렸을 때는 날아가지 않았다. Time-out 발생. packet drop이 감지되었다.
처음에는 단순히 apache의 문제이겠거니 싶어서 systemctl stop/start apache2를 입력해보고, systemctl status apache2 입력해서 어떤 상태인지도 확인해보았지만, apache에는 문제 없었다.
포트 포워딩이 지워져서 그런가? 싶어서 공유기에 접속하여 NAT설정도 확인해 보았지만, 문제 없었다. 한 3시간 고민해보았다. 왜 http://공인IP, http://사설IP는 안되는데, http://localhost는 될까.
그러던 중 정말 우연히 문제를 찾았다. ifconfig를 입력했더니 기존에 포트포워딩/apache2 설정해둔 IP와 단 한 글자가 달랐다. IP주소의 D class가 102이어야 하는데 104이었다.
원인은 라우터 재부팅으로 인한 DHCP table초기화였다. 우리 집은 외출할 때, 집에 있는 모든 전력(냉장고 등의 물건은 제외)을 차단하는데, 아침에 다 같이 장 보러 집을 나가면서 전력을 차단하였고 이로 인해서 라우터가 전력을 공급받지 못해 전원이 꺼진 것이었다. 이로 인해서 자연스럽게 재부팅이 이루어졌고, 기존에 설정해두었던 IP값과 맞지 않아 서버에 접근이 불가능 한 것이었다.
우리 집은 라우터 재부팅이 자주 일어나니깐, 라우터 설정에서 내 서버는 고정 IP를 할당받도록 설정하였다 (MAC주소와 사설IP주소를 엮어서).
그랬더니 서버에서 인터넷에 접속이 불가능하기에, 서버와 공유기를 동시에 재부팅하였더니 모든 것이 정상적으로 돌아왔다.
사실 처음에 공인 IP로 ping을 날렸을 때 ping이 날아갔지만, 사설 IP로 ping을 날렸을 때는 날아가지 않았을 때, 생각했던 서설 IP 값이 이상하다는 것을 충분히 의심할 수 있었지만 요즘 GPT에 의존하다보니 추론 능력이 많이 떨어진거 같다. 좀 더 독립적인 추론능력을 갖출 수 있도록 노력하게 되는 계기가 되었다.
이번 프로젝트를 통해 서버와 네트워크는 단순한 기술 요소가 아니라, 목적에 맞게 설계되고 지속적으로 관리되어야 하는 시스템이라는 점을 다시 한번 인식하게 되었다. 향후에는 HTTPS 적용, 보안 설정 강화, 자동 백업, 모니터링 도구 도입 등 실제 운영 환경에 더 가까운 기능들을 추가해보며 프로젝트를 확장해 나가고자 한다.
