상세 컨텐츠

본문 제목

25.02.28. [MINI] NAT && ngrok 실습

AWS CLOUD SCHOOL 9기

by AI Engineer crystal 2025. 2. 28. 16:00

본문

NAT(Network Address Translation)는 내부 네트워크의 private IP 주소를 외부와의 통신을 위해 public IP 주소로 변환하는 기술입니다. NAT는 내부 네트워크에서 여러 장치가 하나의 공인 IP를 공유하도록 도와줍니다. 주로 출발지 NAT(SNAT)목적지 NAT(DNAT) 방식으로 트래픽을 처리하는데, SNAT는 내부 네트워크에서 나가는 트래픽의 출발지 주소를 공인 IP로 변환하고, DNAT는 외부에서 들어오는 트래픽을 특정 내부 장치로 포워딩하는 역할을 합니다.

NAT는 기본적으로 외부에서 내부 네트워크로의 접근을 막는 보안 기능을 제공합니다. 이는 외부의 공격자가 내부 네트워크를 직접 침투하는 것을 방지합니다. 외부에서 내부 네트워크로의 접근을 허용하려면, 포트 포워딩과 같은 추가 설정이 필요합니다.

 

여기서, 포트 포워딩은 외부에서 들어오는 트래픽을 특정 내부 네트워크의 IP 주소와 포트로 직접 전달하는 것입니다. 외부에서 특정 포트로 들어오는 요청을 지정된 내부 장치로 전달합니다. 포트 포워딩은 주로 공유기나 방화벽에서 설정되어, 외부에서 내부 서비스로의 접근을 허용합니다. 주로 하나의 서비스나 장치에 대해 설정됩니다.

보통 홈 네트워크 소규모 서버 환경에서 사용됩니다. 예를 들어, 집에서 게임 서버나 웹 서버를 운영할 때, 외부에서 해당 서버에 접근하기 위해 라우터에서 포트 포워딩을 설정합니다. 이는 외부 사용자가 203.0.113.1:8080으로 접속하면, 해당 트래픽이 내부의 192.168.1.10:80으로 전달되는 방식입니다.


ngrok터널링 서비스로, 개발자가 localhost에서 실행 중인 서비스를 외부에서 접근할 수 있도록 reverse proxy를 제공합니다. ngrok은 NAT를 우회하는 것이 아니라, ngrok 서버와 연결된 공인 URL을 통해 내부 서버와 외부 간의 연결을 중계하는 방식입니다. 이를 통해 외부에서 로컬 서버에 접근할 수 있지만, 보안 측면에서 무료 계정은 기능에 제한이 있어 인증이나 접속 제한을 설정하는 데 제약이 있을 수 있습니다. 유료 서비스를 사용하거나 자체 서버를 구축하여 보안적인 부분을 강화할 수 있습니다.

 

 

여기서, 리버스 프록시는 클라이언트가 요청하는 트래픽을 여러 내부 서버 중에서 적절한 서버로 중계하는 서버입니다. 리버스 프록시는 서버 측에서 클라이언트의 요청을 처리하며, 요청을 실제 서버로 전달하는 방식입니다. 리버스 프록시는 로드 밸런싱, 보안, SSL 종료, 캐싱과 같은 추가적인 기능을 제공할 수 있습니다. 또한, 하나의 공인된 IP로 여러 내부 서버를 운영할 수 있게 해줍니다.

대규모 웹 애플리케이션, 클라우드 환경, 다중 서버 환경에서 유용합니다. 예를 들어, 하나의 도메인에서 여러 웹 애플리케이션을 제공하고자 할 때, 리버스 프록시를 사용해 여러 서버에 트래픽을 분배하거나, 로드 밸런싱을 통해 서버에 부하를 고르게 분배할 수 있습니다. 또한, 리버스 프록시를 통해 SSL 종료를 처리하여 보안성을 강화할 수 있습니다.


🛠 Step 1: ngrok 설치

(1) Linux/macOS에서 설치

wget <https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-stable-linux-amd64.zip>
unzip ngrok-stable-linux-amd64.zip
sudo mv ngrok /usr/local/bin/

또는 macOS의 경우 Homebrew 사용 가능

brew install ngrok/ngrok/ngrok

(2) Windows에서 설치

  1. ngrok 공식 사이트에서 다운로드
  2. 압축 해제 후 ngrok.exe를 실행할 경로에 배치

(3) 설치 확인

ngrok --version

출력이 나오면 설치 완료!


🛠 Step 2: ngrok 인증 (무료 계정 등록 필요)

ngrok 사용을 위해 무료 계정 등록 후 인증 토큰을 설정해야 해.

  1. https://dashboard.ngrok.com/signup 에서 계정 생성
  2. 로그인 후 Auth Token 발급
  3. 터미널에서 다음 명령 실행 (발급받은 토큰 입력)
ngrok config add-authtoken <your-auth-token>

 


🛠 Step 3: 로컬 웹 서버 실행 (예: Python Flask 사용)

[user1@rocky1 ~]$ sudo dnf install python3
[user1@rocky1 ~]$ python3 --version
Python 3.6.8
[user1@rocky1 ~]$ python3 -m venv venv
[user1@rocky1 ~]$ ls -al
total ...
drwx------. 7 user1 user1     4096 Feb 27 22:59 .
drwxr-xr-x. 3 root  root        19 Feb 25 22:13 ..
...
drwxrwxr-x. 5 user1 user1       74 Feb 27 22:59 **venv**
[user1@rocky1 ~]$ source venv/bin/activate
(venv) [user1@rocky1 ~]$ pip install --upgrade pip
# Flask 설치 (필요한 경우)
pip install flask

# 간단한 웹 서버 만들기
echo "
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, ngrok!'

if __name__ == '__main__':
    app.run(port=5000)
" > app.py

# 실행
python app.py

이제 로컬에서 http://127.0.0.1:5000으로 접속하면 "Hello, ngrok!"이 표시됨.

단, flask server를 계속 열어둬야 함.


🛠 Step 4: ngrok으로 외부에 공개

다음 명령어를 실행하면 ngrok이 실행되면서 외부에서 접근할 수 있는 공개 URL을 제공함.

ngrok http 5000

출력 예시:

Forwarding                    <https://random-subdomain.ngrok.io> -> 

이제 브라우저에서 https://random-subdomain.ngrok.io를 열어보면 로컬 서버의 응답을 볼 수 있음!

 

관련글 더보기