Network Fundamentals — Hands-on in a Linux VM
See ARP as Frames
한국어 원문으로 표시합니다.
이 실습은 VM 에서 돕니다
네트워크 네임스페이스 둘을 만들어 호스트 두 대로 씁니다. veth 한 쌍이 둘을 잇는 케이블입니다. 전부 VM 한 대 안이지만 커널 입장에서는 진짜 두 대입니다.
목표
IP 주소를 MAC 주소로 바꾸는 ARP 를 프레임 단위로 잡아 보고, 이웃 테이블을 읽고, 정적 항목을 넣어 틀린 MAC 이 통신을 어떻게 죽이는지 확인합니다.
왜 중요한가
같은 서브넷 안의 통신은 IP 가 아니라 MAC 으로 갑니다. IP 는 "누구에게" 를 말하고, 실제 프레임은 MAC 을 보고 배달됩니다. 그 둘을 잇는 것이 ARP 이고, 그 결과가 이웃 테이블(ARP 캐시)입니다. 그래서 IP 설정이 다 맞는데 통신이 안 되면 이웃 테이블부터 봅니다 — 낡은 항목, 중복 IP, 잘못된 정적 항목이 거기 있습니다. 클라우드와 쿠버네티스가 ARP 를 감추고 있어도 바닥은 같습니다.
단계
- 네임스페이스
alice와bob을 만드세요. - veth 쌍
va·vb를 만들어va는alice에,vb는bob에 넣으세요. alice의va에10.10.0.1/24,bob의vb에10.10.0.2/24를 붙이고lo까지 UP 해서alice에서bob으로 ping 이 되게 하세요.- ping 뒤
alice의 이웃 테이블(ip -n alice neigh)을/root/arp/neigh.txt에 저장하세요.bob의 MAC 이 보여야 합니다. alice의 이웃 테이블을 비우고tcpdump로va의 ARP 를 잡으면서arping을 보내, 요청과 응답 프레임을/root/arp/capture.txt에 저장하세요.alice에bob의 MAC 을 정적(permanent) 이웃 항목으로 넣으세요.- 정적 항목을 틀린 MAC 으로 바꿔 ping 이 죽는 것을
/root/arp/broken.txt에 남기고, 올바른 MAC 의 정적 항목으로 되돌리세요. /root/arp/report.md에bob_mac=한 줄과 함께, ARP 요청이 왜 브로드캐스트인지와 틀린 정적 항목이 왜 IP 층에서는 보이지 않는지를 적으세요.
참고
- 네임스페이스 안에서 명령:
ip netns exec alice <명령>, 또는 ip 명령만이면ip -n alice .... ip link add va type veth peer name vb가 케이블 한 쌍을 만듭니다.ip link set va netns alice로 옮깁니다.- 이웃 테이블:
ip -n alice neigh. 비우기:ip -n alice neigh flush all. 정적:ip -n alice neigh replace 10.10.0.2 lladdr <MAC> dev va nud permanent. - 캡처는
ip netns exec alice timeout 6 tcpdump -i va -nn -l arp > 파일 2>&1 &처럼 백그라운드로 걸어 두고 arping 을 보낸 뒤 기다립니다. - 흔한 실수:
lo를 안 올리는 것. 네임스페이스의 lo 는 기본이 DOWN 입니다.
호스트 두 대
네임스페이스 alice 와 bob 을 만드세요.
ip netns add alice 처럼 만듭니다. ip netns list 로 확인하세요. 네임스페이스 하나가 독립된 네트워크 스택 — 인터페이스·주소·라우팅·이웃 테이블 — 한 벌입니다.
케이블 잇기
veth 쌍 va·vb 를 만들어 va 는 alice 에, vb 는 bob 에 넣으세요.
ip link add va type veth peer name vb 로 쌍을 만들고 ip link set va netns alice, ip link set vb netns bob 으로 각각 옮깁니다. 옮기고 나면 루트 네임스페이스에서는 보이지 않습니다.
주소를 붙여 ping
alice 의 va 에 10.10.0.1/24, bob 의 vb 에 10.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 neigh 의 lladdr 뒤가 MAC, 마지막이 상태(REACHABLE·STALE 등)입니다. bob 의 MAC 은 ip -n bob link show vb 로 대조하세요.
ARP 를 프레임으로
alice 의 이웃 테이블을 비우고 tcpdump 로 va 의 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-has 와 Reply … is-at 두 줄이 있어야 합니다.
정적 이웃 항목
alice 에 bob 의 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.2 와 ping -c 1 -W 1 결과(100% packet loss)를 한 파일에 저장합니다. ping 통계만으로는 케이블이 빠진 것과 구별되지 않아서, 어떤 MAC 을 박았는지가 함께 있어야 합니다. 끝나면 6단계처럼 진짜 MAC 으로 다시 replace 하세요 — 채점기가 되돌렸는지도 봅니다.
무엇을 배웠나
/root/arp/report.md 에 bob_mac= 한 줄과 함께, ARP 요청이 왜 브로드캐스트인지와 틀린 정적 항목이 왜 IP 층에서는 보이지 않는지를 적으세요.
bob_mac 은 ip -n bob link show vb 의 값입니다. 브로드캐스트인 이유는 상대의 MAC 을 모르는 상태에서 묻기 때문이고, IP 층에서 안 보이는 이유는 버려지는 곳이 상대 NIC 이라 아무 오류도 되돌아오지 않기 때문입니다.