네트워크를 공부하면서 패킷과 장비의 동작을 직접 확인하려면 실습 환경이 필요하다.
『네트워크 프로토콜 입문』 1장에서는 WSL2, 도커, tinet을 이용해 PC 한 대에 네트워크 검증 환경을 구축한다.
클라이언트와 스위치, 라우터, 방화벽, 웹 서버를 컨테이너로 실행하고, 마지막으로 클라이언트에서 웹 서버에 접속해 동작을 확인한다.
이 글은 책의 1장을 기준으로 설명은 핵심만, 실습 과정은 빠짐없이 정리한 글이다. 명령어와 정상 출력 예시는 책의 환경을 기준으로 한다.
1-1. 사용 도구에 대한 이해
검증 환경에서 사용하는 도구는 세 가지다.
도구역할
| WSL2 | 윈도우에서 리눅스를 실행한다. |
| 도커(Docker) | 네트워크 장비와 서버를 컨테이너로 실행한다. |
| tinet | 설정 파일을 읽어 컨테이너와 네트워크를 구성한다. |
전체 구조는 다음과 같다.
윈도우
└─ WSL2
└─ Ubuntu 20.04
└─ 도커
└─ 네트워크 장비·서버 컨테이너
WSL2
WSL2는 윈도우 안에서 리눅스를 실행할 수 있게 해주는 도구다. 책에서는 Ubuntu 20.04를 사용한다.
이 Ubuntu 환경 안에 도커와 tinet을 설치한다.
도커
도커에서 구분해야 할 개념은 다음과 같다.
- 도커 엔진: 컨테이너를 생성하고 실행·중지하는 기반이다.
- 이미지: 프로그램과 실행에 필요한 데이터를 담은 컨테이너의 바탕이다.
- 컨테이너: 이미지를 바탕으로 만들어진 격리된 실행 환경이다.
컨테이너는 리눅스 커널을 공유하므로 여러 장비를 비교적 가볍게 실행할 수 있다.
tinet
tinet은 YAML 설정 파일을 이용해 네트워크 검증 환경을 만드는 도구다.
설정 파일을 읽어 이미지 다운로드, 컨테이너 생성, 장비 간 연결, 장비 설정 등을 처리한다. 라우터에는 FRR, L2 스위치에는 OVS(Open vSwitch)처럼 해당 기능을 제공하는 프로그램을 사용한다.
특정 제조사 장비의 고유 기능보다는 네트워크 프로토콜과 기본 동작을 확인하는 데 초점을 맞춘 환경이다.
1-2. PC에 도구 설치하기
1. PC 환경과 가상화 기능 확인
책에서 사용한 PC 환경은 다음과 같다. 최소 요구 사양이 아니라 책의 검증 환경이다.
항목책의 환경
| 운영체제 | Windows 11 Home 23H2 |
| 빌드 | 22631.2715 |
| 시스템 | 64비트 |
| CPU | AMD Ryzen 5 5625U, 6코어 |
| 메모리 | 16GB |
| 저장 공간 | 512GB |
책에서는 Windows 10도 안내하며, 버전 2004·빌드 19041 이상을 기준으로 설명한다. 도구와 이미지 다운로드를 위한 인터넷 연결도 필요하다.
먼저 작업 관리자 → 성능 → CPU에서 가상화가 사용 상태인지 확인한다.
비활성화되어 있다면 UEFI/BIOS에서 가상화 지원 기능을 활성화한다. 설정 이름은 CPU와 제조사에 따라 Intel Virtualization Technology, SVM Mode 등으로 표시될 수 있다.
2. WSL2와 Ubuntu 설치
윈도우 시작 메뉴를 오른쪽 클릭해 터미널(관리자)을 연다. 아래 명령은 PowerShell에서 실행한다.
wsl --install --distribution Ubuntu-20.04
설치 안내에 따라 진행한 뒤 PC를 재부팅한다.
shutdown /r /t 0
재부팅 후 Ubuntu 초기 설정에서 사용자 이름과 비밀번호를 만든다.
책의 사용자 이름 예시는 ubuntu다. Ubuntu 계정은 윈도우 계정과 별개이며, 설정이 끝나면 Ubuntu 셸에서 명령어를 입력할 수 있다.
3. root 사용자 설정
이후 실습은 Ubuntu의 root 사용자를 기준으로 진행한다.
Ubuntu 셸에서 root 비밀번호를 설정한다.
sudo passwd root
현재 사용자의 비밀번호를 입력하고, root에서 사용할 비밀번호를 설정한다. 이어서 root 사용자로 전환한다.
su
설정한 root 비밀번호를 입력한 뒤 프롬프트가 다음 형태로 바뀌었는지 확인한다.
root@호스트이름:...#
4. WSL 버전 확인
윈도우 PowerShell에서 실행한다.
wsl --list --verbose
Ubuntu-20.04의 VERSION이 2인지 확인한다.
1이라면 다음 명령으로 변경한다.
wsl --set-version Ubuntu-20.04 2
다시 확인한다.
wsl --list --verbose
같은 확인 명령을 짧게 쓰면 다음과 같다.
wsl -l -v
5. 실습 파일 준비
책의 실습 파일 저장소에서 tinet.zip을 내려받아 압축을 푼다.
압축을 푼 tinet 폴더는 다음 위치에 둔다.
C:\tinet
폴더에는 총 8개의 파일이 있다.
파일용도
| setup.sh | 도구 설치와 환경 설정 |
| check.sh | 설치 결과 확인 |
| spec_01.yaml~spec_05.yaml | 장별 검증 환경 설정 |
| tinet | tinet 실행 파일 |
윈도우의 C:\tinet은 Ubuntu에서 /mnt/c/tinet으로 접근한다.
Ubuntu 셸에서 파일 목록을 확인한다.
ls -al /mnt/c/tinet
6. 설정 스크립트 실행
Ubuntu의 root 셸에서 실행한다.
bash /mnt/c/tinet/setup.sh
스크립트는 다음 순서로 작업한다.
순서작업
| ① | DNS 클라이언트 설정 |
| ② | Ubuntu 업데이트 |
| ③ | 도커 설치 |
| ④ | tinet 설치 |
| ⑤ | WSL 시작 설정 |
각 작업에서 알아둘 내용은 다음과 같다.
DNS 클라이언트 설정
/etc/resolv.conf에 DNS 서버 8.8.8.8, 1.1.1.1을 지정한다. 이후 파일이 변경되지 않도록 속성을 설정한다.
Ubuntu 업데이트
시간을 동기화하고 인터넷 연결을 확인한 뒤 apt-get update, apt-get upgrade를 실행한다.
도커 설치
도커 설치 스크립트를 내려받아 실행한다.
tinet 설치
배포 파일의 tinet을 /usr/bin 아래에 복사하고 실행 권한을 부여한다. 책에 포함된 tinet 버전은 v0.0.3이다.
WSL 시작 설정
/etc/wsl.conf에 다음 내용을 설정한다.
- 호스트 이름을 UBUNTU로 지정한다.
- generateResolvConf = false로 DNS 설정 파일 자동 생성을 비활성화한다.
- command = "service docker start"로 도커 서비스를 자동 시작한다.
- default = root로 기본 로그인 사용자를 지정한다.
이 작업들은 스크립트가 처리하므로 별도로 반복 입력하지 않는다.
설치가 끝나면 다음 메시지를 확인한다.
Setup complete. Please restart this WSL instance.
7. WSL 인스턴스 재시작
새 윈도우 PowerShell 창이나 탭을 열어 실행한다.
wsl --terminate Ubuntu-20.04
wsl --distribution Ubuntu-20.04
다시 접속했을 때 프롬프트가 root@UBUNTU인지 확인한다.
설치 과정에서 문제가 발생했다면 Ubuntu 셸에서 로그를 확인한다.
cat /var/log/setup.log
책에서는 시간 동기화 실패 시 설정 스크립트 재실행을 안내한다. Windows 10에서 도커 자동 시작 설정이 작동하지 않는 경우에는 PowerShell에서 다음 명령으로 WSL을 업데이트하도록 안내한다.
wsl --update
8. 체크 스크립트 실행
Ubuntu의 root 셸에서 실행한다.
bash /mnt/c/tinet/check.sh
WSL 인스턴스를 재시작했는지 묻는 질문에, 재시작을 마쳤다면 y를 입력한다.
검사 항목은 다음과 같다.
- DNS 설정 파일과 DNS 서버 주소
- 도커 설치 여부
- tinet 설치 여부
- 호스트 이름 UBUNTU
- 도커 서비스 실행 상태
- root 로그인 상태
모든 검사를 통과하면 다음 메시지가 나타난다.
All checks passed successfully.
검사에 실패하면 로그를 확인한다.
cat /var/log/check.log
설치 로그는 setup.log, 검사 로그는 check.log로 구분해두면 된다.
보충: Mac에서 설치하기
책에서는 Mac의 경우 WSL2 대신 Multipass로 Ubuntu 가상 머신을 만든다.
아래는 책에서 확인한 Intel Mac 환경의 절차다. 책의 검증 환경은 macOS 12.7, Intel Core i7, 메모리 16GB다.
① Homebrew 설치
Mac 터미널에서 실행한다.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
② Multipass 설치
brew install --cask multipass
③ 실습 파일 준비
책의 실습 파일 저장소에서 tinet_mac.zip을 내려받아 압축을 푼다. tinet 폴더는 사용자 홈 디렉터리 아래에 둔다.
④ Ubuntu 가상 머신 생성
아래 명령의 user01은 자신의 Mac 사용자 이름으로 바꾼다.
multipass launch 20.04 --cpus 2 --name UBUNTU --mount /Users/user01/tinet:/mnt/c/tinet
CPU 2개를 할당하고, Mac의 실습 폴더를 가상 머신의 /mnt/c/tinet에 연결한다.
⑤ 가상 머신 접속
Mac 터미널에서 실행한다.
multipass shell UBUNTU
접속한 Ubuntu 가상 머신 안에서 root 비밀번호를 설정하고 전환한다.
sudo passwd root
su
⑥ 설정 및 검사
가상 머신 안에서 실행한다.
bash /mnt/c/tinet/setup_mac.sh
bash /mnt/c/tinet/check_mac.sh
설정을 마친 뒤에는 Mac 터미널에서 다음 명령으로 root 셸에 접속할 수 있다.
multipass exec UBUNTU -- sudo -i
1-3. 도구 사용법 이해하기
1. WSL 인스턴스 시작과 중지
윈도우 시작 메뉴에서 Ubuntu를 실행하거나 PowerShell에서 다음 명령을 입력한다.
wsl
특정 인스턴스를 지정하려면 다음과 같이 실행한다.
wsl --distribution Ubuntu-20.04
사용자까지 지정하는 예시는 다음과 같다.
wsl --distribution Ubuntu-20.04 --user ubuntu
인스턴스를 중지할 때도 PowerShell의 wsl 명령을 사용한다.
wsl --list --verbose
wsl --terminate Ubuntu-20.04
wsl --list --verbose
중지 전에는 Running, 중지 후에는 Stopped로 표시되는지 확인한다.
책의 환경에서는 Ubuntu 내부의 shutdown, halt 명령이 systemd 관련 오류를 반환한다. 따라서 재시작도 PowerShell에서 인스턴스를 중지한 뒤 다시 시작하는 방식으로 진행한다.
2. 윈도우와 Ubuntu 사이의 파일 교환
윈도우에서 Ubuntu 파일에 접근하기
탐색기 주소창에 다음 경로를 입력한다.
\\wsl$
이후 Ubuntu-20.04를 선택한다. Windows 11에서는 탐색기의 Linux 항목으로도 접근할 수 있다.
Ubuntu에서 윈도우 파일에 접근하기
윈도우의 각 드라이브는 /mnt 아래에 연결된다.
윈도우 경로Ubuntu 경로
| C:\ | /mnt/c |
| D:\ | /mnt/d |
| C:\tinet | /mnt/c/tinet |
Ubuntu에서 C 드라이브의 파일 목록을 확인한다.
ls /mnt/c
일부 윈도우 시스템 파일은 접근 거부가 표시될 수 있다.
3. 도커 컨테이너 접속
이 예제는 뒤에서 설명하는 검증 환경 생성과 설정을 마친 뒤 실행한다. 도구만 설치한 상태에서는 cl1 컨테이너가 아직 없다.
Ubuntu의 root 셸에서 실행한다.
docker exec -it cl1 /bin/bash
프롬프트의 호스트 이름이 UBUNTU에서 cl1로 바뀌면 컨테이너에 접속한 것이다.
이제 cl1 내부에서 통신을 확인한다.
ping 192.168.11.254 -c 3
책의 정상 예시에서는 3회 송신·3회 수신하며, 다음 결과가 표시된다.
0% packet loss
컨테이너에서 빠져나오려면 다음을 입력한다.
exit
Ctrl+D로도 나올 수 있다. 이후 명령 입력 위치는 다시 Ubuntu 셸이 된다.
4. 컨테이너와 이미지 확인
Ubuntu 셸에서 실행 중인 컨테이너를 확인한다.
docker ps
컨테이너 이름과 STATUS의 Up 상태를 확인한다.
내려받은 이미지 목록은 다음 명령으로 확인한다.
docker images
책의 완성된 검증 환경은 9종의 이미지로 13개 컨테이너를 실행한다. 컨테이너 ID나 이미지 ID, 실행 시간은 책의 예시와 달라도 된다.
5. tinet으로 네트워크 환경 생성
tinet은 Ubuntu의 root 셸에서 실행한다.
tinet up -c /mnt/c/tinet/spec_01.yaml | sh -x
- -c: 사용할 설정 파일을 지정한다.
- up: 컨테이너를 생성하고 네트워크를 연결한다.
- | sh -x: tinet이 출력한 명령을 실행하면서 처리 내용을 표시한다.
처음에는 필요한 도커 이미지를 내려받는다.
Unable to find image ... locally가 표시된 뒤 다운로드가 이어지는 것은 책의 정상 실행 예에서도 볼 수 있다.
up은 컨테이너와 연결을 만드는 단계이며, 장비 내부 설정은 다음 단계에서 적용한다.
6. 컨테이너 설정 적용
tinet conf -c /mnt/c/tinet/spec_01.yaml | sh -x
IP 주소, 서비스 시작, 라우팅 등 설정 파일에 정의된 내용을 적용한다.
실행 중 보이는 docker exec, ip addr add, ethtool, vtysh 등의 명령은 tinet이 자동으로 수행하는 작업이다. 출력된 명령을 다시 입력할 필요는 없다.
7. 테스트 명령 실행
tinet test -c /mnt/c/tinet/spec_01.yaml | sh -x
설정 파일에 포함된 테스트를 실행한다.
책의 출력 예에는 다음과 같은 통신 검사가 등장한다.
docker exec cl1 ping -c2 192.168.11.254
docker exec cl2 ping -c2 192.168.11.254
각 테스트에서 응답이 돌아오는지, 패킷 손실이 없는지 확인한다. 위 두 명령은 책에 표시된 예시이므로 전체 실행 결과도 함께 확인한다.
8. 검증 환경 삭제
실습을 마치거나 환경을 다시 만들 때 실행한다.
tinet down -c /mnt/c/tinet/spec_01.yaml | sh -x
설정 파일에 정의된 컨테이너와 검증 환경을 제거한다.
삭제 후 실습을 이어가려면 up과 conf를 다시 실행해야 한다. 따라서 웹사이트 접속 확인까지 진행할 예정이라면 삭제는 마지막에 한다.
9. 네트워크 구성도 생성
Ubuntu에서 Graphviz를 설치한다.
apt install graphviz
설정 파일을 바탕으로 PNG 구성도를 생성한다.
tinet img -c /mnt/c/tinet/spec_01.yaml | dot -Tpng > /mnt/c/tinet/spec_01.png
윈도우에서 다음 파일을 열어 장비와 연결 관계를 확인한다.
C:\tinet\spec_01.png
구성도는 연결 구조를 확인하는 자료이며, 실제 통신 여부는 ping이나 curl로 확인한다.
1-4. 검증 환경 구축하기
1. 전체 설정 적용
1장에서 사용하는 파일은 spec_01.yaml이다. 네트워크 장비와 서버의 전체 설정이 포함되어 있다.
Ubuntu의 root 셸에서 다음 두 명령을 순서대로 실행한다.
tinet up -c /mnt/c/tinet/spec_01.yaml | sh -x
tinet conf -c /mnt/c/tinet/spec_01.yaml | sh -x
앞 절에서 이미 같은 파일로 환경을 만들었다면 다시 실행할 필요는 없다.
첫 구축에서는 이미지를 내려받으므로 안정적인 인터넷 연결이 필요하다. 이후에는 내려받은 이미지를 재사용한다.
2. 검증 환경의 구성
검증 환경은 다음 세 구역으로 나뉜다.
가정 내 LAN → 인터넷 → 서버 사이트
여기서 인터넷은 실제 외부 인터넷이 아니라 검증 환경 안에서 재현한 네트워크다.
구역컨테이너역할
| 가정 내 LAN | cl1, cl2, cl3 | 클라이언트 PC |
| 가정 내 LAN | sw1 | L2 스위치 |
| 가정 내 LAN | rt1 | 광대역 라우터 |
| 인터넷 | rt2, rt3 | 인터넷 라우터 |
| 인터넷 | ns1 | DNS 캐시 서버 |
| 서버 사이트 | fw1 | 방화벽 |
| 서버 사이트 | sw2 | L2 스위치 |
| 서버 사이트 | lb1 | 부하 분산 장치 |
| 서버 사이트 | sv1, sv2 | 웹 서버 |
가정 내 PC는 sw1과 rt1을 통해 인터넷 구역에 연결된다.
서버 사이트로 향하는 패킷은 인터넷 라우터를 거쳐 방화벽 fw1으로 들어간다. 이후 부하 분산 장치 lb1을 통해 웹 서버 sv1, sv2 중 하나로 전달된다.
이미지에는 각 역할에 필요한 프로그램이 들어 있고, 실제 검증 환경의 설정은 tinet이 적용한다.
3. 웹 서버 접속 확인
Ubuntu에서 클라이언트 cl1에 접속한다.
docker exec -it cl1 /bin/bash
프롬프트가 root@cl1로 바뀌었는지 확인한 뒤 실행한다.
curl -k https://www.example.com/
정상이라면 다음 중 하나가 출력된다.
sv1.example.com
또는
sv2.example.com
이 문자열은 검증 환경 내부의 웹 서버가 반환한 응답이다.
간단한 결과처럼 보이지만 클라이언트부터 서버까지의 네트워크와 서비스가 연결되어야 확인할 수 있다. cl1에서 웹 서버의 응답을 받는 것이 1장의 최종 확인 단계다.
확인이 끝나면 컨테이너에서 나온다.
exit
1-5. 설정 파일 사용법
실습 파일에는 spec_01.yaml부터 spec_05.yaml까지 다섯 개의 설정 파일이 있다.
모든 파일에 네트워크 연결, IP 주소, 서버 기본 설정이 포함되어 있다. 차이는 네트워크 장비의 설정이 어디까지 적용되어 있는지다.
설정 파일사용 시점포함된 네트워크 장비 설정
| spec_01.yaml | 1장 | L2 스위치·라우터·방화벽·부하 분산 장치 |
| spec_02.yaml | 2장 시작 | 각 장에서 배울 장비 기능 설정 전 |
| spec_03.yaml | 3장 시작 | L2 스위치 |
| spec_04.yaml | 4장 시작 | L2 스위치·라우터 |
| spec_05.yaml | 5장 시작 | L2 스위치·라우터·방화벽 |
설정이 없다는 것은 컨테이너가 없다는 뜻이 아니다. 해당 장에서 배울 기능의 설정이 아직 적용되지 않았다는 뜻이다.
예를 들어 spec_05.yaml을 사용하면 4장까지의 설정이 적용된 환경에서 5장 학습을 시작할 수 있다.
또한 DNS와 HTTP 서버의 기본 설정도 들어 있어, 별도의 검증 환경을 만들 때 참고할 수 있다.
참고용 명령어 모음
아래는 책의 명령어 표에 소개된 항목이다. 순서대로 모두 실행하는 목록이 아니라, 필요한 작업을 찾아보는 용도다.
WSL
명령용도
| wsl | 기본 인스턴스 시작·접속 |
| wsl --distribution <이름> | 지정 인스턴스 시작·접속 |
| wsl --user <사용자> | 지정 사용자로 접속 |
| wsl --list --verbose | 인스턴스 상태·버전 확인 |
| wsl --list --online | 설치 가능한 배포판 확인 |
| wsl --install --distribution <배포판> | 배포판 설치 |
| wsl --set-default <이름> | 기본 인스턴스 지정 |
| wsl --set-default-version <버전> | 새 인스턴스의 기본 버전 지정 |
| wsl --set-version <이름> <버전> | 인스턴스 버전 변경 |
| wsl --terminate <이름> | 지정 인스턴스 중지 |
| wsl --shutdown | 모든 WSL 인스턴스 중지 |
| wsl --export <이름> <파일> | 인스턴스 내보내기 |
| wsl --import <이름> <폴더> <파일> | 인스턴스 가져오기 |
| wsl --unregister <이름> | 인스턴스 등록 해제 |
| wsl --update | WSL 업데이트 |
| wsl --help | 도움말 |
자주 사용하는 축약형은 --distribution → -d, --user → -u, --list --verbose → -l -v, --terminate → -t다.
도커
명령용도
| docker create | 컨테이너 생성 |
| docker run | 컨테이너 생성·실행 |
| docker exec | 컨테이너 안에서 명령 실행 |
| docker ps | 컨테이너 목록 확인 |
| docker images | 이미지 목록 확인 |
| docker start | 컨테이너 시작 |
| docker stop | 컨테이너 중지 |
| docker restart | 컨테이너 재시작 |
| docker kill | 컨테이너 강제 중지 |
| docker rm | 컨테이너 제거 |
| docker rmi | 이미지 삭제 |
| docker pull | 이미지 다운로드 |
| docker search | 이미지 검색 |
| docker login | 레지스트리 로그인 |
| man docker | 도움말 |
tinet
명령용도
| tinet check -c <설정 파일> | 설정 파일 내용 확인 |
| tinet up -c <설정 파일> | sh -x | 컨테이너 생성·연결 |
| tinet conf -c <설정 파일> | sh -x | 장비 설정 적용 |
| tinet upconf -c <설정 파일> | sh -x | 생성과 설정을 함께 실행 |
| tinet test -c <설정 파일> | sh -x | 테스트 실행 |
| tinet down -c <설정 파일> | sh -x | 검증 환경 삭제 |
| tinet img -c <설정 파일> | dot -Tpng > <파일명> | 구성도 생성 |
| tinet --version | 버전 확인 |
| tinet --help | 도움말 |
이후 장에서는 이 환경을 바탕으로 패킷과 네트워크 장비의 동작을 살펴본다. tcpdump와 Wireshark를 이용한 패킷 캡처 실습은 2장부터 이어진다.
'네트워크 입문 프로토콜' 카테고리의 다른 글
| L2 스위치에 대해서 (0) | 2026.10.06 |
|---|---|
| 네트워크 입문: 이더넷 프레임부터 MAC 주소까지 (0) | 2026.09.30 |