NIC(네트워크 인터페이스)와 통신의 이해 [with NAT & Docker]

서론

최근 구매한 서버의 인프라 세팅을 위해 자료들을 조사 중, 아래와 같은 글을 발견하였다.

물론 아직 서버가 도착한 건 아니다. 분명 반송한 게 도착했다곤 하는데 언제 보내줄련지 모르겠다.
인프라 구성도 초안 | 출처 : Proxmox로 사설 클라우드 구축하기, minboy.log

상기 글에 워낙 잘 정리가 되어 있다 보니 혹여 관심있는 사람들도 그대로 따라 해도 무방할 것 같다.

다만 해당 구성에서 좀 꺼려졌던 부분은 이미지와 같이 구성할 경우 Proxmox GUI가 외부로 노출된다는 점이다.

물론 2FA 인증 등을 설정할 수 있으나 어찌 되었든 외부로 공격 포인트가 노출된다는 점에서 좀 꺼려졌다.

그래서 내가 보완하려 한 구조는 pfSense 방화벽으로 모든 트래픽을 1차 검증하고,
검증된 트래픽에 한해서만 서버 및 서비스에 접근할 수 있도록 하는 방식으로 보완하고자 하였다.

이 과정에서 자연스럽게 WAN, LAN, NIC, 라우팅, 스위칭 같은 기초 개념을 다시 학습할 필요를 느꼈고,
이에 대해 공부한 바를 정리해보고자 한다.


본론

NIC(Network Interface Card)란?

항상 멍청한 질문에도 친절히 답하여 주시는 대자대비하신 ChatGPT님께 여김 없이 조언을 구하였다.

NIC란?
- NIC(Network Interface Card) = 네트워크 장치
- 역할: 컴퓨터(또는 VM/컨테이너)가 네트워크와 통신할 수 있게 하는 장치
- 예전에는 물리적인 카드였지만, 지금은 VM/OS에서 가상 NIC도 많이 사용함.

주요 특징
- IP를 1개 이상 가질 수 있음 → NIC가 네트워크 상에서 “주소” 역할
- 물리 NIC = LAN 케이블 연결
- 가상 NIC = VM/컨테이너 내 OS가 네트워크와 연결되는 창구


출처 | OpenAI. (2025). ChatGPT (o1 Version) [Large language model]. https://chat.openai.com

정리해 보면, NIC는 서버가 네트워크와 통신할 수 있도록 해주는 장치다.

하드웨어적으로는 랜카드 같은 형태고, 소프트웨어적으로는 eth0, ens33 같은 인터페이스 이름으로 표현된다.

군대에서 지겹도록 집었던 RJ45 랜선이 바로 NIC와 연결되는 물리적인 통로이다.

또한 각 NIC는 고유의 MAC 주소를 가지며, DHCP 서버가 이 MAC에 IP를 할당하면 OS가 이를 네트워크 인터페이스에 바인딩하여 통신할 수 있게 한다.

참고로 DHCP는, Dynamic Host Configuration Protocol로 현재까지도 IPv4를 사용하는 핵심 근간이다.
네트워크 수업을 들은 지 약 6년이 지났지만 아직도 축약어를 기억하고 있다. 샤라웃 투 노X희 교수님.

여기까지는 이해가 쉽다. 각 NIC에 부여된 MAC 주소를 기반으로 IP를 부여하는 구조이니 말이다. 그렇다면 우리가 자주 사용하는 로컬 호스트(127.0.0.*), 로컬 네트워크(192.168.0.*)는 어떻게 식별되는 걸까?

WAN(Wide Area Network)과 LAN(Local Area Network)

WAN(Wide Area Network)는 외부 인터넷으로, 공인망에 해당한다.
LAN(Local Area Network)는 가정이나 사무실 내부의 사설망에 해당한다.

실제 가정집을 예로 들어보자.

벽에 위치한 인터넷 포트가 외부망과 연결되는 지점이고, 여기서 랜선을 뽑아 공유기의 WAN 포트에 연결한다. 이후, 공유기 LAN 포트와 PC의 NIC에 랜선을 연결하여 인터넷에 접속할 수 있게 된다.

즉, 아래와 같은 구성을 통해 우리가 PC에서 인터넷을 사용할 수 있는 것이다.

벽 포트(인터넷 회선) → 공유기 WAN 포트 → 공유기 LAN 포트 → 디바이스 NIC

공유기 WAN 포트 및 LAN 포트 | 출처 : 인터넷이 들어오는 과정, 공유기 WAN, LAN 차이점, 밍봉

라우팅(Routing) VS 스위칭(Switching)

이제 WAN과 LAN 연결이 어떻게 이루어지는지 이해했으니, 그다음은 라우팅과 스위칭의 차례이다.

  • 라우팅(Routing) : IP 기반으로 서로 다른 네트워크(WAN ↔ LAN) 간 통신 중계
  • 스위칭(Switching) : 같은 네트워크(LAN 내부)에서 MAC 주소 기반으로 통신 중계

이를 테이블 형태로 정리해 보면 아래와 같다.

구분 스위치 라우터
계층 2계층(Data Link) 3계층(Network)
기능 MAC 주소 기반 프레임 전달 IP 주소 기반 라우팅
목적 LAN 내부 장치끼리 통신 서로 다른 네트워크 (WAN ↔ LAN) 연결

우리가 사용하는 일반적인 공유기는 스위치 + 라우터 기능을 모두 포함한다.
때문에 내부에서 패킷이 발생하면 공유기(스위치)가 우선 이를 감지한다.

목적지가 내부 IP일 경우 ARP(Address Resolution Protocol)을 통해 목적지의 MAC 주소로 패킷을 전송하고,
목적지가 외부 IP일 경우 NAT(Network Address Translation) 변환 후 라우터를 거쳐 외부 네트워크로 전달한다.

그렇다면 이 시점에서 왜 카페 같은  공용 Wi-Fi를 사용하지 말라는지 알 수 있을 것 같다.
우리가 일반적으로 WiFi에 연결할 경우 같은 Wi-Fi에 연결된 장치들은 같은 서브넷을 쓰는 경우가 대부분이다.

그렇다면 같은 Wi-Fi에 연결된 다른 모든 장치들을 대상으로 브로드캐스트 패킷을 통해 다른 장치와 통신할 수 있다. 이를 방지하기 위해 AP Isolation 같은 기능을 두지만, 공용 와이파이가 이를 적용했는지는 보장할 수 없다.

이러한 이유로 인해 공용 Wi-Fi 사용을 자제하라는 것이다.

이 뒤의 흐름은 우리가 익히 아는 OSI 7 계층 구조로 진행된다.

데이터 캡슐화 | 출처 : OSI 7 계층, 위키원

LAN IP와 NAT(Network Address Translation)

이제 LAN이 어떻게 구성되는지는 알았다만, LAN에 연결된 디바이스들은 서로를 어떻게 식별하는 것일까?

전지전능하시고 대자대비하신 ChatGPT님께서 말씀해 주신 바를 인용해 보자면, 아래와 같은 내용이 있었다.

NIC의 주요 특징 중 하나로, IP를 1개 이상 가질 수 있다.

이 말만 들으면, 아 NIC에 '공인 IP와 사설 IP 각각이 생기는 거구나' 싶을 거다.
하지만 이러한 추측과는 달리, NIC에 동시에 공인 IP와 내부 IP가 부여되지 않는다.

NIC에는 내부 사설 IP(192.168.x.x 등)만 부여되고, 외부 인터넷에서 볼 때는 공유기의 공인 IP로 보인다.

여기서 NAT(Network Address Translation)에 대한 이해가 필요한데, 앞서 목적지가 외부 IP일 경우 NAT(Network Address Translation) 변환이 이루어진다 하였다. 보다 구체적으론 아래와 같은 흐름으로 이어진다.

  1. 사설 IP(192.168.x.x)가 부여된 PC에서 외부 서비스를 이용하려고 패킷을 전송
  2. NAT 장치(공유기)가 해당 패킷의 Source IP를 자신(공유기)의 공인 IP로 변환하여 외부로 전송
  3. 외부 서비스의 응답이 Source IP(공유기의 공인 IP)로 도착
  4. NAT 장치(공유기)가 해당 패킷의 실제 Source IP(PC)로 해당 패킷 전달

즉, 내 컴퓨터의 NIC은 사설 IP만 가지고 있지만, 외부에선 NAT 덕분에 공인 IP로 보이는 것이다.
실제 macOS 기준, 아래와 같이 공인 IP(공유기, 와 내부 IP가 모두 존재함을 확인할 수 있다.

echo "내부 IP: $(ipconfig getifaddr en0)"; echo "공인 IP: $(curl -s ifconfig.me)"

내부 IP: 192.168.*.*
공인 IP: 112.147.*.*

내부 IP는 그 스위치와 연결된 DHCP 서버에서 부여받는 걸 사용하거나, 수동으로 지정할 수도 있다.

macOS 기준 IP 구성 화면 | 출처 : 내 노트북

도커(Docker) 네트워크

이제 WAN, LAN 등의 네트워크가 어떻게 구성되는지는 알 것 같다.

그렇다면 우리가 흔히 사용하는 도커(Docker)의 네트워크까지 나아가보자. 도커 컨테이너는 독립적인 애플리케이션 실행 단위지만, 결국 네트워크 통신을 통해 외부와 연결되어야 한다.

이를 위해 도커는 기본적으로 3가지 네트워크 모드를 제공한다.

모드 특징
bridge (기본) 컨테이너별 가상 네트워크가 생성되며, 호스트와는 분리됨
host 컨테이너가 호스트 네트워크 직접 사용
none 네트워크 없음

여기까지 왔으면 bridge 모드를 사용할 경우 컨테이너별 가상 네트워크가 구성된다는 점에서, '아 가상 NIC가 생성되어 IP가 부여되는 거겠구나'는 사실을 유추할 수 있다.

실제 도커 네트워크 구성 원리에 대해 찾아보니, 아래와 같이 네트워크가 생성됨을 확인할 수 있다.

도커 네트워크 구조 | 출처 : [Docker] Docker Network (docker0와 veth), 만자의 개발일지

veth(Virtual Ethernet Pair)

그런데 컨테이너 내부의 NIC는 어디와 이어지는 걸까?

도커가 컨테이너를 실행하면, vethXXXX와 같은 이름의 가상 NIC 쌍을 만든다. 이 NIC 쌍의 한쪽은 컨테이너와 연결되며, 다른 한쪽은 호스트(docker0 브릿지)에 연결된다. 즉, 컨테이너 안에서 보이는 eth는 veth 쌍의 한쪽 끝이고, 호스트 OS에서 보면 해당 NIC가 docker0 브리지에 붙어 있는 것이다.

가상의 랜선을 통해 이어진다고 이해하면 된다.

이러한 가상으로 이루어진 NIC를 veth(Virtual Ehternet Pair)라고 부른다.

자 그럼 veth 쌍으로 인해 도커 컨테이너가 docker0 브릿지와 연결된다는 건 알았는데, docker0 브릿지는 또 뭘까?

docker0 브릿지

docker0 브릿지란 도커를 설치하면 자동으로 생성되는 가상 브리지 인터페이스로, 일종의 가상 스위치이다. 컨테이너가 실행되면 각 컨테이너의 NIC가 docker0에 연결되어, 마치 스위치에 여러 PC가 꽂힌 구조처럼 된다.

앞서 가상 스위치라고 언급하였듯이, 컨테이너에서 나온 패킷은 veth를 타고 docker0 브리지로 들어간다. 이후 docker0 브리지는 해당 패킷의 목적지가 같은 브리지 내 다른 컨테이너라면 그대로 전달한다.

만약 목적지가 외부라면 iptables를 거쳐 호스트 NIC를 통해 외부 네트워크로 나간다.

iptables와 NAT

그렇다면 도커 네트워크에서 외부 인터넷과는 어떻게 통신할까?

도커는 내부 iptables 규칙을 통해 컨테이너 내부(172.17.x.x)에서 발생하는 트래픽을 호스트의 공인 IP로 변환한다.

즉, 일반 가정집 공유기가 LAN ↔ WAN 트래픽을 NAT로 처리하듯, 도커 역시 컨테이너 ↔ 외부 네트워크 트래픽을 NAT로 처리하는 것이다.

아래는 실제 서버에서 확인한 iptables의 일부다.

$ sudo iptables -t nat -L -n -v

Chain POSTROUTING (policy ACCEPT 4753K packets, 296M bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  6    --  *      *       172.28.0.3           172.28.0.3           tcp dpt:6379
    0     0 MASQUERADE  6    --  *      *       172.28.0.5           172.28.0.5           tcp dpt:9300
    0     0 MASQUERADE  6    --  *      *       172.28.0.5           172.28.0.5           tcp dpt:9200
    0     0 MASQUERADE  6    --  *      *       172.28.0.8           172.28.0.8           tcp dpt:20001

위 규칙은 Docker 컨테이너의 사설 IP와 포트를 외부로 NAT 변환하는 과정을 보여준다.

풀이해 보면 컨테이너의 6379, 9300, 9200, 20001 같은 포트가 외부에서 접근 가능하도록 호스트의 iptables가 MASQUERADE 규칙을 자동으로 추가한 것이다.

즉, 공유기가 하는 일을 도커가 iptables을 통해 똑같이 구현한 것이다.


결론

여기까지 NIC, LAN/WAN, 라우팅과 스위칭, NAT와 Docker 네트워크까지 개념을 정리해 보았다.

사실 단순히 “Proxmox + pfSense로 인프라 꾸민다”에서 끝낼 수도 있었는데, 막상 정리하다 보니까 기초 개념부터 그동안 흘려 들어왔던 내용들을 정리할 수 있었다.

분명 대학교 수업 때 배운 내용들인데, 이제야 몸소 체득한 기분이다.

이번에 정리한 내용을 기반으로 추후 서버가 도착한다면 방화벽을 비롯한 인프라 구성에 대해 다뤄보도록 하겠다.


참고자료

Proxmox로 사설 클라우드 구축하기
더이상 프리티어는 그만. 나만의 홈서버 구축기 - proxmox 설치 및 설정
WAN이란 무엇인가요? - 광역 네트워크(WAN) 설명 - AWS
WAN의 정의, 기업이 WAN을 사용하는 방법과 이유, AWS에서 WAN을 사용하는 방법을 설명합니다.
종합 IT거시기 블로그 : 네이버 블로그
pfSense® - World’s Most Trusted Open Source Firewall
pfSense is a free and open source firewall and router that also features unified threat management, load balancing, multi WAN, and more
[무선 라우터] AP 격리 기능을 설정하는 방법은 무엇입니까? | 공식지원 | ASUS 한국
위키원
위키원
🌐 NAT(Network Address Translation) 이란 무엇인가?
NAT (Network Address Translation) 개념 네트워크 주소 변환(network address translation, 줄여서 NAT)은 컴퓨터 네트워킹에서 쓰이는 용어로서, IP패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. 한 마디로 Network Address인 IP를 변환(Translation)하겠다는 뜻이다. NAT를 이용하는 이유는 대개 사설 네트워크(Private Network)에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다. IP 주소에는 Public IP(공인 IP)와 Private IP(사설 IP)가 있다. IP를 굳이 두 종류로 나눈 이…