ルーター・DNS・ファイアウォール・NAT を備えた小さなネットワーク
한국어 원문으로 표시합니다.
이 실습은 VM 에서 돕니다
앞의 아홉 실습을 하나로 모읍니다. 네임스페이스 home(사용자 쪽)과 dmz(서버 쪽)
사이에 VM 자신이 라우터로 서고, 그 라우터가 DNS 서버·방화벽·NAT 까지
맡습니다. 집 공유기 한 대가 하는 일의 축소판입니다. 60분 실습이라 시간을
한 번 연장해야 할 수 있습니다 — 작업물은 VM 과 함께 사라지니 미리 알아 두세요.
목표
두 서브넷을 잇고, 이름으로 서버를 찾게 하고, 웹만 통과시키고, 사설망을 인터넷에 내보내고, 그 전부를 패킷으로 확인한 뒤 보고서로 남깁니다.
왜 중요한가
지금까지는 한 번에 한 층만 봤습니다. 실제 장애는 여러 층이 겹쳐 있습니다 — 이름은 풀리는데 방화벽이 막고, 방화벽은 열렸는데 돌아오는 경로가 없고. 한 네트워크를 처음부터 끝까지 세워 본 사람은 "안 된다" 를 들었을 때 어느 층부터 볼지 순서가 있습니다: 링크 → 주소 → 이웃 → 경로 → 이름 → 포트 → 방화벽 → 응답.
단계
- 네임스페이스
home·dmz와 vethhome0(home,10.40.1.10/24)↔r-home(루트,10.40.1.1/24),dmz0(dmz,10.40.2.10/24)↔r-dmz(루트,10.40.2.1/24)를 만들고, 두 네임스페이스의 기본 경로와 루트의ip_forward를 설정해home→dmzping 이 되게 하세요. /root/final/www/index.html을 만들고dmz안에10.40.2.10:80을 듣는 웹 서버를 띄워(로그는/root/final/http.log)home에서curl http://10.40.2.10/이 되게 하세요./etc/dnsmasq.d/lab.conf로 dnsmasq 가10.40.1.1에서 듣고web.lab.internal→10.40.2.10을 답하며 나머지는 상류로 넘기게 하고,/etc/netns/home/resolv.conf로home이 그 서버를 쓰게 하세요.home에서curl -si http://web.lab.internal/의 응답을/root/final/byname.txt에 저장하세요.- 루트에 테이블
inet labfw와forward훅 체인(정책drop)을 만들고,established,related와home→dmz의tcp dport 80만 허용해 웹은 되고 ping 은 안 되게 하세요. - 테이블
ip labnat에10.40.1.0/24의 마스커레이드를 넣고forward에home→uplink 의tcp dport { 80, 443 }을 허용해,home에서curl -sI http://archive.ubuntu.com/의 첫 줄을/root/final/internet.txt에 저장하세요. r-dmz에서 캡처하며home에서 웹을 한 번 더 받아,10.40.1.10이10.40.2.10.80으로 보낸 SYN 이 보이는 출력을/root/final/capture.txt에 저장하세요.- 전체 규칙을
/root/final/ruleset.nft에 저장하고,/root/final/report.md에home_ip=·dmz_ip=·dns=·ping_blocked=네 줄과 함께 "web.lab.internal 이 안 열린다" 는 신고를 받았을 때 어느 순서로 볼지를 적으세요.
참고
- 앞 실습의 명령을 그대로 조합합니다. 3·8번 실습의 힌트가 특히 유용합니다.
- dnsmasq 가 상류로 넘기게 하려면
no-resolv와 함께server=<상류주소>를 적습니다. 상류는resolvectl dns enp1s0. - 방화벽은 forward 체인입니다. VM 자신의 input 은 건드리지 마세요 — 채점 에이전트가 막힙니다.
nft add rule inet labfw forward iifname "r-home" oifname "r-dmz" tcp dport 80 accept.- 흔한 실수: 6단계에서 forward 에 uplink 쪽 허용을 빼먹는 것. NAT 규칙만으로는 forward 의 drop 을 못 넘습니다.
두 서브넷과 라우터
네임스페이스 home·dmz 와 veth home0(home, 10.40.1.10/24)↔r-home(루트, 10.40.1.1/24), dmz0(dmz, 10.40.2.10/24)↔r-dmz(루트, 10.40.2.1/24)를 만들고, 두 네임스페이스의 기본 경로와 루트의 ip_forward 를 설정해 home→dmz ping 이 되게 하세요.
8번 실습의 1단계를 두 번. veth 의 r- 쪽은 루트에 남깁니다. ip -n home route add default via 10.40.1.1, ip -n dmz route add default via 10.40.2.1, sysctl -w net.ipv4.ip_forward=1.
DMZ 의 웹 서버
/root/final/www/index.html 을 만들고 dmz 안에 10.40.2.10:80 을 듣는 웹 서버를 띄워(로그는 /root/final/http.log) home 에서 curl http://10.40.2.10/ 이 되게 하세요.
ip netns exec dmz setsid python3 -m http.server 80 --bind 10.40.2.10 --directory /root/final/www > /root/final/http.log 2>&1 < /dev/null &. index.html 에 dmz 라는 낱말을 넣어 두면 나중에 응답을 구별하기 쉽습니다.
라우터가 DNS 도 맡는다
/etc/dnsmasq.d/lab.conf 로 dnsmasq 가 10.40.1.1 에서 듣고 web.lab.internal→10.40.2.10 을 답하며 나머지는 상류로 넘기게 하고, /etc/netns/home/resolv.conf 로 home 이 그 서버를 쓰게 하세요.
4번 실습의 설정에 server=<상류> 를 더하고 no-resolv 는 그대로(상류를 resolv.conf 에서 읽지 말고 이 줄에서 읽으라는 뜻). systemctl restart dnsmasq. /etc/netns/home/resolv.conf 에 nameserver 10.40.1.1. 확인: ip netns exec home getent hosts web.lab.internal.
이름으로 연다
home 에서 curl -si http://web.lab.internal/ 의 응답을 /root/final/byname.txt 에 저장하세요.
ip netns exec home curl -si -m 3 http://web.lab.internal/ > /root/final/byname.txt. -i 는 헤더까지 출력합니다. 200 OK 와 index.html 의 내용이 보여야 합니다.
웹만 통과
루트에 테이블 inet labfw 와 forward 훅 체인(정책 drop)을 만들고, established,related 와 home→dmz 의 tcp dport 80 만 허용해 웹은 되고 ping 은 안 되게 하세요.
nft add table inet labfw; nft 'add chain inet labfw forward { type filter hook forward priority 0; policy drop; }'. 규칙 둘: ct state established,related accept, iifname "r-home" oifname "r-dmz" tcp dport 80 accept. 이제 home 의 ping 은 시간 초과, curl 은 200 이어야 합니다.
집 안을 인터넷으로
테이블 ip labnat 에 10.40.1.0/24 의 마스커레이드를 넣고 forward 에 home→uplink 의 tcp dport { 80, 443 } 을 허용해, home 에서 curl -sI http://archive.ubuntu.com/ 의 첫 줄을 /root/final/internet.txt 에 저장하세요.
8번 실습의 3단계 그대로(ip saddr 10.40.1.0/24 oifname "enp1s0" counter masquerade). 그리고 forward 에 iifname "r-home" oifname "enp1s0" tcp dport { 80, 443 } accept. DNS 는 라우터 자신(dnsmasq)이 답하므로 forward 를 안 탑니다.
패킷으로 확인
r-dmz 에서 캡처하며 home 에서 웹을 한 번 더 받아, 10.40.1.10 이 10.40.2.10.80 으로 보낸 SYN 이 보이는 출력을 /root/final/capture.txt 에 저장하세요.
timeout 5 tcpdump -i r-dmz -nn -l 'tcp port 80' > /root/final/capture.txt 2>&1 & 뒤 ip netns exec home curl -s http://web.lab.internal/. 10.40.1.10.<포트> > 10.40.2.10.80: Flags [S] 줄이 있어야 합니다. 출발지가 그대로인 것을 보세요 — 안쪽 사이에는 NAT 가 없습니다.
규칙과 보고서
전체 규칙을 /root/final/ruleset.nft 에 저장하고, /root/final/report.md 에 home_ip=·dmz_ip=·dns=·ping_blocked= 네 줄과 함께 "web.lab.internal 이 안 열린다" 는 신고를 받았을 때 어느 순서로 볼지를 적으세요.
nft list ruleset > /root/final/ruleset.nft. 보고서의 네 값은 10.40.1.10, 10.40.2.10, 10.40.1.1, yes. 순서에는 이름(getent)·경로(ip route get)·방화벽(nft counter)·포트(ss) 가 들어가야 합니다.