LabHub
배우기 러닝패스 코스

Network Fundamentals — Hands-on in a Linux VM

Build a Router from Three Namespaces

LabHub 에서 이어서 보기

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

이 실습은 VM 에서 돕니다

네임스페이스 셋 — 호스트 h1, 라우터 r1, 호스트 h2 — 을 veth 두 쌍으로 잇습니다. 서브넷이 다른 두 호스트가 라우터를 거쳐 통신하는 가장 작은 네트워크입니다.

목표

라우팅 테이블을 읽고, 기본 경로와 정적 경로를 넣고, 리눅스 한 대를 라우터로 만드는 스위치(ip_forward)가 무엇을 바꾸는지 확인합니다.

왜 중요한가

"어떤 대역만 안 된다" 는 신고는 거의 언제나 라우팅입니다. 그런데 라우팅은 양쪽이 다 맞아야 됩니다 — 가는 길이 있어도 돌아오는 길이 없으면 똑같이 안 되고, 증상은 구별되지 않습니다. 그리고 리눅스는 기본으로 남의 패킷을 넘겨 주지 않습니다. ip_forward 한 줄이 호스트를 라우터로 바꾸는데, 쿠버네티스 노드·도커 호스트·VPN 서버가 전부 이 한 줄 위에 서 있습니다.

단계

  1. 네임스페이스 h1·r1·h2 를 만들고 veth 쌍 h1rrh1, h2rrh2 를 만들어 h1rh1, h2rh2, rh1·rh2r1 에 넣으세요.
  2. h1r10.20.1.10/24, rh110.20.1.1/24, rh210.20.2.1/24, h2r10.20.2.10/24 를 붙이고 모든 인터페이스와 lo 를 UP 하세요.
  3. h1 에서 h2(10.20.2.10) 로 ping 해 실패 메시지를 /root/route/unreach.txt 에 저장하세요.
  4. h1h2 에 각자의 라우터 주소를 기본 경로로 넣으세요.
  5. r1net.ipv4.ip_forward 를 1 로 켜서 h1h2 ping 이 되게 하세요.
  6. h1 에서 h2traceroute -n 한 결과를 /root/route/trace.txt 에 저장하세요.
  7. h2 에 더미 인터페이스 svc0 을 만들어 10.99.0.10/24 를 붙이고, r110.99.0.0/24 via 10.20.2.10 정적 경로를 넣어 h1 에서 10.99.0.10 이 닿게 하세요.
  8. /root/route/report.mdhops= 한 줄, h1 에서 ip route get 10.99.0.10 결과 한 줄, 그리고 ip_forward 가 없으면 왜 안 되는지를 적으세요.

참고

셋을 잇는다

네임스페이스 h1·r1·h2 를 만들고 veth 쌍 h1rrh1, h2rrh2 를 만들어 h1rh1, h2rh2, rh1·rh2r1 에 넣으세요.

ip link add h1r type veth peer name rh1 처럼 쌍을 두 개 만들고 ip link set <이름> netns <ns> 로 옮깁니다. 라우터는 인터페이스가 둘이라는 것이 핵심입니다 — 다리 하나가 서브넷 하나에 걸칩니다.

주소를 붙인다

h1r10.20.1.10/24, rh110.20.1.1/24, rh210.20.2.1/24, h2r10.20.2.10/24 를 붙이고 모든 인터페이스와 lo 를 UP 하세요.

ip -n h1 addr add 10.20.1.10/24 dev h1r 식으로 넷. 그 뒤 여섯 인터페이스(veth 넷 + lo 셋)를 link set … up. 확인은 ip netns exec h1 ping -c1 10.20.1.1 — 같은 서브넷인 라우터까지는 이미 닿아야 합니다.

길이 없으면

h1 에서 h2(10.20.2.10) 로 ping 해 실패 메시지를 /root/route/unreach.txt 에 저장하세요.

ip netns exec h1 ping -c 1 -W 1 10.20.2.10 > /root/route/unreach.txt 2>&1. 오류는 표준 오류로 나오니 2>&1 을 잊지 마세요. 아직 기본 경로가 없어 Network is unreachable 이어야 합니다.

기본 경로

h1h2 에 각자의 라우터 주소를 기본 경로로 넣으세요.

ip -n h1 route add default via 10.20.1.1, ip -n h2 route add default via 10.20.2.1. 둘 다 넣어야 합니다 — 한쪽만 넣으면 요청은 가는데 응답이 돌아올 길이 없습니다.

라우터로 만든다

r1net.ipv4.ip_forward 를 1 로 켜서 h1h2 ping 이 되게 하세요.

ip netns exec r1 sysctl -w net.ipv4.ip_forward=1. 이 값이 0 이면 커널은 자기 주소가 아닌 패킷을 조용히 버립니다. 네임스페이스마다 별개의 값입니다.

경로를 따라가 본다

h1 에서 h2traceroute -n 한 결과를 /root/route/trace.txt 에 저장하세요.

ip netns exec h1 traceroute -n -w 1 10.20.2.10 > /root/route/trace.txt. 1홉이 라우터(10.20.1.1), 2홉이 h2 여야 합니다. -n 은 이름 해석을 끄는 옵션입니다.

정적 경로

h2 에 더미 인터페이스 svc0 을 만들어 10.99.0.10/24 를 붙이고, r110.99.0.0/24 via 10.20.2.10 정적 경로를 넣어 h1 에서 10.99.0.10 이 닿게 하세요.

h2 쪽: ip -n h2 link add svc0 type dummy, addr add 10.99.0.10/24 dev svc0, link set svc0 up. r1 쪽: ip -n r1 route add 10.99.0.0/24 via 10.20.2.10. h1 은 기본 경로로 r1 에 맡기므로 손댈 것이 없습니다.

무엇을 배웠나

/root/route/report.mdhops= 한 줄, h1 에서 ip route get 10.99.0.10 결과 한 줄, 그리고 ip_forward 가 없으면 왜 안 되는지를 적으세요.

hops 는 6단계 traceroute 의 홉 수입니다. ip netns exec h1 ip route get 10.99.0.10 의 첫 줄을 그대로 붙이세요(via 10.20.1.1 이 보입니다). 설명에는 ip_forward 라는 낱말이 들어가야 합니다.