Devin.KR

가상 외부망과 경계 라우터

100분 안팎

학습 목표

호스트 인터넷을 사용하지 않는 가상 외부 서버와 경계 라우터를 추가합니다.

개념

경계는 연결 구간으로 정의합니다

학교 VLAN을 연결한 r1에 외부 쪽 링크를 하나 추가합니다. 외부라는 이름은 인터넷 연결을 뜻하지 않습니다. 학교 주소와 다른 가상 서버 구간을 만들어 경계 전후의 전달을 비교한다는 뜻입니다. 목적은 호스트의 기본 경로나 실제 회선에 영향을 주지 않고 왕복 경로가 없을 때 어떤 결과가 나오는지 재현하는 것입니다. 앞 모듈의 학교 서비스와 주소 이력은 유지합니다.

학교 쪽 출발점을 보존합니다

m05의 학생 s1은 DHCP 예약으로 10.20.10.111을 받습니다. addresses.csv의 .11은 m04 주소 이력이므로 이 파일을 .111로 덮어쓰지 않습니다. 현재 예약은 lease.json으로 확인합니다. 교직원 t1은 10.20.20.11이며 r1에는 VLAN별 게이트웨이가 있습니다. 새 WAN을 추가하기 전에 기존 DHCP·DNS·웹 회귀 검사가 통과해야 새 경계 문제가 기존 학교 문제와 섞이지 않습니다.

두 네임스페이스를 직접 연결합니다

새 bcnet-wan의 eth0와 bcnet-r1의 wan0를 veth 쌍으로 연결합니다. r1에는 198.51.100.1/24, WAN에는 198.51.100.2/24를 부여합니다. veth 양 끝을 각 공간에서 올리고 WAN의 lo도 올립니다. 호스트 물리 인터페이스를 연결하는 단계는 없습니다. 이 구조에서는 링크 양 끝의 주소와 인터페이스 상태를 따로 확인할 수 있습니다.

r1이 경계 라우터입니다

학교와 WAN 사이에 라우터를 하나 더 넣지 않고 기존 r1을 경계로 확장합니다. r1은 학교 VLAN과 WAN에 직접 연결된 경로를 가집니다. 학생과 교직원의 기본 게이트웨이는 그대로 r1입니다. 패킷이 r1에 들어오면 목적지 .2에 대한 직접 연결 경로로 wan0를 선택합니다. r1의 전달 기능은 앞 모듈 설정을 이어받지만 호스트의 전달 기능은 변경하지 않습니다.

WAN 서버에는 기본 경로가 없습니다

WAN 서버는 198.51.100.0/24의 직접 연결 경로만 갖습니다. 따라서 r1의 .1로는 응답할 수 있지만 학교의 10.20.10.111로 돌아가는 경로는 없습니다. 이는 NAT 효과를 확인하기 위해 의도한 조건입니다. WAN에 default via .1을 넣으면 변환 없이도 학교 주소로 돌아올 수 있어 음성 시험의 전제가 무너집니다. 경로가 없다는 조건을 기록하고 유지합니다.

문서용 주소의 의미

198.51.100.0/24는 문서와 예제에 사용하는 주소 범위입니다. 이번 실습에서는 별도 공간 안에서만 링크 주소로 사용합니다. 실제 인터넷 목적지처럼 DNS 등록이나 외부 서비스 호출을 기대하지 않습니다. 가상 외부 웹은 .2:8080에서 제공되며 본문 virtual wan ready를 반환하도록 준비되어 있습니다. 연결 대상과 포트를 바꾸면 같은 시험이 아니므로 제출 기록에도 대상 끝점을 적습니다.

설정 파일부터 고칩니다

network-virtual-wan starter의 edge.json에는 r1 WAN 주소가 .9로 잘못 적혀 있습니다. wan을 198.51.100.1/24로 수정하고 server, interface, sources, snat, port는 계약과 대조합니다. python3 test_edge.py의 FAIL: wan-link가 해당 링크 주소를 검사합니다. 이 테스트는 JSON 비교이므로 링크를 만들지 않습니다. 구성 의도와 실제 적용을 구분해 시험 결과를 보고합니다.

망 구성은 제공 실행기가 맡습니다

edge_run.py는 m05 검사 후 실행되며 WAN 링크를 만든 뒤 r1의 nft 문법 검사와 웹 수신 준비를 확인합니다. 학습자가 망 생성 코드 전체를 다시 작성할 필요는 없습니다. 레슨 과제는 주소 계약 수정과 경계 경로 설명입니다. 스크립트에서 ip -n은 대상 공간의 인터페이스·경로를 조작하고 ip netns exec는 그 공간에서 프로그램을 실행한다는 차이를 찾아봅니다.

첫 실패를 성공으로 바꾸지 않습니다

NAT 적용 전 학생의 새 TCP 요청은 시간 제한 안에 성공하지 않아야 합니다. WAN 웹 준비를 먼저 확인했으므로 수신자 미기동과 응답 경로 부재를 혼동할 가능성을 줄입니다. 그렇더라도 curl 실패 문자열만으로 일반 환경의 원인을 확정할 수는 없습니다. 이 실습에서는 서버 경로표가 학교망을 포함하지 않는다는 구조 증거와 실패 시험을 함께 제출합니다.

기본 경로 부재를 정확히 읽습니다

default 줄이 없다고 모든 통신이 실패하는 것은 아닙니다. 직접 연결된 .1에는 별도 기본 경로 없이 도달할 수 있습니다. 반대로 주소가 같은 /24라고 프로그램의 포트까지 열려 있다는 뜻도 아닙니다. 학생 경로, r1 경로, WAN 응답 경로를 각각 적으면 어느 장비에 어떤 경로가 필요한지 설명할 수 있습니다. 경로표 한 장으로 전체 왕복 성공을 대신 보고하지 않습니다.

호스트와 실습망을 구분합니다

검사기는 호스트 네트워크를 실행 전후 snapshot.py로 비교합니다. 생성한 네임스페이스 이름은 정해져 있고 WAN 이름이 이미 존재하면 기존 것을 보존하며 실패합니다. File exists를 보고 기존 공간을 바로 삭제하지 않습니다. 실행 폴더의 소유 기록과 실제 이름을 확인합니다. 실습 VM 안이라도 이전 작업의 공간을 무단으로 재사용하면 설정과 캡처의 출처가 섞입니다.

정리를 실행 계획에 포함합니다

WAN 웹은 정해진 시간 뒤 스스로 끝나고 실행기는 wait로 기다린 뒤 WAN 공간을 제거합니다. WAN eth0를 제거하면 veth 짝인 r1 wan0도 사라집니다. 상위 검사는 학교망을 정리하고 호스트 스냅샷이 같은지 비교합니다. 프로세스가 남아 있다는 메시지가 나오면 임의로 kill하지 말고 제공 서비스의 자연 종료 여부와 README의 정리 조건을 확인합니다.

환경 오류와 과제 오류를 나눕니다

ENV: Linux VM required는 맥에서 커널 실습을 시도한 경우입니다. ENV: sudo bash check.sh required는 권한 조건을 뜻합니다. command not found는 해당 도구 준비를 확인하는 신호입니다. 이런 오류는 주소 선택의 정답 여부를 알려 주지 않습니다. 반면 FAIL: wan-link는 edge.json의 링크 주소 계약 위반입니다. 마지막 메시지와 발생 단계를 함께 기록하고 수정 범위를 좁힙니다.

경계 구성도를 제출합니다

그림에는 학교 VLAN, r1의 내부 인터페이스, wan0 .1/24, WAN eth0 .2/24와 웹 8080을 표시합니다. WAN의 학교 응답 경로 없음도 주석으로 적습니다. wan-routes.txt는 실제 실행한 경로표로 보관하며 아직 Linux를 실행하지 않았다면 빈 결과를 예상으로 채우지 않습니다. 가상 외부망이라는 이름보다 링크·경로·서비스의 실제 조건을 전달하는 것이 인계에 도움이 됩니다.

주소 범위 근거: RFC 5737에서 문서용 TEST-NET-2 범위를 확인했습니다. 이 과제는 격리된 교육 예제이며 실망 주소 계획에 이 범위를 배정하지 않습니다.

따라하기

시작 설정의 실패 확인

starter.zip 루트에서 실행합니다. FAIL 항목을 읽고 본문에서 지정한 edge.json 및 nat.nft 값을 수정합니다. 커널 실습은 아직 실행하지 않습니다.

python3 test_edge.py
python3 test_nat_rule.py

수정 후 계약 확인

다음은 solution에서 직접 실행한 결과입니다. JSON 비교가 실제 링크를 만들지는 않습니다.

python3 test_edge.py

실행 결과

PASS: wan-link
PASS: egress
PASS: scope
PASS: translation
PASS: web-port

Linux 왕복 검사

Linux VM에서 실행합니다. nft 문법 검사와 m05 회귀 후 가상 외부 HTTP 및 양쪽 캡처를 확인합니다. 실행 확인은 external 대기이므로 출력은 비워 둡니다.

sudo bash check.sh

근거 파일 읽기

실행 완료 후 저장된 파일을 읽습니다. 이번 주소·포트의 요청과 응답을 대조하고 음성 시험의 경로 전제를 기록합니다.

cat wan-routes.txt
cat nat.csv
cat negative.txt

확인 문제

실습

압축 루트에서 edge.json의 wan 주소를 수정합니다. python3 test_edge.py와 python3 test_nat_rule.py를 먼저 실행합니다. Linux에서 sudo bash check.sh로 실제 동작을 확인하고 README에 나열된 자료를 제출합니다. 수행하지 못한 패킷 검사는 대기로 적습니다.

시작 코드·테스트 내려받기

실행 명령

sudo bash check.sh

기대 결과

설정 검사와 m05 회귀, WAN 격리, SNAT 두 연결의 요청·응답, pcap 및 NAT 제거 음성 시험 통과; 소유 망 정리와 호스트 전후 일치.

모범 답안모범 답안 내려받기

더 읽기

면접 질문

  • NAT 전후 패킷 주소의 차이를 설명합니다.