VirtualBox + Ubuntu NAT SSH 접속 & ngrok 외부 터널링 완전 정복
이 문서는 VirtualBox에서 Ubuntu 게스트 운영체제를 설치하고, NAT(Network Address Translation) 환경에서 SSH 서버를 설정한 후 PuTTY를 이용해 로컬에서 접속하며, ngrok을 통해 외부 접속까지 구성하는 전체 절차를 설명한다.
1. 가상화와 네트워크 개념 이해
1.1 VirtualBox란?
VirtualBox는 오라클(Oracle)에서 제공하는 오픈 소스 가상화 플랫폼으로,
하나의 물리적 컴퓨터(호스트)에 여러 개의 가상 컴퓨터(게스트)를 생성하여 운영체제를 설치하고 테스트할 수 있도록 지원한다.
개발 환경 구축, 보안 실습, 운영체제 실험 등에 활용한다.
1.2 NAT(Network Address Translation)란?
- 가상머신이 외부 네트워크에 접속할 수 있도록 해주는 방식.
- 기본적으로 VirtualBox는 NAT로 네트워크를 설정.
NAT는 VirtualBox가 게스트 OS(가상 머신)에 사설 IP 주소를 할당하고, 게스트가 외부(호스트 OS)와 통신할 수 있도록 중계하는 방식이다.
게스트는 외부로 아웃바운드 통신은 가능하지만 외부에서 인바운드 접속은 차단된다. 이를 보완하기 위해 포트 포워딩 기능을 사용한다.
1.3 eth0 인터페이스와 10.0.2.15 주소란?
Ubuntu 게스트 운영체제에서는 기본적으로 첫 번째 이더넷 네트워크 인터페이스인 eth0가 NAT 모드에서 VirtualBox에 의해 자동으로 구성된다. 이 인터페이스에 할당된 기본 IP 주소는 10.0.2.15이다.
- eth0: Ubuntu에서 사용하는 첫 번째 유선 네트워크 인터페이스의 이름이다.
- 10.0.2.15: VirtualBox NAT 모드에서 기본으로 할당되는 내부 IP 주소이며, 게스트 OS가 DHCP를 통해 VirtualBox로부터 자동으로 받는다.
즉, eth0와 10.0.2.15는 서로 동일한 네트워크 인터페이스를 가리키며, eth0의 IP 주소가 바로 10.0.2.15인 것이다. 외부(호스트)에서 직접 이 주소로 접속할 수는 없으며, VirtualBox가 NAT 및 포트포워딩을 통해 이 주소로 접근을 우회시켜주는 방식으로 작동한다.
2. Ubuntu 가상 머신 설치 및 SSH 서버 구성
2.1 설치 절차
- VirtualBox를 설치한다.
- Ubuntu ISO 이미지를 https://ubuntu.com/download/server 에서 다운로드한다.
- VirtualBox에서 새 가상 머신을 생성한다:
- 이름: Ubuntu
- 유형: Linux / Ubuntu (64-bit)
- 메모리: 1024MB 이상 할당한다.
- 디스크: VDI, 동적 할당, 10GB 이상 설정한다.
- ISO 파일을 가상 CD로 마운트하고 부팅하여 Ubuntu를 설치한다.
2.2 SSH란?
- SSH (Secure Shell): 네트워크를 통한 원격 접속 프로토콜. 보안적으로 암호화되어 안전한 원격 접속 제공.
- 암호화된 채널을 통해 원격에서 시스템에 명령을 입력하거나 파일을 전송할 수 있도록 한다.
- 기본 포트: 22번 포트
2.3 SSH 서버 설치
Ubuntu Server 버전의 경우, 기본 설치 중 'OpenSSH Server'를 설치할 수 있는 옵션이 제공된다. 이 옵션을 선택하면 별도의 설치 없이도 SSH 접속이 가능하다. 따라서 설치 중 해당 옵션을 선택했다면, 사용자 입장에서 별도의 sudo apt install openssh-server 과정을 수행하지 않아도 PuTTY로 SSH 접속이 가능하다.
만약 이 옵션을 선택하지 않았거나, Ubuntu Desktop 버전을 사용한 경우에는 openssh-server를 수동으로 설치해야 한다. 이때는 다음과 같은 명령어를 입력한다:
2.4 OpenSSH는 무슨 역할인가?
- Ubuntu 내부에서 SSH 접속을 받아주는 백엔드 서비스가 바로 OpenSSH Server이다.
- 이 프로그램은 sshd라는 이름의 데몬으로 백그라운드에서 실행되며, 기본적으로 포트 22번을 열고 대기(listen) 한다.
- 클라이언트(PuTTY)가 TCP 연결을 요청하면, sshd가 이를 수락하고 로그인 절차를 수행한다.
📌 요약: OpenSSH는 리눅스에서 SSH 요청을 수신하고 명령 실행, 결과 반환까지 처리하는 서버 측 엔진이다.
OpenSSH 서버를 설치
sudo apt update
sudo apt install openssh-server
SSH 서비스를 자동 시작하도록 설정하고 즉시 시작한다:
sudo systemctl enable ssh
sudo systemctl start ssh
SSH 서비스 상태를 확인하는 명령은 다음과 같다:
sudo systemctl status ssh
요약: 설치 중 SSH 옵션을 선택했다면 따로 설치할 필요가 없으며, 그 상태에서도 PuTTY 실습이 가능하다. 하지만 시스템에 따라 다를 수 있으므로 SSH 서비스가 실행 중인지 꼭 확인해야 한다.
SSH는 Secure Shell의 약자로, 암호화된 채널을 통해 원격에서 시스템에 명령을 입력하거나 파일을 전송할 수 있도록 한다. 기본 포트는 22번이다. 22번 포트는 IANA(Internet Assigned Numbers Authority)에 의해 공식적으로 SSH 용도로 지정된 표준 포트이며, 대부분의 클라이언트 프로그램(예: PuTTY, FileZilla)은 기본적으로 이 포트를 사용한다.
3. VirtualBox NAT 포트 포워딩 설정
🚪 그런데, VirtualBox는 어떻게 Ubuntu로 요청을 전달하는가?
여기서 등장하는 것이 포트 포워딩이다.
- 기본적으로 VirtualBox는 게스트와 호스트 간의 네트워크를 막고 있다 (NAT 구조).
- 그래서 호스트(Windows)의 127.0.0.1:2222 → 게스트(Ubuntu)의 10.0.2.15:22로 요청을 “포워딩”해줘야 한다.
VirtualBox 설정 예시:
이름 | 호스트 포트 | 게스트 포트 |
SSH | 2222 | 22 |
📌 요약: 포트포워딩은 외부에서 들어온 요청을 게스트에 전달하는 “뚫어주는 문”이다.
🧭 NAT(Network Address Translation)의 역할은?
❓ 왜 NAT가 필요한가?
- 게스트 OS는 VirtualBox 내부에 있으므로, 물리적인 네트워크에서는 “보이지 않는 존재”이다.
- NAT는 게스트에게 가상의 사설 IP(10.0.2.15 등)를 임시 할당해주고, 호스트가 대신 외부와 통신하게 한다.
- 외부에서 보기에 게스트는 존재하지 않지만, NAT를 통해 호스트가 대리인 역할을 해준다.
NAT의 주요 역할:
- IP 주소 변환 (10.0.2.15 → 호스트의 공인/로컬 IP)
- 패킷 라우팅
- 게스트에서 외부로 나갈 수는 있지만, 외부에서 직접 들어올 수는 없음
- 포트포워딩이 설정되면 특정 포트만 열어주게 됨
📌 요약: NAT는 게스트를 보호하면서 외부와 연결해주는 번역기 겸 방패 역할을 한다.
3.1 구조 요약
구성 요소 | 설명 |
---|---|
호스트 OS | Windows 10 |
게스트 OS | Ubuntu (VirtualBox 내 설치됨) |
네트워크 모드 | NAT |
게스트인터페이스 | eth0(IP: 10.0.2.15) |
포트포워딩 예시 | 호스트 127.0.0.1:2222 → 게스트 22번 포트(10.0.2.15:22) |
3.2 포트 포워딩이란?
포트 포워딩은 호스트의 특정 포트로 들어오는 요청을 VirtualBox가 게스트 운영체제의 특정 포트로 전달하는 기술이다. 예를 들어, 호스트의 127.0.0.1:2222 포트로 들어온 요청을 게스트의 22번 포트로 전달할 수 있다.
ex) 호스트 127.0.0.1:2222 → 게스트 10.0.2.15:22
3.3 포트 포워딩 설정 방법
- 가상 머신을 선택하고 ‘설정(Settings)’을 연다.
- ‘네트워크(Network)’ → 어댑터 1 → NAT로 설정한다.
- ‘고급(Advanced)’을 클릭한 뒤, ‘포트 포워딩’을 연다.
- 다음과 같은 규칙을 추가한다:
이름 | 프로토콜 | 호스트 IP | 호스트 포트 | 게스트 IP | 게스트 포트 |
---|---|---|---|---|---|
SSH | TCP | (비워둔다) | 2222 또는 22 | (비워둔다) | 22 |
- 호스트 IP를 비워두면
127.0.0.1
,localhost
등 모든 로컬 인터페이스에서 접근을 허용한다. - 게스트 IP를 비워두면 VirtualBox는 게스트의 기본 인터페이스 IP(예: eth0
10.0.2.15
)로 자동 라우팅한다. - 127.0.0.1:2222(22): 이제 Windows의 PuTTY에서 이 주소로 접속하면 VirtualBox가 Ubuntu 게스트의 22번 포트로 SSH 요청을 전달
3.4 호스트와 게스트 포트 번호 설정
VirtualBox의 포트포워딩은 호스트와 게스트가 다른 공간이므로, 동일한 포트 번호를 사용해도 충돌하지 않는다.
단, 호스트 OS에서 해당 포트를 이미 사용하는 서비스가 있을 경우 충돌이 발생하므로 주의한다.
(호스트 포트 번호도 22번 포트로 설정 ->
호스트 OS가 자체적으로 OpenSSH 서버를 실행하고 있어 22번 포트를 점유하고 있는 경우에는 충돌이 발생)
일반적으로 호스트에서는 2222, 2200 등의 포트를 사용한다.
3.5 포트 22번의 의미
포트 22는 IANA에 의해 SSH 용도로 공식 지정된 기본 포트이다. 관리자가 바꾸지 않는 이상, SSH 서버는 기본적으로 22번 포트를 열어둔다.
4. PuTTY로 SSH 접속하기 (Windows)
4.1 PuTTY란?
PuTTY는 Windows에서 가장 널리 사용되는 무료 SSH 클라이언트 프로그램으로, GUI 기반의 인터페이스를 제공하여 명령어 입력 없이도 손쉽게 원격 서버에 접속할 수 있다.
PuTTY는 사용자의 키보드 입력(예: 명령어)을 받아 이를 SSH(Secure Shell) 프로토콜을 통해 암호화된 통신 형태로 전송하며, 동시에 서버(Ubuntu 등)로부터 전달된 응답(예: 명령 실행 결과)을 다시 복호화하여 화면에 출력해준다.
즉, PuTTY는 단순한 접속 도구가 아니라 터미널 에뮬레이터와 SSH 클라이언트의 기능을 모두 갖춘 고급 네트워크 도구이며, 사용자와 원격 서버 간의 보안 채널을 설정해주는 핵심 역할을 한다.
📌 요약: PuTTY는 Windows에서 명령어를 SSH 방식으로 원격 서버에 전달하고, 그 결과를 받아 화면에 출력하는 과정을 암호화된 채널 위에서 처리하는 안전하고 전문적인 SSH 클라이언트이다.
4.2 접속 절차
- PuTTY를 실행한다.
- Host Name에
127.0.0.1
또는localhost
를 입력한다. - Port에 VirtualBox에서 설정한 호스트 포트 (예: 2222)를 입력한다.
- Connection type에서 SSH를 선택한다.
- Open을 클릭한 뒤 로그인 창에서 Ubuntu 사용자 계정과 비밀번호를 입력한다.
→ 접속 시도 시 실제로는 VirtualBox가 이 요청을 게스트 OS의 22번 포트(SSH 서비스)에 연결
4.3 PuTTY의 Host Name(IP 주소)에 왜 127.0.0.1을 입력하는가?
127.0.0.1은 전 세계 모든 운영체제에서 공통으로 사용하는 루프백(Loopback) 주소로, 자기 자신을 가리키는 특수한 IPv4 주소이다. 이 주소는 인터넷이 아닌 로컬 컴퓨터 내부에서의 네트워크 통신을 위해 예약된 주소이며, Windows, Linux, macOS 등 어떤 OS에서도 동일하게 적용된다.
이 주소를 사용하면 컴퓨터는 외부 네트워크로 나가지 않고, 자신 내부에서 실행 중인 프로그램 간에 TCP/IP 기반 통신을 수행할 수 있다. 이를 통해 테스트 환경, 로컬 서버 접속, 포트포워딩 기반 가상 환경 구성 등에 안전하고 빠르게 사용할 수 있다.
예를 들어, 사용자가 PuTTY에서 127.0.0.1:2222로 접속을 시도하면, 이 요청은 인터넷이 아닌 로컬 머신 내부에서 처리되며, VirtualBox NAT 포트포워딩 설정을 통해 게스트 OS(Ubuntu)의 22번 포트로 전달된다.
📌 요약: 127.0.0.1은 운영체제에 관계없이 모든 컴퓨터가 자기 자신에게 네트워크 요청을 보낼 수 있도록 하는 표준 루프백 주소이며, 외부 네트워크 없이도 로컬 통신이나 가상 머신 접속을 안전하게 수행할 수 있도록 도와준다.
4.4 PuTTY로 다중 SSH 세션 접속하기: 같은 서버 혹은 다른 서버
PuTTY는 SSH 프로토콜의 특성상 동일한 서버에 여러 개의 세션을 동시에 연결할 수 있으며, 이는 정상적인 동작이다.
SSH는 다중 세션을 허용한다.
예를 들어, 127.0.0.1:22로 여러 PuTTY 창을 열면, 같은 Ubuntu 게스트 머신에 여러 개의 SSH 세션을 동시에 여는 것이다. 각 세션은 독립적으로 로그인되어 작동하며, Ubuntu 서버 측에서는 다음 명령어로 현재 로그인된 세션들을 확인할 수 있다: 서버에서는 who
또는 w
명령어로 접속 세션을 확인할 수 있다.
who
w
서로 다른 호스트(IP 주소) 혹은 서로 다른 포트를 사용하는 경우에도 각기 다른 PuTTY 창에서 동시에 접속 가능하다. 이는 다른 서버 또는 같은 서버 내의 다른 SSH 포트로 접속하는 것으로 간주된다.
5. FileZilla로 파일 전송하기
5.1 FileZilla란?
FileZilla는 FTP/SFTP를 지원하는 무료 파일 전송 클라이언트 프로그램이다. SFTP(Secure File Transfer Protocol)는 SSH를 기반으로 하며, SSH 서버가 설치되어 있다면 SFTP 기능도 자동으로 지원된다.
5.2 접속 설정 (SFTP)
- FileZilla를 실행한다.
- 상단 빠른 연결창에 다음과 같이 입력한다:
- 호스트: sftp://127.0.0.1
- 사용자명: Ubuntu의 로그인 계정명
- 비밀번호: 해당 계정 비밀번호
- 포트: 22
- 연결하면 좌측은 로컬 파일 시스템, 우측은 Ubuntu 파일 시스템이 나타난다.
이 방식으로 Windows와 Ubuntu 간 파일을 안전하게 주고받을 수 있다.
6. ngrok으로 외부에서 SSH 접속하기
🧱 내부 IP는 외부에서 접근할 수 없는 이유
내부 IP(예: 10.0.2.15, 192.168.x.x, 172.16.x.x 등)는 왜 외부에서 접근 불가?
- 이 주소들은 RFC1918에 따라 사설 IP로 지정되어 있으며, 인터넷에서는 라우팅되지 않는다.
- NAT 또는 VPN 같은 기술을 사용하지 않으면, 외부에서 이 주소로 접속할 수 없다.
→ 그래서 외부에서 SSH 접속하려면 ngrok 같은 터널링 도구가 필요한 것!
6.1 ngrok이란?
ngrok은 로컬 서버를 외부 인터넷에 공개 가능한 주소로 터널링 해주는 클라우드 기반 도구이다. 공인 IP가 없는 상황에서도 외부에서 접속이 가능하다.
6.2 ngrok 설치 및 인증
Ubuntu 내부에서 다음 명령어를 입력하여 설치하고, 인증 토큰을 등록한다:
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-stable-linux-amd64.zip
unzip ngrok-stable-linux-amd64.zip
chmod +x ngrok
sudo mv ngrok /usr/local/bin
ngrok config add-authtoken <your_token>
6.3 SSH 포트에 대해 ngrok 터널 열기
ngrok tcp 22
실행 후 아래와 같은 출력이 나타난다:
Forwarding tcp://0.tcp.ngrok.io:12345 -> localhost:22
6.4 외부에서 SSH 접속하기
다른 컴퓨터나 모바일 환경에서도 다음과 같이 접속한다:
ssh ubuntu@0.tcp.ngrok.io -p 12345
ubuntu
는 사용자 계정명이며, 필요에 따라 변경한다.- PuTTY에서도 동일하게 설정하면 접속할 수 있다.
참고: ngrok 무료 플랜은 매번 실행 시 다른 주소와 포트를 부여하므로, 고정 주소가 필요하면 유료 플랜을 사용한다.
7. 전체 구성 흐름 요약
단계 | 설명 |
---|---|
1 | VirtualBox에 Ubuntu를 설치한다. |
2 | SSH 서버(openssh-server)를 설치하고 시작한다. |
3 | NAT 포트포워딩을 구성하여 호스트 포트를 게스트 포트로 연결한다. |
4 | PuTTY를 통해 로컬에서 SSH 접속을 수행한다. |
5 | ngrok을 통해 외부 접속용 터널을 생성한다. |
8. 핵심 용어 정리
용어 | 정의 |
---|---|
SSH | 암호화된 원격 접속 프로토콜 (Secure Shell) |
PuTTY | Windows용 SSH 클라이언트 프로그램 |
NAT | 사설 네트워크를 외부와 연결할 때 사용하는 주소 변환 기술 |
포트 포워딩 | 외부 요청을 내부 시스템의 포트로 전달하는 기술 |
Loopback | 자기 자신을 참조하는 IP 주소 (127.0.0.1) |
ngrok | 로컬 서버를 외부에서 접속 가능하게 해주는 터널링 서비스 |
'CS > Network' 카테고리의 다른 글
[Network] 포트에 따른 서버 및 서비스 구분 (0) | 2025.03.27 |
---|---|
[Network] telnet 또는 nc (netcat)으로 특정 포트 확인 (0) | 2025.03.20 |
[Network] TCP 소켓과 웹소켓 (1) | 2025.02.12 |
댓글