Devin.KR

격리된 Linux 실습망

150분 안팎

학습 목표

Linux VM 안에 단말·라우터 네임스페이스를 준비하고 호스트망과 격리를 확인합니다.

개념

실습망이 어디에 존재하는지 경계를 그립니다

네트워크 설정은 실행한 커널의 상태를 바꿉니다. 자신의 노트북에서 실수로 기본 경로를 지우면 학습 화면 접속까지 끊길 수 있습니다. 이 레슨은 전용 Linux VM 내부에 단말과 라우터의 공간을 만들고, 실습 인터페이스가 VM의 관리용 인터페이스에 연결되지 않았는지 검사합니다. 실제 학교 장비나 운영 서버에 접속하지 않고 가상 장비의 생명주기까지 재현하는 것이 목표입니다.

여기서 물리 호스트는 macOS 컴퓨터이고, VM 호스트 네임스페이스는 Linux VM의 기본 네트워크 공간입니다. bcnet-demo1과 bcnet-r1은 그 Linux 커널 안의 별도 네트워크 네임스페이스입니다. 네임스페이스는 인터페이스·주소·경로를 구분하는 도구이며 완전한 OS 보안 경계를 제공한다고 해석하지 않습니다. 관리자 권한으로 잘못된 대상을 지정하면 VM 기본 공간도 변경할 수 있습니다. 따라서 전용 VM과 명시적인 이름을 함께 사용합니다.

veth는 두 끝이 연결된 가상 인터페이스 쌍입니다. 단말 쪽 eth0와 라우터 쪽 p1이 한 쌍이며 두 끝을 각각 해당 네임스페이스에 둡니다. VM 기본 공간에는 이 쌍의 끝을 두지 않습니다. 두 공간을 잇는다는 사실만 확인하고 이번 단계에서 학교 전체 전달은 켜지 않습니다. 이런 격리 자원과 veth 연결의 기본 동작은 Linux 네임스페이스 매뉴얼에서 확인할 수 있습니다.

전용 VM의 실행 기반을 준비합니다

Ubuntu 24.04 LTS의 CPU 아키텍처에 맞는 설치 이미지를 사용합니다. Apple Silicon에서는 arm64, Intel 맥에서는 amd64 이미지를 선택합니다. 자신이 사용할 수 있는 VM 도구로 새 머신을 만들고 Linux 콘솔에 로그인합니다. 실습 파일을 보관할 디스크와 메모리를 준비하되 실제 장비 수는 네임스페이스로 표현하므로 장비 여섯 대마다 VM을 따로 만들지는 않습니다. 설치 완료 시점을 VM 스냅샷으로 남기면 실험 환경을 다시 만들기 쉽습니다.

설치와 패키지 내려받기에는 VM의 NAT 방식 관리 네트워크를 사용할 수 있습니다. 실제 학교 LAN에 브리지로 연결하는 설정은 선택하지 않습니다. 필요한 패키지를 설치하고 실습 zip을 VM으로 옮긴 뒤 가상 관리 NIC를 분리해 오프라인 상태에서 연습할 수 있습니다. 이 선택은 실습 중 외부 접근 경로를 더 줄입니다. 패키지 다운로드를 위한 연결과 학교망을 흉내 내는 veth 연결을 같은 선으로 그리지 않습니다.

도구는 iproute2, nftables, dnsmasq-base, tcpdump, curl, dnsutils, traceroute, iputils-ping, python3를 준비합니다. dnsmasq-base는 실행 파일을 제공하고 이번 준비 단계에서 DNS 서비스를 띄우지 않습니다. apt-get 설치 출력은 미리 적어 두지 않습니다. 네트워크 연결과 저장소 상태에 따라 달라지므로 종료 상태와 각 도구의 위치를 VM에서 확인합니다. 모든 도구를 지금 쓰는 것은 아니며 뒤의 VLAN·이름 조회·정책·캡처 단계에서도 같은 VM을 사용합니다.

작은 직접 링크와 최종 학교 주소를 구분합니다

두 장비 실습의 임시 주소는 단말 10.200.1.2/30과 라우터 10.200.1.1/30입니다. 이 값은 직접 연결 확인용이며 학교 학생 전체의 최종 주소 계획이 아닙니다. /30 계산과 학교 역할별 대역 배정은 다음 주소 모듈에서 다룹니다. 여기서는 제공 값을 정확히 적용하고 단말과 r1의 직접 ping이 가능한지만 점검합니다. 같은 주소를 양 끝에 넣으면 다른 장비를 식별할 수 없어 starter가 거부되도록 구성되어 있습니다.

네임스페이스 생성은 ip netns add로, 그 안의 인터페이스 명령은 ip -n NAME으로 지정합니다. 프로그램을 그 공간에서 실행하려면 ip netns exec NAME 명령을 사용합니다. 이름을 생략한 ip addr나 ip route는 VM 기본 공간을 대상으로 합니다. 따라하기에서 기본 공간 명령은 읽기 전용 확인에만 쓰며 구성 코드는 명시적인 네임스페이스를 붙입니다. 처음에는 짧은 별칭보다 제공된 전체 이름을 그대로 쓰는 편이 잘못된 대상 변경을 줄입니다.

각 공간의 lo를 올리고 IPv4 전달을 0으로 설정합니다. 실습 공간의 IPv6는 이번 IPv4 기반 검사에서 꺼 둡니다. 전달을 끄는 것은 r1을 통해 다른 단말로 패킷을 넘기지 않겠다는 뜻이며 r1 자신의 직접 주소에 대한 응답까지 끄는 뜻은 아닙니다. 주소와 링크가 올바르면 단말에서 직접 연결된 r1 주소에 ping을 보낼 수 있습니다. 기본 경로도 넣지 않아 아직 가상 외부망 경로가 없다는 상태를 명확히 합니다.

검사기는 통신과 격리를 각각 확인합니다

network-isolated-pair의 check.sh는 문서 계약을 먼저 확인합니다. 그 다음 Linux와 관리자 권한·도구 존재를 확인하고 VM 기본 공간의 인터페이스 설정·주소·IPv4 및 IPv6 전체 경로를 저장합니다. setup.sh는 생성한 네임스페이스 이름만 .owned.json에 기록합니다. 이미 같은 이름이 있으면 실행을 거부하므로 다른 실습을 지우고 시작하는 동작은 없습니다. 미션도 bcnet-r1을 사용하므로 두 실습을 동시에 구성하지 않습니다.

verify_network.py는 기대한 인터페이스 집합, 실제 IPv4 주소, veth 종류와 상대 포트, 양방향 직접 ping, 기본 경로 부재와 전달 off를 검사합니다. ping 성공 하나로 격리까지 확인했다고 말하지 않습니다. 인터페이스 집합에 관리 NIC가 섞였거나 예상하지 않은 기본 경로가 있으면 통신이 성공해도 실패로 처리합니다. Linux ip -j 출력과 ip-netns 매뉴얼의 대상 선택을 대조해 확인합니다.

마지막에 이번 실행에서 만든 네임스페이스를 정리하고 VM 기본 공간 스냅샷을 다시 비교합니다. 변동하는 주소 수명이나 패킷 카운터 대신 인터페이스 이름·주소·MTU·상태 플래그와 실제 경로 구성을 봅니다. 주변 VM 네트워크가 실행 중 바뀌었다면 비교가 실패할 수 있으므로 차이를 읽고 안정적인 조건에서 다시 확인합니다. 실패 시 기존 관리 인터페이스를 수정해서 검사를 억지로 통과시키지 않습니다.

오류와 정리 절차를 다음 담당자에게 남깁니다

“Operation not permitted”나 네임스페이스 생성 단계의 권한 오류는 Linux 관리자 권한 또는 VM의 네임스페이스 지원 조건을 확인할 단서입니다. macOS에서 ip: command not found가 보이면 Linux VM 콘솔인지 먼저 봅니다. 이름 충돌 오류는 기존 실습의 소유 기록과 상태를 확인하라는 뜻입니다. 기존 이름을 광범위한 삭제 명령으로 지우지 않습니다. 자신이 생성한 망이라면 해당 폴더의 cleanup.sh로 정리한 뒤 다시 실행합니다.

관찰용 setup.sh를 실행한 뒤에는 바로 ping 같은 전경 명령만 사용합니다. 백그라운드 서버를 시작하지 않으므로 cleanup.sh는 남은 프로세스가 없는지 확인한 뒤 네임스페이스를 삭제합니다. 프로세스가 있으면 정리를 거부하며 실행한 터미널에서 정상 종료한 후 재시도합니다. 재부팅으로 공간은 사라졌는데 소유 파일만 남았다면 이름이 모두 없음을 확인한 후 해당 파일만 지웁니다. 정리 성공과 다음 재생성이 가능함도 재현성의 일부입니다.

이 레슨의 Linux 명령 출력은 작성 환경에서 실행할 수 없어 비워 두었습니다. verify: external은 문법과 문서 검사는 끝냈지만 실제 VM 실행 확인이 남았다는 표시입니다. 실행 후 자신의 환경·명령·출력과 호스트 비교 결과를 제출합니다. 외부 확인이 대기라는 상태를 성공으로 바꾸어 쓰지 않습니다. 첫 미션 solution은 여섯 장비·다섯 링크로 같은 구조를 확장하며 이후 모듈이 그대로 이어받을 기반입니다.

따라하기

VM 설치와 콘솔 위치 확인

Ubuntu 24.04 LTS 전용 VM을 설치하고 스냅샷을 남깁니다. 아래 명령은 Linux VM 콘솔에서 실행합니다. uname의 시스템이 Linux인지, 배포판 VERSION_ID가 24.04인지 확인합니다. 실제 출력은 VM에서 기록합니다.

uname -s
cat /etc/os-release

후속 모듈 도구까지 설치

NAT 관리 연결로 설치합니다. 설치 종료 상태를 확인하고 command -v가 각 도구의 경로를 반환하는지 봅니다. dnsmasq-base는 실행 파일만 준비하며 서버를 시작하지 않습니다. zip을 옮긴 뒤 VM 관리 NIC를 분리하고 콘솔에서 이어갈 수 있습니다.

sudo apt-get update
sudo apt-get install -y iproute2 nftables dnsmasq-base tcpdump curl dnsutils traceroute iputils-ping python3
command -v ip nft dnsmasq tcpdump curl dig traceroute ping python3

주소 오류 수정과 전체 검사

network-isolated-pair starter.zip을 VM에서 풀고 topology.json의 demo1 주소를 10.200.1.2/30으로 수정합니다. 루트에서 문서를 검사하고 전체 검사를 실행합니다. 문서·왕복 ping·격리·정리·VM 기본 공간 동일성 단계가 모두 통과해야 합니다. 작성 환경에서는 실행 대기라 출력이 없습니다.

python3 validate_docs.py
sudo bash check.sh

구성 관찰과 정리

실제 설정을 관찰하려면 setup.sh로 구성합니다. demo1에는 lo와 eth0, r1에는 lo와 p1만 있는지 봅니다. r1의 직접 경로를 확인하고 기본 경로가 없는지 읽습니다. 종료 후 네임스페이스 목록에 이번 이름이 사라졌는지 확인합니다. 각 결과를 evidence 기록에 남깁니다.

sudo bash setup.sh
sudo ip -n bcnet-demo1 -br addr
sudo ip -n bcnet-r1 route
sudo bash cleanup.sh
ip netns list

여섯 장비 미션으로 확장

레슨 실습을 정리한 후 network-sandbox-mission starter.zip에서 빠진 요구사항과 ghost 참조를 고칩니다. 문서 오류 주입 검사는 macOS에서도 가능합니다. Linux에서는 마지막 명령으로 여섯 장비와 다섯 링크를 검증하고 정리합니다. 성공 출력과 전후 비교 근거를 자신의 기록에 보관합니다.

python3 validate_docs.py
python3 test_docs.py
sudo bash check.sh

확인 문제

실습

topology.json의 단말 임시 주소 중복을 수정합니다. Ubuntu 24.04 LTS VM에서 sudo bash check.sh를 실행합니다. check.sh는 문서, 단말·라우터의 인터페이스와 주소·veth 상대·왕복 ping, 기본 경로 부재, 전달 off를 확인하고 생성한 망을 정리한 뒤 VM 기본 공간이 그대로인지 비교합니다. setup.sh/cleanup.sh로 직접 관찰도 수행하고 실제 결과를 제출합니다. 백그라운드 프로세스는 시작하지 않습니다.

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

실행 명령

sudo bash check.sh

기대 결과

Linux VM에서 문서·실제 링크·왕복 ping·기본 경로 부재·전달 off·정리·호스트 전후 동일성 검사 통과. 실행 확인은 외부 대기입니다.

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

더 읽기

면접 질문

  • 학교망 실습을 VM과 네트워크 네임스페이스로 격리하는 방법을 설명해 보세요.
  • 통신 성공과 호스트망 격리를 어떤 근거로 따로 검증하나요?