하나의 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에 부여하는 이유는 다양하다.
보통 웹서비스는 HTTP/HTTPS의 80, 443 포트를 사용하는데, IP가 하나라면 한 서비스가 하나의 포트를 점유했을 경우 다른 서비스는 8080과 같은 생소한 포트를 사용해야한다. 따라서, VM에 다양한 서비스가 존재한다면 서비스별로 IP를 나누고 포트 번호를 80, 443을 사용할 수 있도록 한다.
서버 장애 발생시 서비스용 IP를 따로 만들어두었다면, 메인 서버에 장애가 생겼을시, 그 IP를 즉시 대기중인 다른 서버로 옮길 수 있다.
서버로 드나드는 데이터의 성격에 따라, 외부 사용자가 접속하는 IP와 내부 관리자가 백업/모니터링을 위해 사용하는 IP를 분리해 관리용 트래픽이 폭주해도 실제 서비스 트래픽에 영향을 주지않으며, 방화벽도 IP 별로 다르게 지정할 수 있어서 안전하다.
VM 1대 (Vmware Workstation) / cpu-2core, mem-4GB, DISK-20GB
- Ubuntu 24.04
설치
- docker gnu
NGINX 컨테이너 2대 실행
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-compose up -d
// 상태 체크
systemctl status rc-local
systemctl start rc-local
systemctl enable rc-local
systemctl list-unit-files | grep rc.local // enable 확인
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
# 서버가 부팅될때마다 아이피 추가 하는 명렁어 작성
vi /etc/rc.local
# vm에 아이피 부여
ip addr add 192.168.130.234/24 dev ens33
# 재시작
systemctl restart rc-local.service


경로
- 192.168.11.133 / TCP 80 → test-nginx1 / TCP 80
포트포워딩 등록
- /etc/rc.local 에 작성

포트포워딩 등록 순서
- nat 테이블에 192.168.11.133:80으로 들어오는 패킷을 192.168.1.10:80으로 nat 포워딩하는 rule을 추가.
포트포워딩 된 ip 주소 조회 및 네트워크 포워딩 조회
# 포트포워딩 된 ip 주소 조회
iptables -t nat -L -n -v
# 네트워크 포워딩 조회
iptables -L -n -v
# iptables rule 조회
iptables -L
# nat 테이블 조회
iptables -t nat -nL
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;
...
}

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