<IT엔지니어를 위한 네트워크 입문> 책을 함께 읽는 스터디를 진행하며 올리는 포스팅입니다.
스터디 repository
1장을 공부하며 OSI 2계층, 데이터 링크 계층에서는 MAC 주소 체계를 이용해 정확한 주소로 통신이 되도록 한다는 목적이 있다는 것을 공부했습니다.
2계층에서 사용하는 장비 중 스위치는 MAC 주소를 보고 통신해야 할 포트를 지정해 내보내는 역할을 합니다.
뿐만 아니라, 한 대의 장비에서 논리적으로 네트워크를 분리할 수 있는 VLAN 기능과, 네트워크 루프를 방지하는 스패닝 트리 프로토콜(STP)과 같은 기능을 수행하기도 합니다.
이번 포스팅에서는 2계층 장비인 스위치에 대해 자세히 알아보겠습니다.
허브와 달리, 스위치는 2계층 헤더 속 MAC 주소 정보를 통해 필요한 곳에만 패킷을 보내줍니다. 따라서 스위치로 인해 여러 장비가 서로 간섭 없이 통신할 수 있게 되었습니다.
이는 스위치가 MAC 주소 테이블
을 가지고 있기 때문에 가능합니다.
MAC 주소 테이블은 단말의 주소인 MAC 주소
와, 단말이 위치하는 인터페이스 정보
를 매핑한 테이블입니다.
스위치는 MAC 주소 테이블을 참고해, 해당 주소가 어느 포트에 있는지 확인 후 해당 패킷을 그 포트로만 전송합니다. 이 때, 테이블에 없는 도착지 주소를 가진 패킷이 들어오면 스위치는 전체 포트로 패킷을 전송합니다.
이더넷-TCP/IP 네트워크에서는 ARP 브로드캐스트
를 통해 이미 MAC 주소 테이블이 만들어진 상태로 통신이 시작됩니다. 이 때 ARP와 MAC 테이블은 일정시간 동안 지워지지 않는데, 이 시간을 에이징 타임
이라 합니다.
일반적으로 MAC 테이블의 에이징 타임이 ARP 에이징 타임보다 길어, 이더넷 네트워크를 플러딩 없이 효율적으로 운영할 수 있습니다.
스위치가 허브와 같이 모든 포트로 패킷을 전달하는 동작 방식을 플러딩
이라 합니다.
스위치는 LAN에서 동작하기 때문에, 정보를 갖고 있지 않아도 어딘가에 장비가 있을 수 있다고 가정하여 이러한 플러딩 작업을 수행합니다.
이더넷-TCP/IP 네트워크에서는 ARP 브로드캐스트를 미리 주고받은 후 데이터가 전달 되므로, 실제로 데이터를 주고 받을 때는 스위치가 패킷을 플러딩할 일이 없습니다.
따라서 스위치가 패킷을 플러딩한다는 것은 스위치가 정상적으로 동작하지 않거나, 공격이 수행되는 상황임을 의미합니다.
이러한 공격들은 스위치에게 엉뚱한 MAC 주소를 습득시키거나, 스위치의 MAC 테이블을 꽉 차게 해 플러딩 동작을 유도하여 패킷을 도청하는 방식으로 이루어집니다.
이 외에도, ARP 포이즈닝 기법
을 이용해 모니터링해야 할 IP의 MAC 주소가 공격자 자신인 것처럼 속여 원하는 통신을 받는 방법을 사용하기도 합니다.
MAC 주소 테이블을 만들고 유지하는 과정을 어드레스 러닝
이라고 합니다.
패킷이 특정 포트에 들어오면, 스위치는 해당 패킷의 출발지 MAC 주소와 포트 번호를 MAC 주소 테이블에 기록합니다. 어드레스 러닝은 출발지의 MAC 주소 정보를 사용하므로, 브로드캐스트나 멀티 캐스트에 대한 MAC 주소를 학습할 수 없습니다.
스위치는 패킷이 들어오면 자신이 가진 MAC 테이블과 비교해 매치되는 해당 포트로 패킷을 포워딩
합니다. 이때 다른 포트로는 해당 패킷을 보내지 않는데, 이를 필터링
이라고 합니다.
포워딩/필터링 작업은 여러 포트에서 동시에 수행
될 수 있으며, 통신이 다른 포트에 영향을 미치지 않습니다. 또한, 일반적인 유니캐스트
에 대해서만 수행되며 BUM 트래픽(브로드캐스트, 언노운 유니캐스트, 멀티캐스트)은 모두 출발지가 사용되지 않으므로 모두 플러딩합니다.
VLAN(Virtual Local Area Network)
은 물리적 배치와 상관없이 LAN을 논리적으로 분할, 구성하는 기술입니다.
최근 많은 단말이 네트워크에 연결되는 점, 과도한 브로드캐스트로 인한 단말 성능 저하 방지, 보안을 위한 차단 용도 등으로 인해 네트워크 분리의 필요성이 생겨났습니다.
VLAN은 하나의 장비에서 작동하지만, 서로 다른 네트워크를 갖도록 논리적으로 분할한 것이르모 VLAN 간 통신은 3계층 장비 없이 불가능합니다.
VLAN 할당 방식에는 포트 기반의 VLAN
과 MAC 주소 기반의 VLAN
이 있습니다.
스위치 포트에 VLAN을 설정해 네트워크를 분리하면 효율적으로 장비를 사용할 수 있습니다.
여러 개의 VLAN이 존재하며 서로 스위치를 연결해야 하는 경우 각 VLAN 개수만큼 포트를 연결해야 합니다. 따라서 VLAN의 개수가 많아질 수록 VLAN 별로 포트를 연결하면 많은 포트가 낭비됩니다.
이를 해결하기 위해 VLAN 태그
기능이 등장했습니다. 이를 통해 하나의 포트에 여러 개의 VLAN을 함께 전송할 수 있습니다. 이 포트를 태그(Tagged) 포트
또는 트렁크(Trunk) 포트
라 합니다. 이와 반대로 일반적인 포트를 언태그(Untagged) 포트
또는 액세스(Access) 포트
라 합니다.
태그 포트는 통신 시 이더넷 프레임 중간에 VLAN ID 필드
를 끼워넣고, 수신 측에서는 이 VLAN ID를 제거하면서 VLAN ID의 VLAN으로 패킷을 보냅니다.
태그 포트 기능이 생기면서 스위치의 MAC 주소 테이블에도 VLAN을 지정하는 필드가 추가
되었습니다. 따라서 하나의 스위치에서도 VLAN별 MAC 주소 테이블이 존재하는 것처럼 동작합니다.
SPoF(Single Point of Failure)란, 하나의 시스템이나 구성 요소에서 고장이 발생했을 때 전체 시스템의 작동이 멈추는 요소를 말합니다. 이를 방지하기 위해 네트워크는 이중화, 다중화 방식을 사용합니다.
SPoF를 피하기 위해 스위치 두 대를 사용해 네트워크를 디자인하지만, 이러한 디자인으로 인해 네트워크 루프가 발생할 수 있습니다.
루프(Loop)
란, 네트워크에 연결된 모양이 고리처름 되돌아오는 형태로 구성된 상황을 말합니다.
루프 상황이 발생하는 이유에는 아래의 두 가지가 있습니다.
루프 구조의 네트워크에서 브로드캐스트를 발생시키면, 스위치는 이 패킷을 유입된 포트를 제외한 모든 포트에 플러딩
합니다. 이를 받은 다른 스위치가 또 다시 이 패킷을 플러딩하면서 패킷이 계속 돌아가는 상황을 브로드캐스트 스톰
이라고 합니다.
스위치가 확인하는 2계층 헤더에는 3계층의 TTL같은 라이프타임 매커니즘이 없어, 브로드캐스트 스톰이 발생하면 패킷 하나가 전체 네트워크 대역폭을 차지할 수 있습니다.
이 상황에서는 케이블을 제거하기 전까지 네트워크가 마비된 것 같은 상태가 지속됩니다.
루프 구조 상태에서는 직접 전달되는 패킷과 스위치를 돌아 들어간 패킷 간 포트가 달라, MAC 주소를 정상적으로 학습할 수 없습니다.
스위치의 MAC 주소 테이블에서는 하나의 MAC 주소에 대해 하나의 포트만 학습할 수 있습니다. 따라서 하나의 MAC 주소가 여러 포트에서 학습되면 MAC 테이블이 반복 갱신되어 정상적으로 동작하지 않습니다. 이를 MAC 어드레스 플래핑
이라고 부릅니다.
이 현상이 발생하면 스위치가 정상적으로 동작하지 못하고 패킷을 플러딩하게 됩니다.
따라서, 이러한 루프 현상을 자동 감지해 포트를 차단하고, 장애 때문에 우회로가 없을 때 차단된 포트를 스위치 스스로 다시 풀어주는 스패닝 트리 프로토콜
이 개발되었습니다.
스패닝 트리 프로토콜(Spanning Tree Protocol)
은 루프를 확인하고, 적절히 포트를 사용하지 못하게 만들어 루프를 예방하는 매커니즘입니다.
STP를 사용하기 위해서는 전체 스위치가 어떻게 연결되는지를 파악해야 합니다. 따라서 스위치는 BPDU(Bridge Protocol Data Unit)
를 통해 스위치 간에 정보를 전달하여 전체 네트워크 트리를 만들어 루프를 확인합니다.
BPDU에는 스위치가 갖고 있는 고유 값 등의 정보가 담겨있는데, 이 정보들이 스위치 간 서로 교환되면서 루프를 파악합니다. 루프가 파악되면 그 지점을 차단해 루프를 예방하는 방식입니다.
STP가 동작 중인 스위치에서는 루프를 막기 위해, 스위치 포트에 신규 스위치가 연결되면 바로 트래픽이 흐르지 않도록 차단합니다. 그리고 구조를 파악하기 위해 BPDU를 기다려 학습하는데, 이때 트래픽을 흘리거나 루프 구조인 경우 차단 상태를 유지합니다.
차단 상태에서 트래픽이 흐를 때까지 스위치 포트의 상태는 다음의 4가지로 구분됩니다.
Blocking
Listening
Learning
Forwarding
이러한 단계를 거쳐야 하기 때문에, 스위치에 장비를 새로 붙이면 통신하는 데 50여 초가 소요됩니다. 새로 연결된 단말이 스위치일 가능성이 있기 때문입니다.
특정 링크가 다운되어서 차단된 포트가 포워딩될 때도, 20초의 Max Age를 거쳐 총 50초 후 포워딩 상태로 변경됩니다.
이때 다운된 링크가 자신의 인터페이스일 경우, 토폴로지가 변했음을 직접 감지할 수 있어 리스닝부터 상태 변화가 이루어집니다. 따라서 30초가 소요됩니다.
이렇게 STP가 활성화될 경우 포트가 포워딩 상태가 되는 데에 오랜 시간이 걸리게 됩니다.
이때, 일반 PC나 서버가 연결되는 포트라면 좀 더 빠르게 포워딩 상태로 변경되어야 하기 때문에 해당 포트를 포트 패스트(Port Fast)
상태로 설정합니다. 포트 패스트 상태로 설정된 포트는 BPDU 대기, 습득 과정 없이 곧바로 포워딩 상태로 포트를 사용할 있습니다.
포트 패스트를 설정한 포트에 스위치가 접속되면 루프가 생길 수 있기 때문에, 별도로 해당 포트에 BPDU가 들어오자마자 차단하는 BPDU 가드
등의 기술이 함께 사용되어야 합니다.
STP는 네트워크 상에서 뿌리 역할을 하는 가장 높은 스위치를 선출하고, 그 스위치를 통해 모든 BPDU가 교환되도록 하는데, 그 스위치를 루트 스위치
라고 합니다.
BPDU를 교환하는 과정에서 BPDU에 들어있는 브릿지 ID
값을 비교하고, 이 값이 더 적은 스위치를 루트 스위치로 선정합니다. 그리고 루트 스위치로 선정된 스위치가 BPDU를 다른 스위치 쪽으로 보냅니다.
STP는 아래와 같이 동작합니다.
TCP 기반 애플리케이션이 네트워크가 끊겼을 때 30초를 기다리지 못해, STP 기반 네트워크에 장애가 생기면 통신이 끊길 수 있습니다. 또한 스위치에 여러 개의 VLAN이 있으면 각 VLAN 별로 STP를 계산하여 부하가 발생할 수 있습니다. 이 문제를 해결하기 위해 여러 향상된 STP가 등장했습니다.
이중화된 스위치 경로 중 정상적인 경로에 문제가 생기면, 백업 경로를 활성화하는 데 30~50초가 소요됩니다. 이렇게 오랜 시간이 소요되는 문제를 해결하기 위해 RSTP(Rapid Spanning Tree Protocol)
이 개발되었습니다.
RSTP에서는 BPDU 메시지 형식이 다양해져 여러 가지 상태 메시지를 교환할 수 있습니다.
기존 STP에서는 토폴로지가 변경되면 말단 스위치에서 루트 브릿지까지 변경 보고를 보내고, 루트 브릿지가 연산 완료 후 변경된 토폴로지 정보를 말단 스위치까지 보내는 과정을 거쳤습니다.
하지만 RSTP에서는 토폴로지 변경이 일어난 스위치 자신이 모든 네트워크에 토폴로지 변경을 직접 전파할 수 있습니다.
이로 인해 RSTP는 2~3초 안에 장애 복구가 가능하여, 장애 발생 시 애플리케이션 세션이 끊기지 않아 보다 안정적으로 네트워크를 운영할 수 있게 해줍니다.
일반 스패닝 트리 프로토콜(CST, Common Spanning Tree)
은 VLAN 개수와 상관없이 스패닝 트리 하나만 동작합니다. 따라서 VLAN 개수가 많아도 스패닝 트리가 한 개만 동작하여 스위치의 부하가 적습니다.
하지만 루프가 생기는 토폴로지에서 한 개의 포트와 회선만 활성화되므로 자원을 효율적으로 활용할 수 없고, 최적의 경로로 통신하지 못할 수 있습니다.
이 문제를 해결하기 위해 PVST(Per Vlan Spanning Tree)
가 개발되었습니다.
PVST에서는 VLAN마다 다른 스패닝 트리 프로세스가 동작하므로, VLAN마다 별도의 경로와 트리를 만들 수 있게 되었습니다. 하지만 이로 인해 스위치에 더 많은 부담을 주는 문제가 있었습니다. 따라서 CST와 PVST의 단점을 보완하기 위해 MST(Multiple Spanning Tree)
가 개발되었습니다.
MST는 여러 개의 VLAN을 그룹으로 묶고, 그 그룹마다 별도의 스패닝 트리가 동작하는 방식입니다. 따라서 적은 스패닝 트리 프로토콜 프로세스가 돌게 되고, PVST의 장점인 로드 셰어링 기능도 함께 사용할 수 있습니다.
MST에서는 리전 개념이 도입되어 여러 개의 VLAN을 하나의 리전으로 묶을 수 있습니다. 이때 리전 하나가 스패닝 트리 하나가 됩니다.
끝