-
Proxmox 로 홈 서버 구축하기: (3) 외부 접속 허용하기Project/Home Server 2025. 2. 2. 07:54
1. 일단 본인 집의 네트워크 구성이 어떻게 되어있는 지 파악하기
아래는 우리집의 네트워크 구성도이다.
외부 아파트 단자 -> 공유기1(메인) -> 공유기2(와이파이) -> 미니PC(홈서버) ↓ ↓ 데스크탑 티비/노트북/폰/아이패드
외부 아파트 단자에서 외부IP 가 할당되어있고 공유기 2개는 사설IP 가 공인IP 로 할당되어있는 이중 NAT 구조로 되어있다. 이럴 경우 브릿지 모드로 바꿔주면 공유기를 거치지 않고 곧바로 외부IP 로 연결이 된다고 하던데 이렇게 구조를 바꾸게 되면 인터넷이 느려진다는 치명적인 단점이 존재했다.
그래서 SK 브로드밴드에 외부IP 를 추가로 할당받을 수 있냐고 문의를 해보기도 했지만 구축 아파트이기 때문에(구축은 회선을 두 개 뚫는 것은 할 수 없다고 합니다.) 불가능하다는 답변을 받았다. 결국 포트포워딩을 각각 해주고 DDNS 를 설정하는 등 추가적인 작업이 필요한 상황이 되었다.
어차피 이렇게 된 거 네트워크 공부도 할 겸 내가 해보자! 라는 마인드로 시작해보려 했지만... 여러가지 시도를 해보고 실패를 맛보면서 다른 방법이 없을까 찾기 시작했다.
그러던 와중, Claude(생성형AI) 가 내게 Cloudflare Tunnel 을 사용하라고 추천해주었고, 검색하다가 이 글을 발견하게 된다. 아마 내가 생성형AI 에게 먼저 Cloudflare Tunnel 를 추천 받지 않았다면 그냥 넘겼을 것 같지만 글을 읽어보고 나니 네트워크 설정을 건드리지 않아도 될 것 같다는 희망에 차오르기 시작했다. 게다가 일일히 포트포워딩을 하면 번거롭고 보안 위험도 있는 것에 비해 SSL 도 제공해준다고 한다! 심지어 무료다!
2. Proxmox 에 Ubuntu 설치 파일 업로드
local 로 되어있는 스토리지에서 ISO Images 탭을 클릭한 뒤 Upload 버튼을 클릭해준다. 그리고 집 PC 에 다운받아놓은 Ubuntu Server 용 iso 파일을 업로드해준다. 다운로드는 이곳에서 하면 된다. 용량이 꽤 크기 때문에 시간이 조금 소요되니 기다려보자.
업로드가 다 되었으면 해당 파일을 가지고 VM 을 만들어주자.
나는 디폴트로 되어있는 것들로만 설정해서 만들어주었다. 여기서 Finish 를 눌러주면 VM 하나가 목록에 뜨면서 Console 탭에서 터미널을 확인할 수 있다.
대부분 디폴트 설정되어있는 것을 그냥 Done 해주면 되는데 여기서 주의할 점이 있다. OpenSSH server를 설치할 거냐고 물어보는 화면에서 이걸 설정하지 말고 그냥 넘어가길 바란다. 왜냐하면 미리 설치해버릴 경우, 이미 생성되어버린 SSH Key를 복사해서 내 PC 의 Xshell 이나 Putty 로 접속할 수 없게 되기 때문이다. Console 에서는 복사 붙여넣기 키가 먹지 않는다. 그러나 이 경우에는 수동으로 OpenSSH 를 설치해준 후에 방화벽을 열어주어야한다.
sudo apt install net-tools ifconfig
우선 Console 에서 sudo 명령어를 입력하여 net-tools 를 설치해주고, 해당 서버의 IP 주소를 확인한다.
sudo apt update sudo apt install openssh-server sudo ufw allow ssh sudo ufw allow 22
위와 같은 명령어를 순차적으로 입력한 뒤에 Xshell 이나 Putty 로 접속을 해본다.
저는 Xshell 8 을 사용하고 있습니다.
22번 포트를 열어주고 나면 접속이 성공하여 ssh key를 등록하라는 화면이 자동으로 뜬다. 수락 및 저장을 누른 뒤에 다시 연결을 하면 성공적으로 연결이 된다!
그럼 간단하게 proxmox 구조에 대해 알아보자.
스토리지 구조
- local : ISO 이미지나 백업 파일을 저장하는 일반 디렉토리 스토리지
- local-lvm : VM 의 실제 디스크가 저장되는 LVM(Logical Volume Management) 스토리지
ISO 설치 과정
- ISO 파일을 local 스토리지에 업로드
- VM 생성 시 해당 ISO 로 설치
- 실제 VM 디스크는 local-lvm 에 생성
이렇게 분리된 이유
- local : 일반 파일 시스템, ISO 나 백업 파일 저장에 적합
- local-lvm : 블록 디바이스, VM 디스크에 더 효율적
그러니 실수로라도 local 과 local-lvm 은 삭제하면 안 된다!
3. Proxmox 에 Cloudflare Tunnel 설치 및 준비 작업
1. Cloudflare 계정 생성하기
Cloudflare 계정을 만들어주고 도메인을 구매한다. 도메인은 사실 다른 곳에서 구매해도 상관 없지만 가격은 비슷비슷하기 때문에 어차피 Cloudflare Tunnel 을 쓸 거기도 하고 Domain, DNS 를 한꺼번에 관리할 수 있는 이곳에서 구매하자. 나는 Namecheap 에서 예전에 구매해둔 게 있었는데 그건 그냥 다른 용도로 쓰기로 하고 여기서 다시 구매했다.
2. 서비스하고 싶은 애플리케이션을 VM에 올리기
이건 나중에 Docker 를 이용해서 배포하는 방식을 설명하겠다. 접속 되는지 확인하려면 이미지라도 올려놓도록 하자.
파일 전송은 파일질라 같은 것을 다운 받아서 SFTP 프로토콜로 접속 후에 전송하면 된다.
외부 접속 Port(서비스가 실행 중인 Port) 열어두는 것만 주의하자!
3. 설치
# 설치 curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb sudo dpkg -i cloudflared.deb # Cloudflare 계정 인증 cloudflared tunnel login
어떤 url 이 뜰 텐데 해당 주소를 복사해서 브라우저에 붙여넣기 한다. 로그인을 하고 나면 Waiting for login 이 계속 뜨는데 일단 신경쓰지 말자. 원래는 이렇게 접속했을 경우 인증서를 다운받을 수 있는데 우리집 브라우저가 문제인 건지 안 받아져서 다른 방법을 찾아보았다.
4. tunnel 생성
Zero Trust > 네트워크 > Tunnerls > 터널 이름 입력
환경선택 > DebianCloudflare 사이트의 Zero-Trust 탭으로 들어가서 터널을 생성해준다.
우리는 이미 cloudflared 를 설치 해줬으므로 오른쪽에 있는 걸 복사(토큰)해서 Xshell 에 붙여넣기 해준다.2025-02-01T19:22:14Z INF Using Systemd 2025-02-01T19:22:15Z INF Linux service for cloudflared installed successfully
비밀번호를 입력하라는 창이 나오고 위와 같이 나오면 성공이다.
토큰 방식으로 인증을 했기 때문에 따로 인증서로 인증할 필요는 없지만 직접 설정 파일을 만들어줘야 한다.5. 설정 파일 생성
sudo nano ~/.cloudflared/config.yml
위 명령어로 config.yml 파일을 만들어준다.
# config.yml 파일 채우기 tunnel: [터널ID] ingress: - hostname: [터널이름].[구매한 도메인] service: http://[서비스의 내부IP]:[서비스의 포트번호] - service: http_status:404
Application 을 띄운 VM(Cloudflare Tunnel 을 설치한 IP 와 같은 대역대에 있어야 합니다.)의 내부IP 와 Port 를 설정해준다.
sudo cloudflared tunnel run --token [토큰]
그리고 위 명령어를 Cloudflare Tunnel 을 설치한 서버에 입력한다. 토큰은 아까 4. tunnel 생성 에서 말한 토큰을 붙여넣기 하면 된다.
4. 도메인 등록
1. 도메인 등록
Zero Trust > 네트워크 > Tunnels > 공개호스트 이름
이제 여기서부터 중요하다. 위 항목으로 들어간 이후에 아래와 같이 작성해준다.
하위 도메인 [터널이름] 도메인 [구매한 도메인] 유형 HTTP URL [서비스의 내부IP]:[서비스의 포트번호] 추가하고 나면 DNS 가 자동으로 등록될 것이다.
2. 해당 도메인으로 접속해본다!
정상적으로 접속이 되면 성공이다. 바로 접속 되어야 성공이니 잠깐이라도 로딩이 걸리며 돌아가는 모션이 보이면 설정을 잘못한 것이니 다시 확인해보시길 바랍니다.
그럼 여기서 Cloudflare Tunnel 는 어떻게 이런 게 가능한 걸까?
1) 서버에 cloudflared 데몬 실행
- 아웃바운드 연결로 Cloudflare 네트워크와 통신
- 방화벽 설정 불필요 (외부 포트 개방 X)
2) 암호화 터널 구축
- TLS 암호화로 보안 강화
- 중간자 공격 방지
3) 리버스 프록시
- Cloudflare가 외부 요청을 받아 cloudflared 데몬에게 전달
- cloudflared 데몬은 내부 서버와 통신 후 응답을 다시 Cloudflare를 통해 외부로 전달
4) 결론
- 외부 포트 개방 없이 내부 서버를 안전하게 외부에 공개 (DNS 설정하는 서비스 되는 포트는 열어야 한다.)
- 보안, 편리함, 확장성 제공
아래는 Gemini(생성형AI) 에게 비유를 들어달라고 해서 받은 답변이다.
포트 포워딩
- 상황: 집 (서버)에 손님 (외부 사용자)을 초대하려고 합니다.
- 방법: 집 문 (포트)을 열어두고 손님이 직접 찾아오도록 합니다.
- 문제점: 집 문을 열어두면 다른 사람 (해커)도 들어올 수 있습니다.
Cloudflare Tunnel
- 상황: 집 (서버)에 손님 (외부 사용자)을 초대하려고 합니다.
- 방법: 집과 외부를 연결하는 안전한 터널을 만들고, 손님은 터널을 통해 집으로 들어오도록 합니다.
- 문제점: 터널을 만드는 과정이 필요하지만, 집은 안전하게 보호됩니다.
★ Tunnel 에 연결해서 띄운 제 서비스 입니다! VM 위에 바로 올렸습니다.
'Project > Home Server' 카테고리의 다른 글
Proxmox 로 홈 서버 구축하기: (2) 유료 라이센스 끄기 (0) 2024.05.02 Proxmox 로 홈 서버 구축하기: (1) 설치 (0) 2024.05.02