VLAN 간 라우팅
120분 안팎
학습 목표
실습 라우터의 VLAN 인터페이스·IP 전달·정적 경로를 구성합니다.
개념
분리를 유지하면서 필요한 연결을 추가합니다
m03은 학생·교직원·서버·게스트의 링크 영역을 분리했습니다. 다른 VLAN끼리 연결되지 않는 것이 그 단계의 정상 상태였습니다. 이제 학교 서버로 가는 IP 경로를 추가합니다. 브리지 필터를 끄거나 모든 단말을 VLAN 10으로 옮기면 이전 성과가 사라집니다. access 포트와 trunk 허용 목록을 보존하고 라우터가 각 VLAN에서 프레임을 받아 다른 VLAN으로 전달하도록 구성합니다.
예약 게이트웨이를 실제 인터페이스로 만듭니다
r1 네임스페이스 안의 brschool에 v10, v20, v30, v40이라는 VLAN 인터페이스를 만듭니다. 각각 VLAN ID 10, 20, 30, 40이고 주소는 10.20.번호.1/24입니다. 학생 s2가 brannex에 있어도 VLAN 10 trunk를 거쳐 brschool의 v10에 도달합니다. 기존 주소표의 .1 예약값을 바꾸는 것이 아니라 활성화하는 것입니다. 같은 학생 대역의 .1을 두 브리지에 중복 배정하지 않습니다.
브리지 self membership을 추가합니다
포트 p1과 u1의 VLAN membership은 통과 프레임을 제어합니다. brschool 자체가 VLAN 프레임을 로컬 VLAN 인터페이스로 받으려면 각 VID의 self membership도 필요합니다. activate.sh는 bridge vlan add dev brschool vid 10 self와 같은 항목을 네 개 추가합니다. 포트 membership과 브리지 로컬 membership을 별개로 읽습니다. self 하나를 추가했다고 다른 access 포트의 역할 VLAN이 바뀌지는 않습니다.
직접 연결 경로와 정적 경로를 구분합니다
v30에 10.20.30.1/24를 넣으면 r1에는 서버 /24의 직접 연결 경로가 생깁니다. r1에서 서버 대역을 다시 자기 .1 주소 via로 지정할 필요가 없습니다. 이번 정적 경로는 server1에서 학생·교직원·게스트 대역으로 돌아가기 위해 10.20.30.1을 다음 홉으로 지정하는 행입니다. 모든 대역에 정적 경로가 있어야 한다는 이유로 중복 경로를 만들지 않고 실제로 직접 연결되지 않은 목적지에만 설정합니다.
IP 전달은 네임스페이스 안에서 켭니다
r1에서 net.ipv4.ip_forward를 1로 바꾸면 다른 인터페이스로 IPv4 패킷을 전달할 조건을 갖춥니다. 명령 앞의 ip netns exec bcnet-r1이 빠지면 VM 호스트의 설정을 바꿀 수 있으므로 실행 범위를 확인합니다. 학생 단말의 forwarding은 계속 0입니다. 라우터 주소로 ping이 된다고 transit 전달까지 검증한 것은 아닙니다. 라우터가 자기 주소로 받은 패킷과 서버로 넘길 패킷의 경로는 다릅니다.
학교 서버까지의 흐름을 추적합니다
s1은 서버가 자기 /24 밖에 있음을 확인하고 기본 게이트웨이 10.20.10.1의 MAC을 찾습니다. p1에서 VLAN 10으로 분류된 프레임이 v10에 도착하면 r1은 서버 목적지에 대해 v30 직접 연결 경로를 선택합니다. v30에서 서버의 MAC을 찾아 VLAN 30 프레임을 p4로 보내고 access 송신에서 태그를 제거합니다. 서버 응답은 자기 경로 표로 학생 대역을 찾아 10.20.30.1로 보냅니다.
시작 코드의 오류를 먼저 문서에서 잡습니다
starter의 routes.csv에서 server1 학생 대역 다음 홉이 10.20.10.1로 잘못 쓰여 있습니다. 서버의 eth0는 10.20.30.0/24에 있으므로 그 값은 이번 링크의 정상 게이트웨이가 아닙니다. python3 test_routing.py가 routes mismatch로 중단하면 행의 destination, next_hop, interface, kind를 확인합니다. 정답 파일을 보지 않고도 주소표의 server1 gateway 열로 올바른 다음 홉을 계산할 수 있습니다.
설정 오류 메시지에서 계층을 좁힙니다
Cannot find device는 해당 네임스페이스 안에 인터페이스가 있는지 확인할 신호입니다. Nexthop has invalid gateway는 지정한 via가 해당 링크에서 도달 가능한 주소인지 조사할 근거입니다. File exists는 이미 같은 장치나 경로가 있는지 읽어야 하는 중복 오류입니다. 이 오류를 해결하려고 호스트 eth0에 학교 주소를 추가하지 않습니다. 자동 검사기는 기존 네임스페이스 이름이 충돌하면 삭제하지 않고 중단합니다.
적용과 승인은 서로 다른 작업입니다
setup.sh는 이전 m03 설정을 만들고 activate.sh로 현재 라우팅을 추가합니다. check.sh는 문서 검사 후 실제 표와 전송을 대조하고 EXIT 정리로 이번 실행의 공간을 제거합니다. 수동 setup을 사용했다면 cleanup.sh로 먼저 자기 공간을 정리한 뒤 전체 검사를 실행합니다. 삭제 전에 해당 공간의 프로세스 존재를 검사하며 임의 종료하지 않습니다. 실패 시에도 오류 원문과 당시 표를 남겨 재현 조건을 유지합니다.
이번 연결이 서비스 정책을 완성하지는 않습니다
현재 라우터는 네 역할의 대역을 연결하며 서비스별 허용 목록은 적용하지 않습니다. VLAN은 브로드캐스트 영역 분리이고 라우팅은 다른 IP 대역 사이의 경로입니다. 학생에서 서버 ICMP가 성공한 사실을 웹·DNS·권한 정책 완료로 보고하지 않습니다. 게스트를 포함한 세부 서비스 제한은 m08에서 설계합니다. 제출물에는 이번 연결의 범위와 남은 정책 작업을 적어 다음 담당자가 라우팅 가능성을 승인된 서비스 권한으로 오해하지 않게 합니다.
인터페이스 이름으로 주소를 찾습니다
v10이라는 이름은 이 실습의 명명 계약이며 VLAN 번호는 link 상세 정보의 id로 확인합니다. 이름만 보고 실제 태그가 10이라고 확정하지 않습니다. ip -d link와 ip -4 addr를 함께 읽어 VLAN ID·부모 brschool·주소 /24가 모두 일치하는지 확인합니다. p1은 단말에 연결된 브리지 포트이고 v10은 라우터의 로컬 IP 인터페이스라는 차이를 그림에 적습니다. 이 구분이 없으면 단말 포트마다 게이트웨이 주소를 넣는 중복 구성으로 이어질 수 있습니다.
명령 문법은 ip-route 매뉴얼, 전달 스위치 의미는 Linux 커널 IP sysctl 문서에서 확인할 수 있습니다.
따라하기
경로 문서 결함을 고칩니다
starter의 server1 학생 응답 next_hop을 10.20.30.1로 수정한 뒤 실행합니다.
python3 test_routing.py기준 상태를 구성하고 읽습니다
Linux VM에서 실행하며 표를 routes.csv와 비교합니다. 관측 출력은 직접 저장합니다.
sudo bash setup.sh
sudo ip -n bcnet-r1 route show
sudo ip -n bcnet-server1 route show왕복과 결함 복구를 검사합니다
학생·교직원 서버 연결과 서버 학생 경로 삭제 실패·복구 성공을 검사합니다. route get은 수신 캡처가 아닙니다.
sudo python3 verify_network.py공간을 정리하고 전체 재현합니다
수동 공간을 정리한 뒤 새 공간에서 전체 검사와 호스트 보존을 확인합니다.
sudo bash cleanup.sh
sudo bash check.sh확인 문제
실습
routes.csv의 잘못된 서버 학생 다음 홉을 수정합니다. python3 test_routing.py로 문서 검사 후 Linux VM에서 sudo bash check.sh를 실행합니다. 검사 범위는 기존 VLAN 계약, 11개 경로 행과 실제 표, 학생·교직원 서버 왕복, /32 우선, 학생 응답 경로 삭제 후 실패·교직원 성공과 복구, 공간 정리 및 호스트 전후 동일입니다. README의 수동 명령으로 단계별 원문을 기록합니다. 커널 실습은 external 확인 대기입니다.
실행 명령
sudo bash check.sh
기대 결과
문서 5건 통과, 커널 경로 일치, 서버 ICMP 왕복 및 응답 경로 결함·복구 확인, 호스트 보존. Linux 실행 확인 대기.
모범 답안
모범 답안 내려받기더 읽기
면접 질문
- VLAN을 나누고 통신을 허용하는 구성을 설명합니다.