VM 다중 IP 할당 및 컨테이너 포트 포워딩 (Ubuntu 24.04)

hee·2026년 8월 30일

무엇을 공부하는지

하나의 NIC가 여러 IP를 가지는 원리 
물리적 랜카드는 하나여도, OS는 이를 논리적으로 쪼개서 인식할 수 있음.
Secondary IP  : 하나의 인터페이스에 여러개의 IP 주소를 할당 
Sub-Interface : 인터페이스를 가상으로 나눔 → 물리적으로 하나, 논리적으로는 완전 분리 
OS 레벨에서의 트래픽 구분
VM 혹은 서버 내부로 패킷이 들어오면, OS 커널은 
L3에서 패킷 헤더의 Destination IP 확인 후 내 Secondary IP 중 하나와 일치하면 패킷 수용
L4에서 Port 번호 확인 후, 해당 포트를 열고 기다리는 프로세스에게 데이터를 전달
포트 충돌 해결
동일 IP에서 동일 Port를 동시에 사용할 수 없어서, 다중 IP 나누어 동일 포트를 할당함
트래픽 분리
멀티 테넌트 (여러 고객이 한 인프라 공유)  환경에서 필수적
VXLAN (가상 터널링), 보안 그룹

개념

포트포워딩

공유기, 공유네트워크는 공인 IP를 가지며, 우리가 공유기, 공유 네트워크에 연결해서 사용하는 핸드폰과 같은 기기의 IP는 사설 IP로 사용한다. 따라서, 공인 IP의 몇번 포트로 신호가 들어오면, 공인 IP와 연결된 내부의 누군가에게 전달을 해야하는데, 이때 필요한 것이 포트포워딩이다.

NAT 기술은 공인 IP를 사설 IP로 변환하는 기술로, 포트포워딩을 이해하기 위해 필요한 개념이다.

포트포워딩 테이블은 8080포트는 내부 IP의 80번 포트로 보낸다 와 같은 규칙을 가지고 있다.

다중 IP를 VM에 부여하는 이유

다중 IP를 VM에 부여하는 이유는 다양하다.

  1. 포트 중복을 회피하기 위함

보통 웹서비스는 HTTP/HTTPS의 80, 443 포트를 사용하는데, IP가 하나라면 한 서비스가 하나의 포트를 점유했을 경우 다른 서비스는 8080과 같은 생소한 포트를 사용해야한다. 따라서, VM에 다양한 서비스가 존재한다면 서비스별로 IP를 나누고 포트 번호를 80, 443을 사용할 수 있도록 한다.

  1. 서버 장애 대응

서버 장애 발생시 서비스용 IP를 따로 만들어두었다면, 메인 서버에 장애가 생겼을시, 그 IP를 즉시 대기중인 다른 서버로 옮길 수 있다.

  1. 트래픽 분산

서버로 드나드는 데이터의 성격에 따라, 외부 사용자가 접속하는 IP와 내부 관리자가 백업/모니터링을 위해 사용하는 IP를 분리해 관리용 트래픽이 폭주해도 실제 서비스 트래픽에 영향을 주지않으며, 방화벽도 IP 별로 다르게 지정할 수 있어서 안전하다.

VM 다중 IP 할당 및 컨테이너 포트 포워딩

준비사항

  • VM 1대 (Vmware Workstation) / cpu-2core, mem-4GB, DISK-20GB
    - Ubuntu 24.04

    • 테스트 컨테이너 test-nginx1
    • 테스트 컨테이너 test-nginx2
  • 설치
    - docker gnu

    • docker compose
    • nginx

NGINX 컨테이너 2대 실행

  • 프로젝트 파일 생성
    - html 파일 (nginx1, nginx2) + log 파일 생성
  • docker compose 파일 작성
    - 프로젝트 파일 하단에 생성
version: '3.7'
services:
  nginx1:
    container_name: test-nginx1
    image: "nginx:latest"
    restart: always
    volumes:
     - /var/log/nginx:/var/log/nginx # log파일의 위치
     - ./html/index1.html:/usr/share/nginx/html/index.html # index1.html 위치  
    environment:
     - TZ=Asia/Seoul
    networks:
      mynet1:
        ipv4_address: 192.168.1.10

  nginx2:
    container_name: test-nginx2
    image: "nginx:latest"
    restart: always
    volumes:
     - /var/log/nginx:/var/log/nginx # log파일의 위치
     - ./html/index2.html:/usr/share/nginx/html/index.html # index2.html 위치
    environment:
     - TZ=Asia/Seoul
    networks:
      mynet2:
        ipv4_address: 192.168.2.10

networks:
  mynet1:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.1.0/24

  mynet2:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.2.0/24
  • docker 실행

docker-compose up -d

rc.local

  • rc.local
    - 리눅스 시스템에서 부팅시 자동으로 실행되는 스크립트 파일 중 하나로, 사용자 지정 명령이나 스크립트를 포함할 수 있는 장소로 사용되며, 실행 권한이 없으면 서버 재가동시 스크립트가 실행되지 않는다.
// 상태 체크
systemctl status rc-local
systemctl start rc-local
systemctl enable rc-local
systemctl list-unit-files | grep rc.local // enable 확인

다중 포트 할당

  • rc.local 실행 권한 부여 및 실행
chmod +x /etc/rc.local

systemctl start rc-local.service
  • 그래픽 모드 아닌, 멀티 유저 모드로 부팅시 서비스 파일에 부팅 모드 설정 및 실행
    - /usr/lib/systemd/system/rc-local.service
#제일 하단에 추가 후 저장
[Install]
WantedBy=multi-user.target

# rc-local서비스 자동 실행 등록
systemctl enable rc-local.service
  • 추가 IP 부여

 # 서버가 부팅될때마다 아이피 추가 하는 명렁어 작성
 vi /etc/rc.local
 
 # vm에 아이피 부여
 ip addr add 192.168.130.234/24 dev ens33
 
 # 재시작
 systemctl restart rc-local.service

네트워크 설정 파일 수정

  • 설정 파일 이름 확인
    - cd /etc/netplan 으로 확인
  • 설정 파일 수정
    - 추가 IP 를 하단에 작성

  • 네트워크 재시작
    - systemctl restart NetworkManager

VM IP 별 포트 포워딩 설정

  • 경로
    - 192.168.11.133 / TCP 80 → test-nginx1 / TCP 80

    • 192.168.130.134 / TCP 80 → test-nginx2 / TCP 80
  • 포트포워딩 등록
    - /etc/rc.local 에 작성

  • 포트포워딩 등록 순서
    - nat 테이블에 192.168.11.133:80으로 들어오는 패킷을 192.168.1.10:80으로 nat 포워딩하는 rule을 추가.

    • 192.168.1.10:80인 TCP 패킷이 서버를 Forward할때, 이를 허용하는 rule을 추가
    • nat 테이블에 192.168.130.134:80으로 들어오는 패킷을 192.168.2.10:80으로 nat 포워딩하는 rule을 추가
    • 192.168.2.10:80인 TCP 패킷이 서버를 Forward할때, 이를 허용하는 rule을 추가
  • 포트포워딩 된 ip 주소 조회 및 네트워크 포워딩 조회

# 포트포워딩 된 ip 주소 조회
iptables -t nat -L -n -v

# 네트워크 포워딩 조회
iptables -L -n -v

# iptables rule 조회
iptables -L 

# nat 테이블 조회
iptables -t nat -nL

Nginx 설정 파일 수정으로 IP 별로 다른 화면 나오도록 수정

  • /etc/nginx/sites-available/default
map $server_addr $display_file {
    192.168.11.133      index_133.html;
    192.168.130.134     index_134.html;
    default             index.html;
}

server {
...
index $display_file;
...
}
  • nginx 재가동

결과

참고자료

https://m.blog.naver.com/anjae83/222064015099

https://fehoon.tistory.com/103

https://velog.io/@watervottle/linux-%EC%84%9C%EB%B2%84%EC%9D%98-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8top-free-m-df-Th

0개의 댓글