네트워크 리소스의 기본
네트워크의 기능은 크게 L2 네트워크(OSI 참조 모델의 데이터링크 계층)과 L3 네트워크(OSI 참조 모델의 네트워크)로 나눠볼 수 있다.
L2 네트워크는 같은 네트워크에 속한 장비를 연결한다. 대표적으로 스위치가 이런 역할을 한다.
L3 네트워크는 서로 다른 L2 네트워크를 연결한다. 대표적으로 라우터가 이런 역할을 한다.
네트워크에서 중요한 포인트는 IP 주소를 잘 다루느냐이다. 클라우드 환경에서는 IP 관리를 기본으로 포함하는 경우가 많다. 클라우드 환경에서는 IP 주소를 DHCP를 통해 할당된다. 다만 클라우드 환경에서는 DNS 확장성이나 오토 스케일링, 오토 힐링 같은 기능을 이용하기 위해서 IP 주소에 종속되지 않도록 해야 한다.
클라우드 환경의 네트워크 리소스
| 네트워크 리소스 | AWS VPC | 오픈스택 Neutron |
|---|---|---|
| 네트워크 전체 | 없음 | VPC |
| 스위치 | 네트워크 | (서브넷에 포함) |
| 서브넷 | 서브넷 | 서브넷 |
| 라우터 | 라우터 | 게이트웨이, 라우팅 테이블 |
| 포트 | 포트 | ENI |
| 시큐리티 그룹 | 시큐리티 그룹 | 시큐리티 그룹 |
| 네트워크 접근 제어 | Fwaas | NACL |
AWS는 한 테넌트가 여러 VPC를 생성할 수 있지만, 오픈스택은 한 테넌트는 하나의 가상 네트워크만 만들 수 있다.
두 서비스 모두 가상 네트워크별로 가상 라우터를 배치한다.
스위치
가상 스위치는 L2 네트워크 기능을 수행한다. 가상 스위치에 연결된 가상 서버는 별도의 라우팅 없이 서로 통신할 수 있다.
가상 스위치는 L3 네트워크에서 쓰이는 IP 주소 범위(CIDR)를 서브넷이라는 이름으로 할당 받는다! 서브넷 범위 내의 IP를 사용자가 자유롭게 할당할 수 있다.
클라우드 환경에서는 네트워크끼리 직접 연결되어 있지 않으면 같은 IP 주소를 써도 된다. 다만 공인 IP와 중복되지 않도록 사설 IP 주소의 범위에서 할당되는 게 일반적이다.
AWS VPC에서는 가상 스위치에 대응하는 리소스가 없다. 대신 서브넷에서 가상 스위치의 개념과 기능을 한다. 대부분 가상 스위치와 서브넷이 1대1 관계이고 TCP/IP를 사용할 때는 서브넷만 정의해도 충분하기 때문이다.
IP 주소 범위는 두단계로 지정된다. VPC를 생성할 때 정하고, VPC의 IP 범위 안에서 서브넷에서 사용할 범위를 정할 수 있다. VPC는 한번 할당받은 IP주소 범위를 수정할 수 없기 때문에 애초에 여유있게 정할 필요가 있다.

서브넷
서브넷에 연결된 서버는 기동 시 DHCP를 통해 IP 주소를 할당받고 그 IP 주소로 통신하게 된다. 다만 DHCP로 IP 주소를 받는다고 해서 매번 기동할 때마다 다른 주소를 받는게 아니다. 이미 IP 주소가 할당된 것을 DHCP가 전달할 뿐이다. 그래서 한번 기동한 서버를 여러번 재기동해도 같은 IP 주소가 부여된다.
서브넷은 할당된 IP 주소에만 통신을 허용한다. 그래서 사용자가 임의로 IP 주소 설정을 바꿔도 변경된 IP 주소로 통신하지 못한다.
서브넷은 해당 범위 안에서 통신할 수 있는 폐쇄적인 환경이라 다른 사람의 서브넷이나 IP주소가 중복되도 상관없다.
IP 주소의 범위 (CIDR)
서브넷을 생성할 때 지정하는 IP 주소 범위를 CIDR(사이더)라고 한다. Classless Inter Domain Routing을 줄인 말으로 직역하면 ‘클래스가 없는 내부 도메인 라우팅’이다.
CIDR은 IP 주소를 서브넷을 식별하는 네트워크 부분과 서브넷 안에서 개별 통신 장비를 식별하는 호스트 부분으로 나눈다. 그리고 네트워크 부분의 비트 길이를 서브넷 마스크로 표현한다.
인터넷 초창기에는 IP 주소의 상위 비트 값에 따라 서브넷 마스크가 결정됐다.
0으로 시작하면 서브넷 마스크가 8비트로 클래스 A로 부른다. 대략 1600만개 주소가 가능하다.
128으로 시작하면 서브넷 마스크가 16비트로 클래스 B로 부른다. 대략 65000개 주소가 가능하다.
223으로 시작하면 서브넷 마스크가 24비트로 클래스 C로 부른다. 대략 256개 주소가 가능하다.
하지만 1600만개 주소가 필요한 서브넷은 별로 없다. 그래서 클래스 A는 남는 주소가 많아 비효율적이다.
이런 고정된 서브넷 마스크 대신 가변 길이의 서브넷 마스크를 가진 CIDR를 통해 효율적으로 IP 주소를 할당한다.
라우터
라우터는 서로 다른 네트워크를 연결한다.
라우터는 다음과 같은 세가지 유형의 연결 방식이 가능하다.
- 내부 -> 내부
- 내부 -> 외부
- 외부 -> 내부
여기서 내부는 클라우드 네트워크를 의미한다.
내부 -> 내부
서로 다른 네트워크에 속한 서버끼리 통신한다. 기본적으로 VPC 내의 네트워크들을 연결한다. 경우에 따라서는 다른 테넌트의 네트워크를 라우팅해야 할 때가 있다. AWS에서는 VPC Peering, 오픈스택 Neutron에서는 네트워크 공유 기능을 사용한다.
내부 -> 외부
가상 네트워크에 속한 서버가 인터넷을 통해 외부로 접속되는 경우를 의미한다. 이때 라우터에서는 내부 네트워크에서 사용하는 사설 IP 주소를 공인 IP 주소로 변환하는 IP 마스커레이드를 하게된다.
IP 마스커레이드는 내부의 호스트들이 하나의 공인 IP로 사용. NAT를 통해 내부 IP에게 전달.
외부 -> 내부
외부에서 내부 네트워크로 접근하려면 공인 IP가 필요하다. 오픈 스택에서는 플로팅 IP, AWS에서는 EIP가 활용된다. 이런 공인 IP는 리전 별로 관리가 되고 어드레스 풀에서 확보해서 논리포트에 할당한다.
오픈스택 Neutron의 라우터
크게 가상 라우터와 서브넷의 연결 관계로 구성된다. 가상 라우터는 논리 포트로 연결된다.
연결된 후 가상 라우터의 라우팅 테이블이 갱신되어 이에 따라 전송 트래픽이 흘러간다.
만약 외부 네트워크와 통신하되 각 서브넷끼리 통신을 막고 싶으면 서브넷마다 라우터를 만들어서 각 라우터를 외부 네트워크에 연결해서 사용하면 된다.
AWS VPC
크게 게이트웨이와 라우팅 테이블로 구성된다. AWS에서는 외부로 통신하기 위해 VPC 안에 게이트웨이를 만든다. 그런 다음 서브넷의 라우팅 테이블에서 외부로 통신할 때 만든 게이트웨이를 통과하도록 라우팅 정보를 설정한다.
게이트웨이는 역할에 따라 여러 종류가 있다.
- 인터넷 통신을 위한 인터넷 게이트웨이 (IGW)
- 사설 네트워크 통신을 위한 버추얼 게이트웨이 (VGW)
- 리전 안에서 VPC끼리 연결하는 피어링 커넥션 (PCX)
- 인터넷에 연결된 서비스(S3)를 VPC에서 인터넷을 거치지 않고 연결하는 VPC 엔드포인트
AWS에서는 실제로 라우터가 리소스로 존재하지 않는다. 대신 라우팅 테이블을 통해 라우팅을 정한다. 라우팅 테이블은 VPC와 서브넷에 설정할 수 있다. VPC에 설정하는 건 메인 라우팅 테이블이고, 서브넷에 설정하는 것은 서브 라우팅 테이블이라 한다.
포트
논리 포트는 물리 스위치의 포트를 가상화한 개념이다. Neutron에서는 가상 스위치의 접점 의미가 강하고, AWS에서는 서버와 네트워크의 연결 인터페이스 개념이 강하고 ENI(elastic network interface)라고 부른다.
논리 포트는 물리적인 포트와 다른 점이 있다. 논리 포트는 생성될 때 자신이 소속된 가상 서브넷으로부터 IP 주소를 할당 받는다. 그리고 해당 포트는 그 IP 주소 외 통신은 차단한다. 논리 포트는 여러개의 IP 주소를 할당 받을 수 있다.
논리 포트(NIC)로 Failover
논리 포트를 다른 가상 서버에 옮겨서 할당할 수 있다. 즉 하나의 서버에 문제가 생기면 다른 가상 서버에 논리 포트를 옮겨서 장애에 대응할 수 있다. IP 주소의 변경 없이 사용하는 가상 서버를 교체할 수 있다.
게이트웨이로써 논리 포트
논리 포트는 서버와 가상 네트워크 연결에만 사용되지 않는다. 가상 네트워크와 라우터를 연결할 때도 쓰인다. 이런 포트에 할당된 IP 주소는 가상 서브넷의 게이트웨이 역할을 한다. 논리 포트를 통해 서브넷에 연결된 가상 서버는 이 게이트웨이(가상 포트)를 통해 클라우드 외부로 통신할 수 있다.
플로팅 IP(AWS의 엘라스틱 IP)도 논리 포트에 할당한다. 가상의 NAT에서 플로팅 IP로 온 트래픽을 할당된 논리포트로 라우팅한다.
논리 포트와 맥 주소
논리 포트는 IP 주소말고 맥 주소도 가진다. 맥 주소는 물리적인 L2 네트워크 정보로 가상 서버와 연결할 때 가상 서버 NIC의 맥 주소로 활용된다.
시큐리티 그룹
시큐리티 그룹은 트래픽을 필터링한다.
물리 환경에서는 방화벽 장비로 L2 네트워크 간의 트래픽을 제어한다. 서버 OS에서 제어하거나 스위치 장비에서 제공하는 ACL을 통해 접근 제어할 수 있다. 그러나 유지보수 측면에서 손이 많이 간다.
클라우드 환경에서는 논리 포트에 시큐리티 그룹을 설정해서 세밀하게 접근 제어를 할 수 있다.
기본적으로 모든 트래픽을 폐기하는 암묵적 Deny 정책을 따른다.
네트워크에서 접근 제어를 해야 OS나 어플리케이션에 종속되지 않고 보안 정책을 수립할 수 있다.
시큐리티 그룹 규칙 구성
- 입력 혹은 출력에 적용할 지 선택
- 허용할 프로토콜 종류 선택
- 통신 상대 지정 (통신 상대는 IP 주소 범위나 다른 시큐리티 그룹)
다른 시큐리티 그룹을 상대로 지정
서버 대수가 늘어날 때마다 시큐리티 그룹에 대상에 새로 생긴 서버를 추가하면 유지보수에 손이 많이 간다. 대상 서버들이 적용되는 시큐리티 그룹을 대상으로 하면 효율적으로 서버 추가에 대응할 수 있다.
시큐리티 그룹 활용
시큐리티 그룹을 웹 서버, DB 서버, 관리용으로 만들어 두고 각 리소스마다 포트에 할당하는 방식으로 운영할 수 있다.
네트워크 액세스 컨트롤 리스트(NACL)
서브넷에 대해 필터링한다. 패캣 필터링 하거나 권한을 분리하는 것이 가능하다.
시큐리티 그룹과 차이
상태 관점에서 차이가 있다. 상태는 통신 허용 정보를 생각하면 된다.
NACL은 Stateless이다. 즉 허용 정보를 관리하지 않는다. 왜냐면 암묵적으로 허용하는 정책을 따르기 때문이다.
반면 시큐리티 그룹은 Stateful하다. 즉 허용 정보를 관리한다. 왜냐면 암묵적으로 모두 금지하는 정책을 따르기 때문이다.
NACL은 서브넷 단위로 적용한다.
반면 시큐리티 그룹은 논리 포트 단위로 적용한다.
네트워크를 구성하기 위한 API 처리 흐름
오픈스택 Neutron에서 네트워크 리소스를 구성하는 흐름은 다음과 같다.
- 가상 네트워크 생성
- 가상 네트워크에 서브넷 할당
- 논리 포트 생성
- 가상 라우터 생성해서 서브넷과 연결
- 가상 라우터를 외부 L2 네트워크와 연결
각 단계마다 JSON 데이터를 포함해서 요청하면 된다. 네트워크의 CIDR 같은 정보를 JSON 형식으로 정의할 수 있다. 일관된 포맷으로 네트워크 정보를 유지할 수 있다.
한편 AWS에서는 다음과 같다.
- CreateVPC : VPC(가상 네트워크) 생성
- CreateSubnet : 서브넷 생성
- CreateNetworkInterface : ENI(포트) 생성
이 과정을 마친 뒤, 논리 포트(ENI)를 가상 서버에 연결하면 가상 서버는 즉시 통신 가능한 상태가 된다. 이런 클라우드 API를 활용한 네트워크 구축은 물리 환경에서 구축하기보다 훨씬 간편하다.
네트워크 리소스의 내부 구성
클라우드 환경에서 네트워크를 조작할 때 가상 네트워크가 어떻게 만들어지는 지 알아보자.
오픈스택인 Neutron을 기준으로 파악해보자.
가상 네트워크를 제어하는 프로세스
오픈스택 Neutron에는 두 종류의 호스트가 있다.
사용자가 실행한 API를 처리하는 프로세스가 동작할 호스트(컨트롤러 노드)
가상 서버가 기동하고 가상 네트워크를 구성하는 호스트(컴퓨트 노드)
여러 노드를 가진 테넌트의 가상 네트워크

위 예시를 보면 하나의 컴퓨트 노드에 동일한 IP 주소를 가진 두개의 가상 서버가 작동하고 있다. 일반적인 환경이나 가상화 환경에서는 불가능한 구성이다. 왜냐면 다른 호스트의 가상 서버와 통신하려면 IP 주소가 같아서 어떤 가상 서버와 통신하는 지 알 수 없기 때문이다.
클라우드 환경에서는 이런 충돌이 발생해도 문제가 되지 않도록 한다.
네트워크 식별
컴퓨터 노드에는 br-init과 br-turn 이라는 OVS(Open vSwitch) 브릿지가 만들어져 있다.
br-init은 가상 서버와 리눅스의 가상 인터페이스로 연결된다. 이 가상 인터페이스가 논리 포트가 된다.br-init은 br-turn과 연결된다. br-turn은 컴퓨트 노드 사이 패킷 전송을 담당한다.
가상 서버에서 전송되는 패킷은 가상 서버에 연결된 논리 포트(가상 인터페이스)를 통해 가상 서버가 어떤 네트워크에 속한 지 파악한다. 그래서 해당 패킷의 소속 네트워크를 식별하기 위해 VLAN ID를 패킷에 할당한다.
즉 하나의 컴퓨트 노드에 분리된 두 네트워크에 각자 속한 같은 IP 주소의 가상 서버는 패킷에 할당된 VLAN ID를 통해 각자의 네트워크를 식별할 수 있게된다.
두 컴퓨트 노드 사이 패킷 전송은 VXLAN이 사용된다. VXLAN은 이더넷 프레임을 캡슐화해서 L3 네트워크 상에 논리적인 L2 네트워크를 구성하는 터널링 프로토콜이다.
br-turn에서 내부로 패킷을 받아올 때는 VXLAN ID를 꺼내고 VLAN ID로 할당한다. 외부로 패킷을 내보낼 때는 VLAN ID를 꺼내고 VXLAN ID를 할당한다.
VLAN과 VXLAN
둘 다 가상 네트워크를 식별하기 위한 네트워크 가상화 기술이다. 두 기술의 차이는 구분 가능한 네트워크 갯수에 있다. VLAN은 4094개, VXLAN은 1600만개를 구분할 수 있다.
클라우드 네트워크와 SDN
SDN (Software Defined Networking)는 제어와 전송을 분리해서 API로 제어하겠다는 개념이다. 제어하는 부분은 컨트롤러, 전송을 담당하는 부분은 데이터 플랜이라고 한다.
SDN의 구성요소는
- 클라우드 네트워크 컨트롤러 : 클라우드에서 가상 네트워크를 동작시키기 위한 태스크를 실행
- 네트워크 오케스트레이터 : 각종 네트워크 장비를 제어하면서 가상 네트워크 기능 구현.
- 네트워크 장비 : 실제로 패킷을 다루는 장비. 장비를 제어할 수 있도록 API 제공
특히 클라우드 네트워크 컨트롤러는 사용자에게 노출되는 API를 담당한다. 즉 내부의 변화가 사용자에게 최대한 영향을 덜 미치도록 해야한다. 사용자들이 사용하기 편하도록 설계되어야 한다.