LabHub
배우기 러닝패스 코스

ネットワーク基礎 — Linux VM で手を動かす

ARP をフレームで見る

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

이 실습은 VM 에서 돕니다

네트워크 네임스페이스 둘을 만들어 호스트 두 대로 씁니다. veth 한 쌍이 둘을 잇는 케이블입니다. 전부 VM 한 대 안이지만 커널 입장에서는 진짜 두 대입니다.

목표

IP 주소를 MAC 주소로 바꾸는 ARP 를 프레임 단위로 잡아 보고, 이웃 테이블을 읽고, 정적 항목을 넣어 틀린 MAC 이 통신을 어떻게 죽이는지 확인합니다.

왜 중요한가

같은 서브넷 안의 통신은 IP 가 아니라 MAC 으로 갑니다. IP 는 "누구에게" 를 말하고, 실제 프레임은 MAC 을 보고 배달됩니다. 그 둘을 잇는 것이 ARP 이고, 그 결과가 이웃 테이블(ARP 캐시)입니다. 그래서 IP 설정이 다 맞는데 통신이 안 되면 이웃 테이블부터 봅니다 — 낡은 항목, 중복 IP, 잘못된 정적 항목이 거기 있습니다. 클라우드와 쿠버네티스가 ARP 를 감추고 있어도 바닥은 같습니다.

단계

  1. 네임스페이스 alicebob 을 만드세요.
  2. veth 쌍 va·vb 를 만들어 vaalice 에, vbbob 에 넣으세요.
  3. aliceva10.10.0.1/24, bobvb10.10.0.2/24 를 붙이고 lo 까지 UP 해서 alice 에서 bob 으로 ping 이 되게 하세요.
  4. ping 뒤 alice 의 이웃 테이블(ip -n alice neigh)을 /root/arp/neigh.txt 에 저장하세요. bob 의 MAC 이 보여야 합니다.
  5. alice 의 이웃 테이블을 비우고 tcpdumpva 의 ARP 를 잡으면서 arping 을 보내, 요청과 응답 프레임을 /root/arp/capture.txt 에 저장하세요.
  6. alicebob 의 MAC 을 정적(permanent) 이웃 항목으로 넣으세요.
  7. 정적 항목을 틀린 MAC 으로 바꿔 ping 이 죽는 것을 /root/arp/broken.txt 에 남기고, 올바른 MAC 의 정적 항목으로 되돌리세요.
  8. /root/arp/report.mdbob_mac= 한 줄과 함께, ARP 요청이 왜 브로드캐스트인지와 틀린 정적 항목이 왜 IP 층에서는 보이지 않는지를 적으세요.

참고

호스트 두 대

네임스페이스 alicebob 을 만드세요.

ip netns add alice 처럼 만듭니다. ip netns list 로 확인하세요. 네임스페이스 하나가 독립된 네트워크 스택 — 인터페이스·주소·라우팅·이웃 테이블 — 한 벌입니다.

케이블 잇기

veth 쌍 va·vb 를 만들어 vaalice 에, vbbob 에 넣으세요.

ip link add va type veth peer name vb 로 쌍을 만들고 ip link set va netns alice, ip link set vb netns bob 으로 각각 옮깁니다. 옮기고 나면 루트 네임스페이스에서는 보이지 않습니다.

주소를 붙여 ping

aliceva10.10.0.1/24, bobvb10.10.0.2/24 를 붙이고 lo 까지 UP 해서 alice 에서 bob 으로 ping 이 되게 하세요.

ip -n alice addr add 10.10.0.1/24 dev va, ip -n alice link set va up, ip -n alice link set lo up — bob 도 같은 식으로. 그 뒤 ip netns exec alice ping -c 2 10.10.0.2.

이웃 테이블 읽기

ping 뒤 alice 의 이웃 테이블(ip -n alice neigh)을 /root/arp/neigh.txt 에 저장하세요. bob 의 MAC 이 보여야 합니다.

ping 이 한 번 오가면 커널이 ARP 결과를 이웃 테이블에 넣습니다. ip -n alice neighlladdr 뒤가 MAC, 마지막이 상태(REACHABLE·STALE 등)입니다. bob 의 MAC 은 ip -n bob link show vb 로 대조하세요.

ARP 를 프레임으로

alice 의 이웃 테이블을 비우고 tcpdumpva 의 ARP 를 잡으면서 arping 을 보내, 요청과 응답 프레임을 /root/arp/capture.txt 에 저장하세요.

캡처를 먼저 백그라운드로 걸어 둡니다: ip netns exec alice timeout 6 tcpdump -i va -nn -l arp > /root/arp/capture.txt 2>&1 &. 그 뒤 ip -n alice neigh flush all 하고 ip netns exec alice arping -I va -c 1 10.10.0.2. 파일에 Request who-hasReply … is-at 두 줄이 있어야 합니다.

정적 이웃 항목

alicebob 의 MAC 을 정적(permanent) 이웃 항목으로 넣으세요.

ip -n alice neigh replace 10.10.0.2 lladdr <bob의 MAC> dev va nud permanent. ip -n alice neigh 에 PERMANENT 로 보여야 합니다. 정적 항목은 시간이 지나도 사라지지 않고 ARP 도 보내지 않습니다.

틀린 MAC 이면

정적 항목을 틀린 MAC 으로 바꾸고, 그때의 이웃 항목과 죽은 ping 을 /root/arp/broken.txt 에 함께 남긴 뒤, 올바른 MAC 의 정적 항목으로 되돌리세요.

lladdr 02:00:00:00:00:01 같은 가짜 MAC 으로 neigh replace … nud permanent 한 뒤, ip -n alice neigh show 10.10.0.2ping -c 1 -W 1 결과(100% packet loss)를 한 파일에 저장합니다. ping 통계만으로는 케이블이 빠진 것과 구별되지 않아서, 어떤 MAC 을 박았는지가 함께 있어야 합니다. 끝나면 6단계처럼 진짜 MAC 으로 다시 replace 하세요 — 채점기가 되돌렸는지도 봅니다.

무엇을 배웠나

/root/arp/report.mdbob_mac= 한 줄과 함께, ARP 요청이 왜 브로드캐스트인지와 틀린 정적 항목이 왜 IP 층에서는 보이지 않는지를 적으세요.

bob_mac 은 ip -n bob link show vb 의 값입니다. 브로드캐스트인 이유는 상대의 MAC 을 모르는 상태에서 묻기 때문이고, IP 층에서 안 보이는 이유는 버려지는 곳이 상대 NIC 이라 아무 오류도 되돌아오지 않기 때문입니다.