도커로 구축한 랩에서 혼자 실습하며 배우는 네트워크 프로토콜 입문 #2
자손킴 @jasonkim@hackers.pub
2장. 레이어 2 프로토콜 이해하기
이 장에서는 같은 네트워크에 있는, 즉 같은 스위치(L2)에 연결된 장비들이 통신 하는 방법에 대해서 다룬다. L2는 데이터 링크 계층으로 MAC 주소를 사용하여 통신한다. 그러나 통신을 시작할때는 MAC 주소는 모르고 IP주소만 아는 상태로 통신을 시작하기 때문에 ARP를 사용하여 지정된 IP에 할당된 MAC 주소를 확인해야 한다.
L2 스위치
LAN을 구성하는 장비. 여러 개의 유선 LAN 단말을 연결하여 이더넷 프레임을 전송한다.
작은 규모에서는 라우터와 스위치가 하나로 합쳐진 장비를 사용하기도 한다. 그러나 이 책에서는 실습을 위해 둘을 분리해서 사용한다.
데이터 링크 계층(L2)
같은 네트워크에 있는 단말을 식별하고 물리 계층 위에서 비트열을 정확하게 전송하는 메커니즘
데이터 전체의 무결성을 검사하여 오류를 감지하고 신뢰성을 보장
MAC 주소를 사용하여 발신, 수신 단말을 식별. MAC 주소는 라우터를 넘어가지 못함. 같은 브로드캐스트 도메인 내에서만 통신. 논리적 주소(IP주소등) 지정 불가능
유선LAN(이더넷) 또는 무선랜LAN(Wi-Fi) 프로토콜을 사용
레이어 2 프로토콜의 사실상의 표준
애플토크(애플), 토큰링(IBM)등이 있었지만 없었습니다.
네트워크 세계의 주소
네트워크 세계에는 MAC 주소, IP 주소 두 가지가 존재한다. 이 두 주소를 연결하여 데이터 링크 계층(L2)과 네트워크 계층(L3)의 통신이 이루어지도록 해야한다. MAC 주소와 IP 주소를 연결하는 프로토콜을 ARP(Address Resolution Protocol)라 하고 이것은 뒤에서 더 자세히 다룬다.
MAC 주소
NIC 자체에 설정하는 주소. 데이터 링크 계층(L2)에서 작동한다.
이더넷 네트워크(LAN)에 연결된 단말을 식별하는 6바이트(48바이트) ID
물리 머신은 NIC를 제조할 때 ROM에 기록
가상 머신은 하이퍼바이저가 가상 NIC에 할당
컨테이너는 부팅 시 할당된 IP주소에서 자동으로 생성
맨 앞에서 8번째 비트인 I/G(Individual/Group) 비트와 7번째 비트인 U/L(Universally/Locally) Administered 비트는 특별한 의미를 갖는다.
- I/G(Individual/Group) 비트
- 통신의 종류
- 1:1 통신인 유니캐스트 주소인지, 1:n 통신인 멀티캐스트 주소인지 표시
- 0 이면 1:1 유니캐스트
- 1이면 1:n 멀티캐스트 그룹 (여러 단말의 그룹)
- 이 경우 발신자 MAC 주소는 설정되지 않고 항상 목적지 MAC 주소로 설정
- 멀티캐스트 그룹의 경우 이번 장에서는 정확히 설명되지 않음
- 항상
01:00:5E로 시작 한다고함 (IANA에 의해 할당) - 뒤쪽 24비트중 하위 23비트만 IP주소에서 가져오고 상위 1비트는 0으로 고정
- 특별한 IP주소를 사용해서 매칭한다고 함
- IP 비트중 상위 5비트를 제외한 23비트만 사용하기 때문에 충돌 가능성 있음
- 만약 48비트가 모두 1인 ff:ff:ff:ff:ff:ff 이라면 브로드캐스트를 의미하며, 같은 LAN에 접속하는 모든 단말을 뜻함
- 이 경우 발신자 MAC 주소는 설정되지 않고 항상 목적지 MAC 주소로 설정
- U/L(Universally/Locally) Administered 비트
- 운영 관리 방식
- 0이면 IEEE에서 관리하는 범용 주소
- 전 세계 유일무이
- 1이면 조직 내에서 관리되는 로컬 주소인지 표시
- 관리자가 설정했거나 OS 기능에 의해 할당
- 상위 24비트에 대하여
- OUI(Organizationally Unique Identifier) 라고 한다.
- U/L이 0이면 IEEE가 벤더별로 할당하는 벤더 코드
- 돈내고 등록해야 한다고 함
- 물리 장비 뿐 아니라 VMWare, VirtualBox, Hyper-V 등의 가상 환경도 정식 등록해서 사용
- 이것으로 NIC 제조사 확인 가능
- U/L이 1이면 자체 발급
- 도커등 일부 가상환경
- 사용자/관리자가 직접 설정하는 경우
- 해당 네트워크 내에서만 고유하면 되는 경우에 주로 사용
- 하위 24비트
- 각 벤더가 NIC에 할당하는 시리얼 코드
- UAA(Universally Administered Address)라고 한다.
IP 주소
OS에서 설정하는 주소. 네트워크 계층(L3)에서 동작한다. 3장에서 더 자세히 설명
이더넷
인터페이스가 MAC주소를 처리할때는 8비트씩 묶에서 뒤에서 앞으로 처리한다. 따라서 I/G 비트가 제일 먼저, 그 다음 U/L 비트 순으로 처리된다.
과거에는 MAC 주소가 고유하게 여겨졌으나 최근에는 가상화 환경등으로 인해 고유하다고 보장 할 수 없다.
같은 LAN에 MAC 주소가 중복되는 단말이 있으면 통신이 불안정해지는 문제가 있을 수 있다.
이더넷 프레임
이더넷으로 캡슐화된 패킷
이더넷2 표준, IEEE802.3 표준 두 가지가 존재
그러나 이더넷2가 널리 쓰이며 실질적인 표준역할
IEEE802.3 표준은 이더넷2에 몇가지 변경 사항이 추가 되었으나 발표당시 이미 이더넷2가 널리 쓰이고 있어서 주목받지 못함
이더넷 프레임 포맷
구성요소
- 프리앰블
- 이더넷 프레임을 알리는 신호 역할
- 8바이트(64비트)의 특수한 비트 패턴
101010107개,101010111개로 구성- 물리 계층(L1)인 NIC 에서 처리하고 버려진다.
- 목적지/발신자 MAC 주소
- 타입
- 네트워크 계층(L3)에서 어떤 프로토콜을 사용하는지 표시하는 2바이트 ID
- 사용하는 프로토콜 버전에 따라 정해진 값을 사용
- IPv4 - 0x0800
- IPv6 - 0x86DD
- 이더넷 페이로드
- 네트워크 계층의 데이터 자체
- IP를 사용한다면 이더넷 페이로드를 IP패킷이라 할 수 있다.
- IP말고 다른건 뭐가있지?
- 패킷 교환 방식에서는 데이터를 통으로 전송하는게 아니라 적당한 크기로 쪼개서 전송한다.
- 기본은 46~1500바이트
- 46바이트 미만은 패딩을 추가하기도 한다. (꼭 그런건 아님)
- MTU(Maximum Transmission Unit)
- 이더넷 페이로드에 저장할 수 있는 데이터의 최대 크기
- 기본값은 1500바이트
- 이보다 크면 점보 프레임이라 부름
- FCS(Frame Check Sequence)
- 프레임의 무결성을 확인하기 위한 4바이트 필드
- 이더넷 프레임 구성요소의 체크섬을 사용한다.
- 물리 계층(L1)인 NIC 에서 오류 검사 후 제거하는게 기본 이지만 옵션을 주면 보존하기도 한다.
프리앰블, 목적지/발신자 MAC 주소, 타입을 합쳐서 이더넷 헤더라고 부름
FCS는 이더넷 트레일러라고 부름
ARP(주소 확인 프로토콜)
네트워크를 통해 데이터를 전송하려면 IP 패킷을 이더넷 프레임으로 캡슐화해서 케이블로 보내야 한다. 그러나 목적지의 IP 주소만있고 MAC주소를 모르는 상태에서는 이더넷 프레임을 만들 수 없다. 이 문제를 해결하기 위해 실제 데이터 통신에 앞서 목적지 IP로부터 목적지 MAC 주소를 구해야 한다. 이것을 ARP라고 한다.
ARP는 OSI 참조 모델에서 데이터 링크 계층(L2)과 네트워크 계층(L3) 중간에 위치한다. 실제로는 L2와 L3 그 중간 어딘가에 애매하게 위치해서 L2.5라 부르기도 한다. 이 책에서는 데이터 링크 계층(L2)로 취급한다. 이렇게 어정쩡한 이유는 IP주소는 알지만(L3) MAC 주소를 모른다는(L2) 문제를 해결하려다 보니 그렇게 되었다.
L2이면 MAC주소만 사용하여 라우터를 넘어가지 못하고 같은 브로드캐스트 도메인 내에서만 통신해야 한다. 뒤에서 다루겠지만 L3는 IP 주소를 사용하여 IP패킷을 캡슐화 해야 한다
그러나 APR은 IP를 사용하긴 하지만 APR프레임을 IP패킷으로 캡슐화하지 않고(즉, IP 헤더가 없고) 이더넷에 직접 탑재하는 어정쩡한 상태로 사용된다. 또한 L3이면 라우팅이 가능해야 하는데 라우터를 넘어가지 못하고 로컬 네트워크에서만 동작한다는 특성도 있다.
ARP 캐시
모든 통신의 시작은 ARP이다. 패킷을 보낼 MAC 주소를 알아야 통신을 할 수 있는데, IP주소를 사용해 MAC 주소를 확인하려면 ARP를 사용해야하기 때문이다.
ARP에는 치명적인 약점이 있는데, 브로드캐스트를 사용한다는 것이다. 같은 네트워크에 있는 모든 장비가 매번 불필요한 ARP 요청을 받게되면 비효율적이다. 그렇기 때문에 ARP를 통해 매칭된 IP와 MAC 주소를 캐싱하여 과도한 브로드캐스팅을 방지하고 ARP를 효율적으로 수행하게 한다.
반면 캐싱은 고유한 단점이 있으므로 캐싱 만료시간, 캐싱 테이블 크기등을 적절히 조정해야 한다.
ARP 프레임 형식
이더넷 헤더의 Type은 0x0806 으로 정의 되어 있다.
- 하드웨어 유형
- Ethernet, HDLC, Serial Line, IEEE 802 Networks 등이 있다.
- 거의 대부분 Ethernet(
0x0001)을 사용한다.
- 프로토콜 유형
- IPv4, IPv6, ARP, IPX 등등이 있다.
- ARP의 주 목적이 IPv4 주소 해석이기 때문에 IPv4(
0x0800)을 사용하는게 대부분이다. - IPv6는 프로토콜 유형이 지정되어 있긴 하나, 실제로는 NDP(Neighbor Discovery Protocol)을 사용하고 ARP를 사용하지 않는다.
- 하드웨어 주소 크기
- MAC 주소 길이를 나타낸다.
- 프로토콜 주소 크기
- IPv4를 사용 할 경우 4를 사용한다.
- opcode
- 여러 코드가 정의되어 있지만 실제로는 ARP Request(
1), ARP Reply(2)가 사용되는게 대부분이다.
- 여러 코드가 정의되어 있지만 실제로는 ARP Request(
- 발신자 MAC 주소, IP 주소
- ARP를 전송하는 단말기의 MAC 주소와 IP주소
- 목적지 MAC 주소, IP 주소
- ARP를 통해 주소를 확인하고자 하는 곳의 MAC 주소와 IP 주소
- 첫 요청과 같이 IP주소만 알고 MAC 주소는 모르는 상황이라면 MAC주소를
00:00:00:00:00:00으로 설정한다.
ARP 동작 방식
- 발신자 장비는 목적지 IP 주소를 확인 후 자신의 ARP 테이블을 검색한다.
- 정보가 없으면 2로 간다.
- 정보가 있으면 10으로 간다.
- ARP Request를 위해 ARP 필드를 조합한다.
- 목적지 MAC 주소는
00:00:00:00:00:00을 사용한다. - 같은 네트워크라면 목적지 IP는 이더넷 프레임의 목적지 IP 주소를 그대로 사용한다.
- 다른 네트워크에 있다면 해당 네트워크의 출구(Gateway)인 Next Hop을 목적지 IP로 사용한다.
- 최종 IP에 도달 할 때 까지 Next Hop을 따라서 이동한다.
- 목적지 MAC 주소는
- 이더넷 헤더를 조합한다. ARP Reuqest는 브로드 캐스트를 사용한다. 따라서 목적지 MAC 주소는 브로드 캐스트 주소인
ff:ff:ff:ff:ff:ff을 사용한다. - ARP Request는 브로드캐스트이므로 같은 네트워크의 모든 단말에 전달된다. 이 중 목적지 IP와 같은 장비가 이 요청을 수락한다.
- 요청을 수락한 장비는 ARP 필드에 포함된 발신자의 MAC 주소, IP주소를 자신의 ARP 테이블에 기록한다.
- ARP Reply를 위해 필드를 조합한다. 발신자는 자신이 되며 목적지는 Request의 발신자가 된다.
- 이더넷 헤더를 조합한다. ARP Reply는 요청자에게 다시 돌려주면 되기 때문에 유니캐스트를 사용한다.
- ARP Reply를 받은 발신자 장비는 필드에 기록된 발신자 MAC 주소, IP주소를 확인하여 목적지의 MAC 주소를 인식한다.
- ARP 테이블에 기록한다.
- 확인된 목적지 MAC 주소를 사용해 이더넷 헤더를 완성하고 데이터 통신을 시작한다.
L2 스위칭
L2 스위치의 포트와 어떤 장비를 랜케이블을 사용해 연결했다고 가정해보자. L2 스위치는 아직 이 포트에 연결된 장비의 MAC 주소를 알 수 없다.
이 포트에 연결된 장비가 다른 장비와 통신을 하기 위해 이더넷 프레임을 스위치에 전달하면 해당 프레임의 이더넷 헤더에 기록된 발신자 MAC 주소를 확인 후 포트 번호와 함께 기록하고 관리한다. MAC 주소와 포트 번호를 매칭하여 기록하는 테이블을 MAC 주소 테이블, 포워딩 데이터베이스등으로 부른다.
아직은 발신자의 MAC 주소와 포트 번호만 매핑 되었을 뿐 목적지 MAC 주소의 포트 번호는 알지 못하는 상태다. 스위치는 목적지 MAC 주소를 가진 장비가 연결된 포트를 찾기 위해 flooding을 수행한다. flooding 이란 스위치가 목적지 MAC 주소의 포트 번호를 모를 때, 들어온 포트를 제외한 모든 포트로 프레임을 전송하는 동작이다.
flooding을 통해 이더넷 프레임을 전달 받은 장비들은 목적지 MAC 주소를 확인하고 자신이 대상이 맞다면 적절한 응답을 하고 대상이 아니면 이더넷 프레임을 폐기한다. 응답 과정에서 스위치는 이더넷 헤더를 다시 확인하고 포트를 MAC 주소 테이블에 기록한다.
스위치가 MAC 주소 테이블에 수신자 MAC 주소의 포트 번호가 기록되어 있다면 자신에게 들어온 요청중 이더넷 헤더의 수신자 MAC 주소를 확인하고 이와 매핑된 포트에 연결된 장비에 이더넷 프레임을 전달한다. 이것을 L2 스위칭이라 한다.
MAC 주소 테이블 사용과 flooding 처리 절차
cl1과 cl2는 APR이 완료되어 MAC 주소에 해당하는 IP는 이미 알고 있는 상태에서 ping 을 보내는 상황이다. sw1의 MAC 주소 테이블은 비어있다고 가정한다.
- cl1은 cl2에 대한 이더넷 프레임을 만들어 LAN 케이블로 전송
- 발신자 MAC 주소는 cl1
- 수신자 MAC 주소는 cl2
- sw1은 cl1이 보내온 이더넷 프레임을 분석하고 발신자 MAC 주소와 이 이더넷 프레임을 전송 받은 포트 번호를 MAC 주소 테이블에 기록한다.
- sw1은 cl2가 어떤 포트에 있는지 알지 못한다. 따라서 cl1이 보낸 이더넷 프레임 복사본을 cl1이 연결된 인터페이스를 제외한 다른 모든 인터페이스로 전송한다. 이것이 flooding 이다.
- cl2는 cl1에 대한 응답을 이더넷 프레임으로 만들어 LAN 케이블로 전송한다.
- cl3, rt1등도 복사된 이더넷 프레임을 전송 받지만 목적지 MAC 주소가 자신이 아니므로 폐기한다.
- sw1을 cl2가 보내온 응답에 있는 이더넷 프레임을 분석하고 발신자 MAC 주소와 이 이더넷 프레임을 전송 받은 포트 번호를 MAC 주소 테이블에 기록한다.
- cl1, cl2의 포트 번호를 알고 있기 때문에 이제는 flooding은 하지 않고 직접 스위칭 한다.
MAC 주소 중복에 대하여
과거에 MAC주소는 모든 장비가 고유하게 부여받는 번호로 여겨졌다. 그러나 최근에는 MAC 주소는 고유하지 않으며 심지어 같은 LAN에 있어도 주소가 중복되지 않는다는 보장이 없다. 만약 스위치에 연결된 장비 중 MAC 주소가 중복되는 장비가 있다면 스위치는 요청이 들어오는 포트에 따라서 MAC 주소 테이블의 포트 번호를 계속 바꾸게 될 것이다. 이렇게 되면 통신이 불안정해지게 된다.
VLAN(Virtual LAN)
하나의 L2 스위치를 여러 개의 가상 L2 스위치로 분할하는 기술. VLAN 형태(Access, Trunk)에 따라서 IEEE802.1q 태그를 사용하거나 사용하지 말아야 하는데, 스위치는 송수신되는 포트의 형태에 맞게 태그를 추가하거나 제거하는 역할을 맡는다.
포트 VLAN, Access Port
VLAN ID라는 식별자를 포트에 할당한다. VLAN ID가 같은 포트 끼리는 같은 스위치로 취급되고 VLAN ID가 다르면 다른 스위치로 취급된다.
물리 포트에 직접 할당되기 때문에 포트당 하나의 VLAN ID만 설정 가능하다. 그렇기 때문에 스위치에서만 지정면 되고 포트에 연결된 NIC에서는 특별히 설정할 것은 없다.
스위치는 요청이 들어온 포트에 할당된 VLAN ID를 통해서 어떤 VLAN을 사용할 것인지 결정한다.
브로드캐스팅, 플러딩은 VLAN ID가 같은 포트 끼리만 전송한다.
프레임에 VLAN 태그(IEEE802.1q)를 붙이지 않고(untagged) 전송한다.
태그 VLAN, Tagged VLAN, Trunk Port
이더넷 프레임에 VLAN 태그(IEEE802.1q)를 붙여서(tagged) 어느 VLAN인지 식별한다. IEEE802.1q로 표준화 되어있다. 하나의 포트에 여러 태그를 붙여서 사용 할 수 있다.
태그 VLAN을 사용하기 위해서는 스위치 뿐만 아니라 포트에 연결된 NIC에도 VLAN 설정이 필요하다. 만약 하나의 포트가 여러개의 VLAN을 사용한다면 NIC는 VLAN 하나당 서브 인터페이스를 생성하고 각각의 인터페이스별로 MAC 주소, IP주소를 부여해야 한다.
VLAN 태그 구성은 다음과 같다.
- TPID(Tag Protocol IDentifier)
- PCP(Priority Code Point)
- CFI(Canonical Format Indicator)
- VID(VLAN IDentifier)
이러한 VLAN 태그를 이더넷 프레임의 발신자 MAC 주소와 유형 사이에 끼워 넣는다.
네이티브 VLAN
태그 VLAN 사용시 태그 없이 전송되는 VLAN. 과거에는 802.1q 태그를 처리하지 못하는 장비들이 많았기 때문에 호환성 문제를 해결하기 위해 도입되었다. 만약 스위치가 VLAN 태그가 없는 이더넷 프레임을 받았을때 일종의 기본값으로 사용할 VLAN 태그가 하나 필요한데, 이러한 기본값 VLAN 태그를 네이티브 VLAN이라고 한다.
네이티브 VLAN의 기본값은 VLAN 1인데, 보안을 위해서는 사용하지 않는 VLAN을 지정하는 것을 권장한다.
ovs의 vlan_mode와 tag에 대하여
ovs의 port에 설정하는 tag는 vlan_mode에 따라서 의미가 달라진다.
- vlan_mode=access
- Access VLAN ID로 동작
- vlan_mode=trunk
- tag를 사용하지 않음
- vlan_mode=native-untagged
- Native VLAN ID로 동작
- untagged 패킷을 tag에 지정된 VLAN으로 전달
- 해당 VLAN ID에서 패킷이 나갈때도 untagged 유지
- Native VLAN ID로 동작
- vlan_mode=native-tagged
- Native VLAN ID로 동작
- untagged 패킷을 tag에 지정된 VLAN으로 전달
- 해당 VLAN ID에서 패킷이 나갈때는 tag를 추가 (native-untagged와 차이점)
- Native VLAN ID로 동작
vlan_mode가 native-* 라면 마치 태그 VLAN이면서 네이티브 VLAN으로 지정된 것 처럼 동작한다는 의미