본문 바로가기

네트워크/네트워크 용어 (DICT)

네트워크와 관련된 넓고 얕은 지식 (ARP 편)

반응형

찾고싶은 내용이 있으시면 Ctrl+F로 찾아보시는 걸 추천해요.

틀린 내용이 있다면 알려주시면 감사해요.

 

Data Link Layer

한 호스트에서 다른 호스트로 데이터를 보내는 것이 목표. 물리계층에서 올라오거나 상위 레이어에서 내려온 패킷을 raw bit로 풀어주거나 frame으로 묶어준다.

Ethernet

원래는 Ethernet은 회선을 통해서 어떻게 데이터를 주고 받을지에 대한 방법 중 하나로 다양한 기술들 중 하나이다. 토큰링, FFDI 등 다른 기술들도 있으나 현재로서는 Ethernet이 사실상 표준이라고 해도 무방할 만큼 점유율이 커서 Data Link layer를 Ethernet 계층이라고 부르는 사람도 있다.

Ethernet에서는 MAC Address를 보고 데이터를 보낸다. MAC Address는 호스트의 NIC 즉, 네트워크 인터페이스 카드의 고유한 번호를 의미하며, IP 주소가 Network 계층의 식별자인 것 처럼 Data Link Layer 에서는 MAC Address를 보고 송/수신지를 식별한다. 

수신지에서 데이터를 받았을 때, 호스트는 다음과 같은 요소들을 확인한다.

  1. Data Link Header에 적힌 목적지 주소가 내 주소와 일치하는지
  2. 목적지 주소가 전부 1로 셋팅되어 있는지 (ff:ff:ff:ff:ff:ff)
  3. 목적지 주소가 Multicast 주소라면, 내 주소가 Multicast 그룹에 속해있는지
  4. 나의 네트워크 인터페이스 카드 (랜카드) 가 Promiscuous Mode 인지

위와 같은 경우에만 호스트는 상위 레이어로 데이터를 통과 시켜준다.

Data Link Header?

Data Link Layer의 헤더는 다음과 같이 매우 간단하다.

Ethernet Header라고도 한다. CRC는 Ethernet Trailer라고도 함

  1. Dest / Source Address : 말그대로 목적지 / 송신지의 MAC Address를 의미한다. 각 6byte 씩 총 12byte
  2. Type : 상위 레이어의 프로토콜을 의미한다. 보통 IP 프로토콜을 가리킨다. 2byte
  3. CRC : 데이터가 중간에 변조되었는지 확인할 수 있는 Checksum값. 4byte

 

MAC protocols

이번에 이야기할 것은 데이터를 주고받는 방법에 관한 것이다. 기본적으로 호스트는 하나의 인터페이스가 여러개의 패킷을 동시에 처리할 수 없다. 그래서 같은 네트워크에서는 동시에 데이터를 보낼 경우 이를 충돌 ( Collision )이 발생했다고 한다.

MAC protocol은 이러한 충돌을 다루는 기술로, 4가지 정도 있다.

  1. Slotted ALOHA
  2. CSMA
  3. CSMA/CD
  4. CDMA/CA

자주 언급되는 친구들을 적어보았다.

Slotted ALOHA

눈치게임

Slotted ALOHA (이하 aloha) 는 데이터를 보낼 수 있는 시간 단위 slot을 만들고 매 slot 마다 데이터를 보내도록 하는 방법이다. 기본적인 MAC protocol의 KEY는 충돌이 발생했을 때 어떻게 대처하느냐가 관건이지만, aloha는 같은 slot 안에서 충돌이 발생했을 때, 충돌 확률 (좀 복잡하다.. 생략)에 의거한 랜덤 시간을 기다린 후 오직 성공하기까지 반복해서 재전송을 한다. 자세한 원리는 여기서 매우 잘 설명해주셨다.

CSMA

CSMA는 충돌이 있을지 확인한다. 이것만 봐도 어느정도 성능이 개선되지 않을까 생각이 든다. CSMA에서 모든 호스트들은 idle (대기) 상태로 있다가 자신이 데이터를 보내야한다면, 현재 네트워크에서 데이터가 오가고 있는지 확인한다. 아무것도 없음을 확인하면, 랜덤한 시간 후에 호스트는 데이터를 전송한다.

충돌을 예방하는데! 무엇이 더 문제일까? 충돌이 안나게 누가 이야기하고 있는지 보고 난 뒤, 내가 할 말을 하는 상황에서 충돌이 날 수 있을까? 안난다면 굳이 2줄을 추가해가면서 글을 적지 않았을 것이다.(?)

충돌 나버렷

나는 처음에 그림이 조금 헷갈렸는데, 저 방사형 도형이 시작되는 지점 t0, t1에 집중해서 보면 된다. 충돌이 날 수 있는 상황은 이렇다. 

B : 어.. 아무도 이야기를 안하네. 내가 말해야지.  (t0)

B : (열심히 이야기 중) (t0 ~ t1 사이)

D : 어.. 아무도 이야기를 안하네. 내가 말해야지. (t1)

이미 충돌이 발생했지만, B와 D 모두 송신 중이었기 때문에 감지하지 못하고 두 패킷은 모두 손실된다.

그러면 우리는 slot 방식을 사용해야 할까?

개인적인 생각으로는 위와 같은 상황에서의 충돌은 유선 환경 그것도 근거리 환경에서는 발생하는 비율이 적지 않을까 예상해본다. slotted aloha의 경우는 각 호스트의 clock도 sync를 맞춰야하고 (slot) CSMA에 비해서 충돌이 발생할 수 있는 상황이 보편적(?)이므로 CSMA가 더 좋은 성능과 정확성을 보여줄 것 같다.

CSMA/CD

CSMA 에서 Collision Detection이 가능한 구조. 호스트가 송신 도중에 다른 데이터가 들어오면 이를 감지할 수 있다. 이를 감지하고 특정 시간 대기한 후 재전송한다. 이러한 일련의 과정은 전송이 성공할 때까지 반복된다. 대신 이를 위해서 Minimum Frame Size와 Maximum Distance 2가지를 규정해야하는 제약이 있다.

 

ARP

나름 타이틀에 ARP편이라고 했는데, 이제서야 등장한다. Address Resolution Protocol 이라고 한다. ARP는 IP를 가지고 MAC 주소를 찾아내는데 사용하는 프로토콜이다. 지금까지 계속 이야기했던 Data Link Layer에 속하는 프로토콜이며 동작 방식은 이렇다.

와이어샤크에서의 ARP

ARP는 ARP Request와 Reply로 이루어져있는데, Request는 같은 LAN 환경에 모두 뿌리는 Broadcast로 Reply는 하나의 목적지를 갖는 Unicast로 보내진다. 회색 음영이 들어간 부분이 ARP Request이다. 

who has 192.168.0.1? Tell 192.168.0.5

나는 192.168.0.5인데, 192.168.0.1의 MAC 주소가 뭐냐?

라고 열심히 묻자,

192.168.0.1의 주소를 갖고 있는 친구가 친절하게 응답해준다.

192.168.0.1 is at 90 : 9f : 33 : 6e : 88 : 1c

192.168.0.1? MAC 주소는 90 : 9f : 33 : 6e : 88 : 1c 이거야.

이제 192.168.0.5는 192.168.0.1의 MAC 주소를 알고 패킷을 보낼 수 있다. 

ARP 프로토콜에서 Reply는 Request가 없어도 보낼 수 있다. 다른 호스트이지만, 원래 찾던 호스트인 척하고 보낼 수 있다는 의미. 이 내용은 마지막에 ARP Cache까지 다루고 마저 쓰는게 좋겠다.

다시 ARP의 개념으로 돌아와서, 모든 호스트 (라우터 등의 장비도 포함하여) 들은 ARP Table을 가지고 있다. 이 ARP Table에는 IP 주소와 MAC 주소가 한 쌍으로 1줄씩 들어가 있다.

이 ARP Table은 다른 호스트의 ARP Reply등에 의해서 Update된다. 다만 별도로 인증과정이 없고, Reply를 받게되면 바로 Update를 수행하니 외부 호스트에 의해서 내 패킷의 포워딩 경로가 좌지우지될 수 있는 상황이다. 일단은 그런 상황은 제외해놓고, 실질적으로 ARP가 어떻게 쓰이는지 예제를 보자.

arp -a
A는 어떻게 B에게 패킷을 보낼까?

  1. A는 B에게 패킷을 보내야한다. IP주소는 알고 있는데, Data Link Layer에서 상대방의 MAC 주소를 채울 수가 없다.
  2. A는 B의 MAC 주소를 알아내기 위해서 ARP Request를 보낸다. 
  3. 라우터 R의 인터페이스 111.111.111.110은 Request를 받고 자신의 MAC 주소(E6:E9:00:17:BB:4B)를 A에게 돌려준다.
  4. A는 받은 MAC 주소 (라우터 R의 인터페이스)를 채워서 패킷을 보낸다.
  5. 라우터 R은 A의 패킷에서 목적지 IP 주소 (B의 IP) 를 확인하고, 자신의 Forwarding Table을 참조하여 222.222.222.220 인터페이스로 패킷을 보내...기 전에
  6. 222.222.222.222의 MAC 주소가 뭐냐며 ARP Request를 오른쪽 네트워크 인터페이스로 뿌린다.
  7. B는 자신의 IP가 목적지로 적힌 ARP Request를 확인하고 자신의 MAC 주소를 채워서 Reply를 보내준다.
  8. 라우터 R은 B의 MAC 주소를 받아적어 패킷을 완성시켜 보낸다.

기본적인 ARP 흐름은 여기까지.. 추가적으로 ARP가 특별한 상황에서 쓰이는 경우가 있다. ARP는 IP주소와 매칭되는 MAC 주소를 얻기 위함인데, 이런 ARP 사용방법도 있다.

Gratuitous ARP

Gratuitous ARP의 Gratuitous는 우리말로 쓸데없는, 쓸모없는 등의 의미이다. 어느정도 의역해보면 의미없는 ARP라는 것이고, 이러한 이름이 붙은 이유는 원래 ARP의 목적에서 벗어나기 때문이 아닐까 싶다. 어쨌든 어떤 ARP냐면,

호스트 A는 IP 주소가 1.2.3.4이고, MAC 주소는 a:a:a:b:b:b 이다. 이 상황에서 Gratuitous ARP Request는 

ARP Packet은 별도의 헤더가 없고, Data Link Header의 Payload로서 들어간다.

아래 보이는 4개의 항목 중

송신지 MAC / 송신지 IP / 목적지 IP

에 모두 자신의 IP와 MAC을 넣는다. Gratuitous 버전에 따라 다르지만 어쨌든, 한마디로 이렇게 물어보는 셈,

Who has 1.2.3.4? tell 1.2.3.4 ( 사실 와이어샤크에서는 Gratuitous packet이라고 명시된다. )

이게 무슨 의미를 갖고 있을까? 앞에서 설명했던 내용을 한 번 떠올려보면 된다. 호스트가 패킷을 보내는데 중요한 기준이 되는 ARP Table은 다른 호스트 들의 ARP로 인해서 업데이트 된다. 즉, 내 IP 주소를 갖는 호스트의 MAC 주소는 뭘까? 이거지롱~ 하고 혼자 떠드는 관종마냥... 아니, 네트워크에 일종의 정보 전달을 하는 셈이다. 정리하자면 Gratuitous ARP의 용도는 이렇다.

  1. 동일 네트워크 내에 중복된 IP가 존재하는지 확인
  2. 자신의 MAC 주소가 변경될 경우 이를 알리기 위해서
  3. 이 외에도 이중화 라우터의 절체 상황 간 호스트들의 ARP 경로 수정을 위ㅎ...

자 그럼, 마지막은 ARP의 허점에 대해 알아보자.

Vulnerabilities of ARP

ARP는 다음과 같은 점때문에 취약하다.

  1. ARP는 Request, Reply에 대한 별도의 인증과정이 없어서 변조가 되어도 확인할 길이 없다.
  2. ARP는 Stateless이므로, Request에 상관없이 Reply를 받아도 정상적으로 작동한다.
  3. ARP 구현 특성상, Request나 Reply를 받는 모든 호스트들은 무조건 ARP Table을 수정하게된다.

이 취약점을 이용하는 공격은 잘 보면 모두 ARP Table을 노린다는 것. 그런데 ARP Table에는 IP와 MAC 필드를 제외한 또 하나의 필드가 있다. 바로 "유형"이라는 필드인데, 

각 엔트리가 어떻게 생성되었는지를 알 수 있다. "동적"의 경우 외부의 ARP를 통해서 생성된 (update된) 엔트리이고, "정적"의 경우는 호스트의 관리자가 수동으로 생성한 엔트리다. "정적"으로 생성된 엔트리의 경우 외부 ARP의 영향을 결코 받지 않는다. 한마디로 ARP의 취약점을 막을 수 있다는 것.

ARP Spoofing 이라고 불리는, 위의 엔트리를 공격하는 기법의 경우는 통상 같은 IP 주소에 대해서 2개의 MAC 주소인 중복된 엔트리가 나타나는 증상을 보인다. 하지만 관리자가 "정적"으로 엔트리를 생성하는 경우 이는 무용지물이 된다.

반응형