AWS 무료티어 기간이 전부 소모되어 갈쯤 미니PC를 사서 서버를 마이그레이션 해보고자 해서 중고나라에서 구매하였다.
가격은 46만원... ryzen 5700u, ram 32GB, m.2 512GB
요새 램값이며 ssd값이며 AI 돌풍 덕분에 엄청 가격이 올랐다. 그거 치고는 잘 산듯!
먼저 우리집 환경(?)을 살펴보자면
- 메인 pc는 집에서 개발 및 서핑용으로 사용하고 있다
- 미니PC는 서버 겸 넷플릭스나 유튜브 보기용으로 사용할 예정
마침 구매한 미니PC가 윈도우 버전이 pro이기도 하고, linux를 바로 깔기에는 좀 아깝다고 생각했다.
제일 처음 생각 프로세스는 이거였다.
- 미니PC가 윈도우 프로니까 pro버전은 윈도우 원격(MSTSC)가 가능함
- wsl이라고 윈도우에서 리눅스기능을 파워쉘에서 사용할 수 있게 해주는 기능이 있음
- 그래서 윈도우 자체에 리눅스 cli를 깔아서 docker 마이그레이션 하려고 했음
- 장점이라고 생각한게 원격으로 조정할 수 있으면 gui(꼼수...)니까 파일관리도 쉽다고 생각했음
대충 이렇게 머릿속에 프로세스를 세웠다.
1. 윈도우 원격(MSTSC)의 계정 억까
내방 PC는 와이파이, 거실 미니 PC는 공유기 랜선에 물려있다. 어차피 같은 집 안이라 같은 공인IP를 공유하는 서브넷(정처기에서 배움 ㅋㅋ) 대역일 텐데 ping 신호 조차 안 닿음...
공유기 내부의 AP Isolation 기능이 켜져서 무선과 유선트래픽이 찢어졌나 싶어서 공유기 관리자 페이지를 삽질하다가 다른 원인을 찾아보니까 윈도우 방화벽 인바운드 규칙에서 원격 포트인 3389를 강제로 수동 개방하는 등 온갖 삽질을 다해봤지만 결국 안됐다.
근데 진짜 원인은 Microsoft 계정 연동 및 Windows Hello 보안 정책 때문이었음
win11은 최초 설치 시 온라인 계정 로그인을 하지 않으면 그냥 컴퓨터 못쓰게 하더라. 최근에 미니pc 초기화 시켜서 앎... 그리고 보안 번호나 생체 인식을 기본 인증 수단으로 쓴다.
근데 mstsc쓰려면 아이디와 비밀번호가 필요한데... 원격 프로토콜(RDP)는 '@'가 들어가버리면 이상해져 버린다.
RDP 내부는 '@' 포맷이 들어가버리면 대기업 사내 인프라 망 환경에서 쓰는 UPN(User Principal Name)으로 인식한다고 한다.
abc@naver.com면 유저ID는 abc고 naver.com라는 회사 인증 서버를 찾아가서 인증하라고 신호를 쏴버린다고 한다.
근데 내 아이디는 마이크로소프트 아이디고.. 근데 이메일 형식으로만 가입할 수 있는데? 안되네?
방법 찾아보다가 로컬 계정으로 전환하면 내 아이디에 '@'를 뺄 수 있다고함
바로 미니PC로 들어가서 로컬 관리자 계정 새로 생성해서 방에서 시도해보니 안된다.. ㅡㅡ
정신차리고 생각을 바꿨다.
아니 뭐 밖에서도 미니PC 볼수도 있잖아? 하고 그냥 RDP 포트 열어버리고 임의로 외부 포트를 정해주고 내부 포트는 3389로 해줬다. 내부 포트번호 그대로 매핑을 해버리면 해킹 봇들이 랜덤으로 아이피 찔러보다가 내 아이피에 3389를 찔러보니까 비밀번호만 알면되네? 해서 브루트 포스로 비밀 번호를 뚫어버릴 수 있다.
포트 바꾸는 것만으로는 봇들이 시도할 수 있는 경우를 줄이는 것이고 비밀번호를 복잡하게 거는 것이 관건이라고 한다.
그래서 약 30자에 달하는 영문, 숫자, 특수 문자를 넣어서 비밀번호를 설정했다.
이런 비밀번호 뚫으려면 3090으로 약 9억 년 걸린다고 한다.
포트포워딩하니까 한방에 해결!
아 그리고 네트워크 환경이 public 말고 private로 설정이 되어있어야 하고, 'Windows 방화벽에서 앱허용' 에서 '원격 데스크톱'을 꼭 체크 해줘야한다.
2. WSL2의 억까
원격 화면을 띄우는데 성공했다. 윈도우 자체 리눅스 환경인 WSL2를 깔기 위해서 wsl --install 명령어를 실행하였다.
근데 윈도우 내부 구성 요소가 꼬였는데 계속 알 수 없는 에러 코드를 내뱉었다. 계속 시스템 파일 고치겠다고 하루 종일 붙잡고 있으면 밤 세울듯 해서 다른 우회 방법을 생각해냈다.
윈도우는 써야겠고 리눅스도 써야겠고... 디스크 파티션 나눈 후 OS 따로 깔아서 까는 방법이 있지만 나는 가상 머신 + 우분투 LTS를 사용하기로 해서 그것으로 노선으 변경했다.
3. 네관 2급 짬바
음... 컴퓨터를 보니까 랜포트가 두 개네? 그럼 리눅스따로 윈도우 따로 독립적으로 할당이 가능하겠다 싶었는데 랜선이 한 개다. 새벽 시간이라 다이소는 닫았다. 하지만 갑자기 솟아날 구멍이 생각났다.
랜선 길이가 2m 정도 되니까 잘라서 쓰면 되지 않을까? 작년에 네트워크 관리사 2급 자격증을 취득하였는데 집에서 잠자고 있떤 랜툴과 RJ-45 커넥터를 꺼내서 망설힘 없이 랜선을 반으로 잘랐다.
흰주 - 주 - 흰녹 - 파 - 흰파 - 녹 - 흰갈 - 갈
순으로 연결해서 랜툴 찝어주니까 랜선이 두 개가 되었고 ipconfig /all 로 테스트 해보니까 두 개 다 잘 물려있다는 것을 확인했다.
4. 가상 머신 세팅
우분투 LTS를 받고 윈도우가 잡고 있는 랜카드를 피해서 할당해주었다. 원래 윈도우에 물리 랜선 1을 물리고 2를 가상머신에 물릴려고 했는데 이미 윈도우에 static ip를 잡아놓은 상태라 바꾸기 곤란하였다. 잡소리는 치워두고...
우분투 안에서 랜선 1을 할당받은 다음 static ip로 지정해주고, 우분투 내부 22(SSH)를 포트포워딩 해주었다. 이것도 비밀번호를 설정하는 것이 중요하고 암호화 키 생성해서 더욱 보안을 강화하는 것이 중요하다. 하지만 9억년 걸린다고 하니 추후에 생각하기로 함...
뭐 다른 설정은 iptime에 들어가서 DDNS 설정해서 내 공인 ip 입력하게 하면 내 미니PC로 설정해 주고 SSH 접속을 더 원활하게 할 수 있도록 설정하였다.
그리고 윈도우가 켜지면 내 우분투 서버를 자동으로 실행하게 윈도우에 스크립트 설정을 하고 마쳤다.
5. 다시 생각 해보기
이렇게 하고보니 굳이 SSH를 연결했는데 3389 포트를 굳이 열어야할까 생각들었다.
그래서 더 알아보니
- RDP 프로토콜 자체에 Windosw OS 보안 취약점이 발견되면 비밀번호 300자 되어도 비밀번호 입력 단계를 우회해서 서버가 털릴 수 있다.
- 외부에서 IPTime의 VPN 기능을 켜서 집 네트워크로 접속한 뒤 RDP를 쓰거나 Tailscale 같은 Zero Trust Mesh VPN을 쓰는게 보안상 나전하다고 한다.
그래서 바로 닫았다.. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그렇다면 과연 22번 포트도 안전한가도 알아보았다.
- 외부 포트를 내임의로 지정해놔 단순한 봇들은 필터링할 수 있지만 포트 스캐너를 사용하면 무용지물이라고 한다.
- 내 공인IP가 타겟이 되거나 무작위 전체 스캔에 걸리면 1번포트부터 65535번까지 포트를 전부 찔러본다고 한다.
- 그러면 패킷을 보내보고 SSH가 응답하구나? 해서 털린다.
5.1 누가 내서버 찔러봤나 확인 해보기
sudo journalctl _SYSTEMD_UNIT=ssh.service | grep "Failed"
SSH 로그인 실패 로그만 쏙 골라서 한번 봤다.

5시부터 6시 사이에는 내가 접속한 게 맞다. 192.168.0.1이면 공유기 내부 네트워크 타고 들어온게 맞는데
오전 8시 51분 부터 로그 찍혀있는거보고 소름 돋았다.
117.18.XX 이거 중국에서 찌른거란다..
그래서 성공기록을 한번 보았다.
sudo journalctl _SYSTEMD_UNIT=ssh.service | grep -E "Accepted|session opened"

중간에 211이 있는데 내 휴대폰으로 핫스팟 켜서 노트북으로 접속해 본 거라 예상했고 그 예상은 맞았다.
다행이다 일단 누군가에게 뚫리진 않은거다.
5.2 키 페어 방식으로 수정
굉장히 위험하다고 몸소 느낀 후 SSH Key 페어를 만들어 메인PC에는 비밀키를 두고 미니PC 서버의 우분투에는 공개키를 심었다.
가장 보안성이 좋고 최신 트렌드인 ed25519를 사용해서 키를 만들었다. 기존 RSA보다 훨씬 가볍고 강력한 최신 암호화 알고리즘을 쓴다고 한다.
# --------- Windows PowerShell ---------
#1. 키 생성하기
ssh-keygen -t ed25519 -b 4096 -f ~/.ssh/id_minipc
#2.서버에 공개키 보내기
ssh-copy-id -i ~/.ssh/비밀키이름 ubuntu-server@192.168.0.X
#3. 테스트
ssh -i ~/.ssh/비밀키이름c ubuntu-server@192.168.0.X
# --------- ubuntu cli ---------
#5. // sshd-config 에서 비밀번호 형식으로 사용하지 않게 설정
sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
# ssh 리스타트
sudo systemctl restart ssh
이제 내 윈도우 .ssh 폴더 내부에 있는 키가 없으면 이서버에 접속하지 못한다. 그래서 이 키를 사용해 바탕화면에 접속하는 바로가기 아이콘을 만들었다.
cmd.exe /k ssh -p 50022 -i %USERPROFILE%\.ssh\비밀키이름 ubuntu-server@192.168.0.X
6. 느낀점
처음에는 그저 AWS 프리티어 만료를 피하기 위해서 가성비 마이그레이션 프로젝트로 시작했다. 그 과정에서 만난 Windows RDP의 억까, wsl2의 알 수 없는 에러들이 나를 시험했지만 나는 아이디어가 넘치기(?) 때문에 다른 방법으로 우회하는 것을 택했다.
특히 다이소 갈 시간도 없는 새벽에 랜선 반으로 잘라 랜툴로 찝어서 가상 머신에 독립된 회선을 만들었으며 자격증을 괜히 딴 거 아니구나 하고 괜히 뿌듯했다.
무엇보다 가장 소름 돋았던 점은 비밀번호 30자로 늘렸으니 안전하겠지 라는 안일한 생각과 다르게 로그를 눈으로 확인했을 때 RDP 취약점과 포트 스캐너 앞에서 얼마나 무기력한지, 보안에는 적당히가 없다는 것을 깨달았다.
편의성을 위해 RDP 3389 포트를 과감히 닫고 최신 암호화 키페어 ed25519를 사용하여 접속하게 하고 패스워드 로그인 자체를 막아버렸다.
그리고 효율성을 위해서 바탕화면에 딸각 한 번으로 접속하는 바로 가기 아이콘까지 만드니까 비로소 나만의 홈서버가 만들어졌다는 느낌이 들었다. 삽질은 너무 많이 했지만 내부 원리와 보안의 본질을 온몸으로 체감하였다.
다음에는 80포트(http) 443(https) 포트 열고 내 프로젝트를 마이그레이션 해서 띄워보는 것을 포스팅할 예정이다.
