학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.05.12)

cd-record 2026. 5. 12. 19:25

 

NAT네트워크 고정IP할당

sudo nano /etc/netplan/01-netcfg.yaml # 설정파일 열기

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: yes
    enp0s8:
      dhcp4: no
      addresses:
        - 10.0.2.16/24 # 고정IP 설정
      routes:
        - to: default
          via: 10.0.2.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
          
sudo netplan apply # 적용

 

* NAT 네트워크 고정IP로 설정해놓은 이유??

1. 서비스 연결의 안정성 (Nginx, Gunicorn 연결 유지)

앞서 질문하신 프록시 환경을 예로 들면, Nginx 설정 파일에 Gunicorn 서버의 IP 주소를 적어두게 됩니다.

  • 유동 IP(DHCP): 서버를 재시작할 때마다 IP가 바뀌면, Nginx는 바뀐 IP를 찾지 못해 502 Bad Gateway 에러를 냅니다.
  • 고정 IP: 서버가 꺼졌다 켜져도 항상 같은 주소에 있기 때문에 설정 파일을 매번 수정할 필요가 없습니다.

2. 가상 머신(VM)과 호스트 간의 원활한 통신

NAT 환경에서 윈도우(호스트)가 리눅스(게스트) 서버에 SSH 접속(PuTTY, VS Code 등)을 하거나 DB에 접근할 때, 고정 IP가 아니면 접속할 때마다 ifconfig나 ip addr 명령어로 현재 IP를 확인해야 하는 번거로움이 생깁니다.

 

3. 포트 포워딩(Port Forwarding)의 필수 조건

NAT 네트워크는 외부에서 내부 서버로 직접 들어올 수 없어서, 특정 포트(예: 80, 8000)를 열어주는 포트 포워딩 설정을 합니다. 이때 "공유기의 80번 포트로 오는 신호를 192.168.x.x로 보내라"라고 규칙을 정하는데, 대상 IP가 바뀌어버리면 이 규칙 자체가 무용지물이 됩니다.

 

포트 포워딩

 

- 외부 인터넷에서 가정/사내의 공유기(라우터)를 거쳐 내부 네트워크(PC, 서버, CCTV 등)의 특정 기기로 접속할 수 있도록 길을 열어주는 NAT 기술

 

1. 포트 포워딩 설정

 

  • 호스트(Host) IP & 포트: 현재 당신이 직접 만지고 있는 PC의 주소입니다. 외부에서 접속할 때 거치는 '입구' 역할
  • 게스트(Guest) IP & 포트: 가상 머신(VM)이나 내부 서버의 주소입니다. 실제로 서비스(DB, Flask 등)가 돌아가고 있는 '종착지'
  • 프로토콜(TCP): 데이터를 주고받는 방식의 규칙입니다. 웹이나 DB 연결은 대부분 안정적인 TCP 방식을 사용

2. 이미지 속 설정의 의미 (예시)

이름 호스트 포트 (입구) 게스트 포트 (내부) 의미
DB 2223 22 호스트의 2223번으로 접속하면, 내부 가상 머신의 **SSH(22번)**로 연결됩니다.
Flask 5001 5000 웹 브라우저에 127.0.0.1:5001을 치면, 가상 머신 안에서 돌아가는 **Flask 서버(5000번)**가 뜹니다.
MySQL 3309 3306 DB 툴에서 3309번으로 접속하면, 가상 머신의 MySQL(3306번) 데이터베이스에 연결됩니다.

 

NGINX 설치 및 프록시 설정

1. NGINX

가벼움과 높은 성능을 목표로 개발된 오픈 소스 웹 서버/리버스 프록시 프로그램

  • 핵심 특징 및 기능
    • 비동기 이벤트 기반 아키텍처: 다수의 연결을 동시에 처리하여 높은 성능 제공.
    • 리버스 프록시: 클라이언트의 요청을 받아 백엔드 서버(예: Tomcat, WAS)로 전달 및 응답 처리.
    • 로드 밸런서: 트래픽을 여러 서버로 분산시켜 부하 관리.
    • 정적 파일 캐싱: 이미지, CSS, JS 등 정적 콘텐츠를 빠르게 처리.
 
  • 주요 용도
    • 웹 서버: 정적 파일 제공 (HTML, 이미지 등)
    • 프록시 서버: Apache나 웹 애플리케이션 서버(WAS) 전단에서 리버스 프록시 역할
    • 로드 밸런싱: 웹 트래픽 분산
 

2. 리버스 프록시(Reverse Proxy)

리버스 프록시는 클라이언트(사용자)의 요청을 대신 받아 내부 서버(Flask, Django 등)로 전달하고, 결과를 다시 클라이언트에게 보내주는 중간 관리자 역할

 

3. 프록시 설정 절차

1단계: Nginx 설치 및 기본 설정 초기화

먼저 패키지 목록을 갱신하고 Nginx를 설치한 뒤, 충돌 방지를 위해 기본 설정 파일을 삭제합니다.

# Nginx 설치
sudo apt update
sudo apt install nginx -y

# 기본 설정 파일 제거 (필요시 백업 권장)
sudo rm /etc/nginx/sites-enabled/default
sudo rm /etc/nginx/sites-available/default

2단계: 서비스 설정 파일 생성

Flask 앱을 위한 전용 설정 파일을 생성합니다.

sudo nano /etc/nginx/sites-available/myflaskapp

편집기(nano)가 열리면 아래 내용을 복사-붙여넣: 참고: 내부 포트가 5000이나 5001이라면 proxy_pass 부분의 숫자를 그에 맞게 수정해야 합니다.

Nginx
server {
    listen 80;
    server_name localhost; # 실제 도메인이 있다면 도메인 주소를 입력하세요.

    location / {
        proxy_pass http://127.0.0.1:8000; # Flask가 실행 중인 내부 주소
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

    }
}

3단계: 설정 활성화 및 적용

생성한 설정을 Nginx가 읽을 수 있도록 연결(Symbolic Link)하고 서버를 재시작합니다.

# 설정 활성화 (심볼릭 링크 생성)
sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled/

# 설정 구문 오류 검사
sudo nginx -t

# 오류가 없다면 Nginx 재시작
sudo systemctl restart nginx

 

방화벽

방화벽 상태 확인 및 활성화

sudo ufw status      # 현재 방화벽 상태 확인
sudo ufw enable      # 방화벽 활성화 (주의: SSH 포트를 먼저 열고 하세요!)
sudo ufw disable     # 방화벽 비활성화

 

 

특정 포트 허용/차단 (필수!)

프로젝트를 외부에서 접속하게 하려면 해당 포트를 반드시 열어줘야 합니다.

sudo ufw allow 80/tcp     # Nginx(HTTP) 접근 허용
sudo ufw allow 443/tcp    # HTTPS 접근 허용
sudo ufw allow 5000/tcp   # Flask 기본 포트 허용
sudo ufw allow 22/tcp     # SSH 접속 허용 (원격 접속 시 필수)
sudo ufw deny 3306/tcp    # MySQL 포트 외부 접근 차단 (보안)

 

* 기본 설정

# 방화벽 활성화 되어있을 시
sudo ufw default deny incoming # 밖에서 들어오는 모든 접속 일단 전부 거절

sudo ufw default allow outgoing # 내 서버에서 외부로 나가는 모든 신호는 전부 허용

 


네트워크 설정 정리

* 네트워크 설정 정리

1. 네트워크 방식별 역할 (어떤 걸 써야 하나요?)

① 가상 서버끼리 통신할 때: NAT 네트워크 (추천)

  • 설명: 가상 머신들만 접속할 수 있는 '전용 내부 운동장'을 만드는 방식입니다.
  • 사용 이유: 가상 머신 A(Flask)가 가상 머신 B(DB)에 접속해야 할 때, 외부 네트워크 상황과 상관없이 고정된 내부 IP로 통신할 수 있어 매우 안정적입니다.
  • 통신 주체: VM ↔ VM 간의 통신에 최적입니다.

② 웹 서버로 외부에 연결할 때: 어댑터에 브리지

  • 설명: 가상 머신을 내 공유기에 직접 연결된 '또 하나의 독립된 컴퓨터'로 만드는 방식입니다.
  • 사용 이유: 내 본체 PC와 같은 대역의 IP를 할당받기 때문에, 같은 와이파이를 쓰는 다른 노트북이나 폰에서도 가상 서버에 접속하기가 가장 쉽습니다.
  • 통신 주체: 외부 사용자 ↔ VM 간의 통신에 쓰입니다.

2. Gunicorn, Nginx 설정 시 어떤 IP를 써야 하나요?

설정 파일(Nginx, Gunicorn 등)을 작성할 때는 "그 프로그램이 실행되는 컴퓨터(가상 머신)의 입장"에서 생각하면 쉽습니다.

🏠 가상 머신 안에서 설정할 때 (Nginx, Gunicorn)

  • 사용할 주소: 127.0.0.1 (localhost) 또는 NAT 네트워크 내부 IP 또는 0.0.0.0(모든 주소)
  • 이유: Nginx와 Gunicorn이 같은 가상 머신 안에 있다면, 굳이 밖으로 나갈 필요 없이 자기 자신(127.0.0.1)에게 신호를 보내면 됩니다.
  • 예시: Nginx 설정의 proxy_pass http://127.0.0.1:8000;은 "내(가상 머신) 안에서 8000번으로 떠 있는 Gunicorn에게 보내라"는 뜻입니다.

🖥️ 컴퓨터 본체(윈도우 등)에서 가상 머신으로 접속할 때

  • 사용할 주소: 가상 머신의 IP 또는 포트 포워딩된 호스트 IP
  • 방법:
    브리지 모드라면: 가상 머신에서 ip a로 확인한 IP(예: 192.168.0.20)로 직접 접속.
    NAT 모드라면: 포트 포워딩 설정을 거쳐 127.0.0.1:호스트포트로 접속.

3. 총정리: 흐름도 (Sequence)

  1. 사용자(본체 브라우저): 127.0.0.1:5001 접속 (포트 포워딩 입구)
  2. 가상 머신 네트워크: 5001번 신호를 가상 머신의 80번(Nginx)으로 전달.
  3. Nginx (가상 머신 내): 80번으로 들어온 요청을 보고, 127.0.0.1:8000에서 대기 중인 Gunicorn에게 전달.
  4. Gunicorn/Flask (가상 머신 내): 파이썬 코드를 실행해 결과를 다시 Nginx에게 반환.

💡 헷갈림 방지 핵심 요약

  • 가상 서버 내부 설정(Nginx 등): 무조건 가상 서버 안의 주소(127.0.0.1)를 쓴다.
  • 가상 서버끼리의 연결(Flask → DB): NAT 네트워크의 고정 IP를 쓴다.
  • 내 컴퓨터(본체)에서 테스트: 포트 포워딩 설정에 적힌 호스트 IP와 포트를 쓴다.

 

 

 

 

느낀점

 

언제 어느 순간에 어떤 네트워크를 쓸 지 헷갈려서 수업 따라갈 때마다 머리가 어지러웠던 것 같다. 헷갈린 부분 질문하고 찾아보면서 해결하고 정리를 하니까 그나마 괜찮았던 것 같다.

 

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.