LabHub
배우기 러닝패스 코스

Network Fundamentals — Hands-on in a Linux VM

A Small Network with Router, DNS, Firewall and NAT

LabHub 에서 이어서 보기

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

이 실습은 VM 에서 돕니다

앞의 아홉 실습을 하나로 모읍니다. 네임스페이스 home(사용자 쪽)과 dmz(서버 쪽) 사이에 VM 자신이 라우터로 서고, 그 라우터가 DNS 서버·방화벽·NAT 까지 맡습니다. 집 공유기 한 대가 하는 일의 축소판입니다. 60분 실습이라 시간을 한 번 연장해야 할 수 있습니다 — 작업물은 VM 과 함께 사라지니 미리 알아 두세요.

목표

두 서브넷을 잇고, 이름으로 서버를 찾게 하고, 웹만 통과시키고, 사설망을 인터넷에 내보내고, 그 전부를 패킷으로 확인한 뒤 보고서로 남깁니다.

왜 중요한가

지금까지는 한 번에 한 층만 봤습니다. 실제 장애는 여러 층이 겹쳐 있습니다 — 이름은 풀리는데 방화벽이 막고, 방화벽은 열렸는데 돌아오는 경로가 없고. 한 네트워크를 처음부터 끝까지 세워 본 사람은 "안 된다" 를 들었을 때 어느 층부터 볼지 순서가 있습니다: 링크 → 주소 → 이웃 → 경로 → 이름 → 포트 → 방화벽 → 응답.

단계

  1. 네임스페이스 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 를 설정해 homedmz ping 이 되게 하세요.
  2. /root/final/www/index.html 을 만들고 dmz 안에 10.40.2.10:80 을 듣는 웹 서버를 띄워(로그는 /root/final/http.log) home 에서 curl http://10.40.2.10/ 이 되게 하세요.
  3. /etc/dnsmasq.d/lab.conf 로 dnsmasq 가 10.40.1.1 에서 듣고 web.lab.internal10.40.2.10 을 답하며 나머지는 상류로 넘기게 하고, /etc/netns/home/resolv.confhome 이 그 서버를 쓰게 하세요.
  4. home 에서 curl -si http://web.lab.internal/ 의 응답을 /root/final/byname.txt 에 저장하세요.
  5. 루트에 테이블 inet labfwforward 훅 체인(정책 drop)을 만들고, established,relatedhomedmztcp dport 80 만 허용해 웹은 되고 ping 은 안 되게 하세요.
  6. 테이블 ip labnat10.40.1.0/24 의 마스커레이드를 넣고 forwardhome→uplink 의 tcp dport { 80, 443 } 을 허용해, home 에서 curl -sI http://archive.ubuntu.com/ 의 첫 줄을 /root/final/internet.txt 에 저장하세요.
  7. r-dmz 에서 캡처하며 home 에서 웹을 한 번 더 받아, 10.40.1.1010.40.2.10.80 으로 보낸 SYN 이 보이는 출력을 /root/final/capture.txt 에 저장하세요.
  8. 전체 규칙을 /root/final/ruleset.nft 에 저장하고, /root/final/report.mdhome_ip=·dmz_ip=·dns=·ping_blocked= 네 줄과 함께 "web.lab.internal 이 안 열린다" 는 신고를 받았을 때 어느 순서로 볼지를 적으세요.

참고

두 서브넷과 라우터

네임스페이스 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 를 설정해 homedmz 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.internal10.40.2.10 을 답하며 나머지는 상류로 넘기게 하고, /etc/netns/home/resolv.confhome 이 그 서버를 쓰게 하세요.

4번 실습의 설정에 server=<상류> 를 더하고 no-resolv 는 그대로(상류를 resolv.conf 에서 읽지 말고 이 줄에서 읽으라는 뜻). systemctl restart dnsmasq. /etc/netns/home/resolv.confnameserver 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 labfwforward 훅 체인(정책 drop)을 만들고, established,relatedhomedmztcp 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 labnat10.40.1.0/24 의 마스커레이드를 넣고 forwardhome→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.1010.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.mdhome_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) 가 들어가야 합니다.