홈 서버 외부에서 접속
계획
라즈베리파이 5를 구입하고, 외부에서도 집 내부 네트워크에 있는 라즈베리파이 5에 접속해서 작업을 할 수 있게 만들고 싶었다. 또한, 라즈베리파이에 DIY KVM over IP를 설치해서, 집에 있는 데스크톱이나 다른 노트북도 원격 제어 할 수 있게 만들고 싶었다. 기존 KVM over IP 제품들은 높은 가격 때문에 선택지로 고려되지 못했고, 초기 홈 서버 역할 및 KVM over IP 기능을 동시에 수행할 수 있는 가능성을 염두에 두고 라즈베리파이를 선택했다. 방향성을 정한 후에는 일단 외부 네트워크에서 내부 네트워크에 접속할 수 있도록 설정을 먼저 해놓고 싶었다.
홈 서버를 외부에서 접속할 수 있게 만드는 중 접한 개념들 정리
라우터 / 공유기 / Router
라우터는 외부 네트워크와 내부 네트워크 간의 데이터 전송을 중개하며, 이를 통해 두 네트워크 간의 통신을 가능케 하는 게이트웨이 역할을 합니다. 이는 마치 네트워크 간을 잇는 징검다리처럼 작동합니다. 각 라우터는 제조사나 모델에 따라 다르게 동작할 수 있으며, 일반적으로 DHCP(Dynamic Host Configuration Protocol) 기능을 지원하여 내부 네트워크 기기에 자동으로 IP 주소 및 기타 설정을 할당합니다. 뿐만 아니라, Network Address Translation (NAT) 기능을 통해 사설 네트워크 내부의 기기들이 하나의 공인 IP 주소를 사용하여 외부와 통신할 수 있도록 지원합니다. 게다가, 몇몇 라우터는 방화벽 역할도 수행하여 보안 기능을 제공하며, 네트워크 트래픽을 모니터링하고 제어합니다.
DHCP (Dynamic Host Configuration Protocol)
DHCP는 네트워크 디바이스에 IP 주소 및 관련 구성 정보를 동적으로 할당하는 데 사용됩니다. 즉, 네트워크에 연결된 각 디바이스에게 자동으로 IP 주소, 서브넷 마스크, 기본 게이트웨이, DNS 서버 등의 네트워크 설정을 제공합니다. DHCP 서버는 네트워크에 있는 디바이스에게 IP 주소를 동적으로 할당합니다. 클라이언트 디바이스가 네트워크에 연결되면 DHCP 서버에 요청을 보내고, DHCP 서버는 유효한 IP 주소를 할당하여 클라이언트 디바이스를 구성합니다. 이때 각 클라이언트 디바이스는 프라이빗 네트워크 내에 포함되며, 동적으로 사설 IP가 배정됩니다..
NAT (Network Address Translation)
NAT는 여러 디바이스가 동일한 공인 IP 주소를 사용하여 인터넷에 연결되는 것을 허용하는 데 사용됩니다. 프라이빗 네트워크 내의 디바이스들이 공인 IP 주소로 나가게 될 때, NAT는 내부 디바이스들의 프라이빗 IP 주소를 하나의 공인 IP 주소로 변환합니다. NAT 장치는 내부 디바이스들의 트래픽을 받아서 이를 하나의 공인 IP 주소로 변환한 후 외부 네트워크로 전송합니다. 외부에서 수신된 응답 트래픽은 NAT 장치가 다시 내부 디바이스의 프라이빗 IP 주소로 변환하여 전달합니다.
KVM over IP
KVM over IP는 "Keyboard, Video, Mouse over Internet Protocol"의 약어로, 인터넷 프로토콜을 통해 키보드, 비디오, 마우스 입력을 원격에서 컴퓨터나 기기에 전송하여 원격으로 조작할 수 있게 해주는 기술입니다. 이는 먼 거리에 떨어진 컴퓨터나 서버를 물리적으로 접근하지 않고도 원격에서 조작할 수 있게 해주는 유용한 도구 중 하나입니다. 유명한 DIY KVM over IP 오픈소스는 PiKVM과 TinyPilot이 있어서 두 가지를 비교해 보았습니다. 공식 홈페이지에서 기본으로 안내하는 설치과정은 PiKVM은 라즈베리파이 이미지를 제공해서 바로 micro sd card에 설치할 수 있었고, TinyPilot은 CLI커멘드 스크립트를 제공해서 간단한 게 설치할 수 있었습니다. 두 회사 모두 DIY 뿐만 아니라 미리 만들어놓은 완제품을 판매하고 있습니다.
PiKVM - Open and inexpensive DIY IP-KVM on Raspberry Pi
PiKVM an easy and inexpensive DIY IP-KVM on Raspberry Pi to control remote machines: Full HD, mouse, Mass Storage Drive, VNC, IPMI and much more out of the box. Most modern KVM over IP ever!
pikvm.org
GitHub - tiny-pilot/tinypilot: Use your Raspberry Pi as a browser-based KVM.
Use your Raspberry Pi as a browser-based KVM. Contribute to tiny-pilot/tinypilot development by creating an account on GitHub.
github.com
ISP, DHCP, DNS, DDNS, IP
관련 블로그 포스트
집 밖에서 집 컴퓨터로 원격 접속하기 1탄 - 네트워크 기본개념
Secure Shell Protocol 의 약자다.Command-line interface(CLI)환경에서 원격의 컴퓨터에 로그인할 때 주로 사용된다.ssh의 개발 이전에 사용하던 Telnet 은 안전하지 않은 Protocol(통신규약)을 사용하였고 안전성
velog.io
원격접속을 위해 체크해야할 일
을 잘 정리해놓은 블로그 포스트
집 밖에서 집 컴퓨터로 원격 접속하기 2탄 - DNS 서비스 이용하기
지난 글에서는 네트워크에 대한 설명을 적다보니 글이 너무 길어진 것 같다. 이번엔 원격접속을 위해 해야할 일을 정리하고 차례차례 소개하는 방법을 사용하려고 한다.
velog.io
포트포워딩, SSH
관련 블로그 포스트
집 밖에서 집 컴퓨터로 원격 접속하기 3탄 - 라우터와 포트포워딩
머릿말 지난 글에서 IP주소는 특정 Node로 접근하기 위한 주소라는 것을 배웠다. 그리고 오늘날의 대부분의 IP주소는 ISP가 잠깐 임대하는 방식으로 여러 사용자가 돌려 사용하므로 특정 컴퓨터를
velog.io
IPv4 vs IPv6
IPv4
32비트 주소 체계로, 약 43억 개의 주소를 제공합니다. 4개의 8비트 숫자로 표시되며, 각 숫자는 점으로 구분됩니다. 예: 192.168.1.1
주소 부족 문제로 인해 IPv4 주소 할당이 어려워졌으며, NAT(Network Address Translation)를 통해 주소를 공유하는 기술이 많이 사용됩니다. 또한, DHCP를 사용하여 자동으로 주소를 할당하는 것이 일반적입니다. 보안을 강화하기 위한 기능이 추가로 구현되어 왔지만, 초기 설계에는 보안 측면에서 취약점이 있습니다.
IPv6
128비트 주소 체계로, 거의 무한대의 주소를 제공합니다. 이는 인터넷의 성장에 대한 대응으로, 주소 부족 문제를 해결합니다. 8개의 16진수 블록으로 표시되며, 각 블록은 콜론으로 구분됩니다. 예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
충분한 주소 공간이 있어 주소 할당이 훨씬 효율적이며, NAT가 덜 필요합니다. 설계 단계부터 보안이 고려되어 있으며, IPSec(인터넷 프로토콜 보안)은 IPv6의 필수 구성 요소로 포함되어 있습니다. Stateless Address Autoconfiguration (SLAAC)을 통해 자동으로 주소를 구성할 수 있으며, 기타 향상된 기능도 포함되어 있습니다.
IPv6는 주소 부족 문제와 보안 강화를 위해 개발되었으며, 인터넷의 확장성과 안정성을 향상하는 데 기여하고 있습니다. 그러나 현재까지 대다수의 네트워크에서는 여전히 IPv4와 IPv6를 함께 사용하는 상태이며, 이를 IPv4/IPv6 듀얼 스택(Dual-stack) 또는 이중 스택이라고 부릅니다.
관련 블로그 포스트
IP 주소체계 : IPv4와 IPv6의 차이, 공인ip와 사설ip, 클래스, 특수ip 주소 목록, 서브넷 마스크
안녕하세요. 오늘은 IP 주소체계와 클래스에 대해 알아보려고 합니다. 먼저 IP주소란? 흔히 알고있는 ip주소의 정의는 인터넷상에 있는 컴퓨터의 고유한 주소로, 이 주소를 바탕으로 인터넷상의
simroot.tistory.com
VNC (Virtual Network Computing)
VNC Server
원격으로 제어하고 싶은 컴퓨터에 설치되는 소프트웨어입니다. VNC Server는 컴퓨터의 그래픽 화면을 캡처하고 클라이언트로 전송합니다. 다양한 플랫폼에 대한 서버 버전이 존재합니다. 라즈베리파이 OS는 해당 기능이 이미 기본으로 있으므로 활성화만 시켜주면 됩니다.
VNC Client
원격으로 컴퓨터를 제어하려는 사용자가 설치하는 소프트웨어입니다. VNC 클라이언트는 서버로부터 전송된 그래픽 데이터를 수신하여 원격 컴퓨터의 데스크톱을 표시합니다. 사용자는 클라이언트를 통해 원격 데스크톱을 조작할 수 있습니다. 그래픽 데이터, 키보드 및 마우스 입력 등을 전송하고 제어 명령을 주고받을 수 있습니다. RealVNC(https://www.realvnc.com/en/)의 클라이언트를 사용할 예정입니다. 개인 사용자 1개의 장치를 기준으로 한 달에 $3.49 연간 $41.88
ASUS 라우터 IPv6 활성화 방법
공식 홈페이지 한글
[무선 라우터] IPv6 방화벽 설정 방법 | 공식지원 | ASUS 한국
www.asus.com
공식 홈페이지 영문
[IPv6] How to set up IPv6 in ASUS router? | Official Support | ASUS Global
www.asus.com
nslookup
nslookup은 특정 DNS 서버에게 WAN IP 주소를 요청하고 응답을 받습니다. 네트워크 관리 및 진단 도구 중 하나로, 호스트 이름 또는 IP 주소와 관련된 DNS(Domain Name System) 정보를 조회하는 데 사용됩니다. DNS는 호스트 이름을 IP 주소로 변환하거나 IP 주소를 호스트 이름으로 변환하는 등의 역할을 하는 서비스입니다.
#도메인의 IP 주소 확인
nslookup example.com
#IP 주소의 호스트 이름 확인
nslookup 8.8.8.8
#특정 DNS 서버를 지정하여 조회
nslookup example.com 8.8.4.4
Netcat
netcat을 사용하여 특정 호스트의 특정 포트가 열려 있는지 확인할 수 있습니다. 주로 리눅스 및 유닉스 기반 시스템에서 사용됩니다.
#-z 옵션은 스캔만 수행하고 데이터를 송수신하지 않도록 하는 옵션입니다. -v 옵션은 자세한 정보를 출력합니다.
nc -zv [IP 주소] [포트 번호]
#IP 주소 192.168.1.1에서 1부터 1024까지의 포트를 스캔하는 방법
nc -zv 192.168.1.1 1-1024
SSH(Secure Shell) 연결 설정 방법
IPv4 또는 IPv6를 사용하여 SSH연결을 설정하는 방법은 같습니다.
ssh [사용자이름]@[IPv4주소/IPv6주소]
#ssh 기본 포트는 22, 2222번 포트로 SSH 연결을 설정하려면 다음과 같이 명령어를 사용할 수 있습니다
ssh -p 2222 username@[IPv4주소/IPv6주소/hostname]
#example
ssh username@192.168.1.1
ssh username@2001:0db8:abcd:0012:0000:0000:0000:0011
ssh username@2001:0db8:abcd:0012::11
ssh username@example.com
장치의 IP 주소를 확인하는 방법
터미널 (Mac / 라즈베리파이)
해당 명령어를 입력하면 됩니다. eth0나 wlan0의 inet 또는 inet6 섹션에서 IP주소를 찾을 수 있습니다.
ifconfig
#eth0 결과만 출력
ifconfig eth0
#wlan0 결과만 출력
ifconfig wlan0
Mac
IP 주소 확인
시스템 설정 - 네트워크 - WIFI / Ethernet - 세부사항 - TCP/IP - IP주소
시스템 설정 - 네트워크 - WIFI / Ethernet - 세부사항 - TCP/IP - DNS
ufw (Uncomplicated Firewall)를 이용해 라즈베리파이의 방화벽 설정을 확인
ufw 설치
sudo apt update
sudo apt install ufw
ufw 명령어
#ufw 활성화
sudo ufw enable
#ufw 설정 확인
sudo ufw status
sudo ufw status verbose
#방화벽 규칙 추가
sudo ufw allow [port]/[protocol]
#example
sudo ufw allow 22/tcp
#특정 포트 대신 포트 범위를 열고자 한다면
sudo ufw allow 5900:5910/tcp
#방화벽 규칙 제거
sudo ufw delete allow [port]/[protocol]
#활성화된 규칙 보기
sudo ufw show added
#특정 포트가 제대로 열렸는지 확인
sudo ufw status numbered
#example
sudo ufw allow 5900
Docker
다른 포스트에서 따로 다룰 예정이다.
진행상황
라우터의 DHCP기능 때문에 라즈베리파이 5의 사설 IP의 주소가 바뀔 수 있으므로, ASUS라우터 설정을 이용해서 라즈베리파이의 IP를 고정 IP로 바꿔주었다. 또한, 외부에서 특정 포트를 통해서 들어오는 트래픽을 라즈베리파이로 올바르게 보내주기 위해서 라우터에서 포트포워딩을 설정해 주었다. ASUS라우터의 게이트웨이 IP주소를 이용해서 외부접속을 하려고 했으나 연결이 계속 거부되었다. 그래서 ASUS 라우터에서 제공하는 DDNS기능 (xxxx.asuscomm.com)을 이용해서 접속을 시도해 봤다. 그와 동시에 Cloudfare DNS서비스에 서브 도메인을 만들어 ASUS DDNS와 연결하려 했다. 내부 네트워크에서 사설 IP로 라즈베리파이에 연결이 가능했지만, 외부 네트워크에서의 연결은 계속 거부되었다. netcat으로 포트를 확인해도 열려 있지 않아서, ufw를 이용해서 방화벽과 포트를 다시 한번 체크했다. ASUS 라우터의 관리자 페이지의 안내에는 DDNS을 이용해서 관리 페이지 접속 할 수 있다고 나와있는데 이상하게 그 페이지도 DDNS로 접속이 불가능했다. 그때서야 라우터의 WAN IP와 nslookup으로 확인한 WAN IP가 달랐지만 크게 문제 삼지 않고 넘긴 것을 깨닫게 되었고, IPv4에서는 192.168.x.x로 시작하는 IP주소뿐만 아니라 10.x.x.x으로 시작하는 주소도 사설 IP로 사용된다는 것을 알게 되었다. 하... 즉, ISP도 DHCP를 사용하고 있기 때문에, 라우터의 WAN IP 또는 nslookup으로 확인한 WAN IP 만으로 외부에서 접속할 수 없다는 것을 깨달았다. 확실히 하기 위해 ISP에 전화 상담을 통해 문의를 해보았는데, 해당 ISP의 네트워크 구성상 IPv4로는 외부에서 접속을 할 수 없고, IPv6를 통해서만 가능하다는 답변을 받았다. 라우터의 IPv6를 활성화하고 외부에서의 연결을 다시 시도해보려고 한다.
위의 과정을 거치던 중 정체되어 있다는 느낌을 받아서 중간중간 다른 내용들도 검색해 보았다. 라즈베리파이 서버에서 이용 예정이던 Docker를 Macbook과 라즈베리파이에 설치했고, 기본적인 명령어와 사용법에 대해서 정리했다. 또한, ASUS 라우터의 DDNS기능이 안정적이지 않다는 리뷰를 많이 보아서, 시도는 해보면서 다른 방법들을 찾아보았다. No-IP, DuckDNS 두 가지 무료 DDNS서비스 중에서 제일 많이 검색되었다. 하지만 No-IP는 한 달마다 수동으로 갱신해줘야 한다고 해서 탈락되었다. 그렇게 DuckDNS의 DDNS서비스에 대해서 찾던 중에 내가 도메인을 구입한 Cloudflare로도 DDNS서비스를 이용할 수 있다는 사실을 알게 되었다. 가능하다면 여러 서비스를 왕창 이용하는 것보다 최소화하는 것을 좋아하는 편이라 바로 검색에 들어갔다. 찾던 중 서버에서 실행시킬 수 있는 Cloudflare-ddns를 위한 도커 이미지를 찾게 되었고, 실행시켜 보았다. 잘 연동은 되었고 실행되었지만, 역시 ISP의 WAN IP가 Cloudflare의 A레코드로 자동으로 등록되었다. 찾은 도커 이미지는 IPv4를 이용하는 게 default 설정이었고 IPv6를 이용할 수 있는 옵션도 제공하고 있었다. 도커에서 IPv6를 사용하기 위해서는 추가적인 설정이 필요했고, 라우터에서 IPv6 활성화한 후에 라즈베리파이에서 그 설정을 진행 중이다.