ネームスペース3つでルーターを作る
한국어 원문으로 표시합니다.
이 실습은 VM 에서 돕니다
네임스페이스 셋 — 호스트 h1, 라우터 r1, 호스트 h2 — 을 veth 두 쌍으로
잇습니다. 서브넷이 다른 두 호스트가 라우터를 거쳐 통신하는 가장 작은 네트워크입니다.
목표
라우팅 테이블을 읽고, 기본 경로와 정적 경로를 넣고, 리눅스 한 대를 라우터로
만드는 스위치(ip_forward)가 무엇을 바꾸는지 확인합니다.
왜 중요한가
"어떤 대역만 안 된다" 는 신고는 거의 언제나 라우팅입니다. 그런데 라우팅은
양쪽이 다 맞아야 됩니다 — 가는 길이 있어도 돌아오는 길이 없으면 똑같이
안 되고, 증상은 구별되지 않습니다. 그리고 리눅스는 기본으로 남의 패킷을
넘겨 주지 않습니다. ip_forward 한 줄이 호스트를 라우터로 바꾸는데, 쿠버네티스
노드·도커 호스트·VPN 서버가 전부 이 한 줄 위에 서 있습니다.
단계
- 네임스페이스
h1·r1·h2를 만들고 veth 쌍h1r↔rh1,h2r↔rh2를 만들어h1r은h1,h2r은h2,rh1·rh2는r1에 넣으세요. h1r에10.20.1.10/24,rh1에10.20.1.1/24,rh2에10.20.2.1/24,h2r에10.20.2.10/24를 붙이고 모든 인터페이스와lo를 UP 하세요.h1에서h2(10.20.2.10) 로 ping 해 실패 메시지를/root/route/unreach.txt에 저장하세요.h1과h2에 각자의 라우터 주소를 기본 경로로 넣으세요.r1의net.ipv4.ip_forward를 1 로 켜서h1→h2ping 이 되게 하세요.h1에서h2로traceroute -n한 결과를/root/route/trace.txt에 저장하세요.h2에 더미 인터페이스svc0을 만들어10.99.0.10/24를 붙이고,r1에10.99.0.0/24 via 10.20.2.10정적 경로를 넣어h1에서10.99.0.10이 닿게 하세요./root/route/report.md에hops=한 줄,h1에서ip route get 10.99.0.10결과 한 줄, 그리고ip_forward가 없으면 왜 안 되는지를 적으세요.
참고
- 인터페이스 넷을 만드니 명령이 많습니다. 셸 for 문을 쓰세요.
ip -n h1 route add default via 10.20.1.1. 게이트웨이는 반드시 h1 과 같은 서브넷이어야 합니다.ip netns exec r1 sysctl -w net.ipv4.ip_forward=1. 네임스페이스마다 값이 따로입니다.ip route get <주소>는 테이블을 눈으로 읽는 대신 커널에게 "이 목적지는 어디로 나가나" 를 직접 묻습니다.- 흔한 실수: 4단계에서 h2 의 기본 경로를 빠뜨리는 것. 가는 길은 있는데 답이 못 돌아옵니다.
셋을 잇는다
네임스페이스 h1·r1·h2 를 만들고 veth 쌍 h1r↔rh1, h2r↔rh2 를 만들어 h1r 은 h1, h2r 은 h2, rh1·rh2 는 r1 에 넣으세요.
ip link add h1r type veth peer name rh1 처럼 쌍을 두 개 만들고 ip link set <이름> netns <ns> 로 옮깁니다. 라우터는 인터페이스가 둘이라는 것이 핵심입니다 — 다리 하나가 서브넷 하나에 걸칩니다.
주소를 붙인다
h1r 에 10.20.1.10/24, rh1 에 10.20.1.1/24, rh2 에 10.20.2.1/24, h2r 에 10.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 이어야 합니다.
기본 경로
h1 과 h2 에 각자의 라우터 주소를 기본 경로로 넣으세요.
ip -n h1 route add default via 10.20.1.1, ip -n h2 route add default via 10.20.2.1. 둘 다 넣어야 합니다 — 한쪽만 넣으면 요청은 가는데 응답이 돌아올 길이 없습니다.
라우터로 만든다
r1 의 net.ipv4.ip_forward 를 1 로 켜서 h1→h2 ping 이 되게 하세요.
ip netns exec r1 sysctl -w net.ipv4.ip_forward=1. 이 값이 0 이면 커널은 자기 주소가 아닌 패킷을 조용히 버립니다. 네임스페이스마다 별개의 값입니다.
경로를 따라가 본다
h1 에서 h2 로 traceroute -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 를 붙이고, r1 에 10.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.md 에 hops= 한 줄, 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 라는 낱말이 들어가야 합니다.