Devin.KR

VLAN과 포트 설계

75분 안팎

학습 목표

VLAN 10·20·30·40과 access·trunk 포트의 구성도를 작성합니다.

개념

주소표만으로는 링크가 나뉘지 않습니다

학교 주소표에서 학생·교직원·서버·게스트의 /24를 나눴습니다. 그런데 네 역할의 단말을 필터링 없는 같은 브리지에 꽂으면 Ethernet 브로드캐스트 영역은 여전히 하나일 수 있습니다. 주소 설계와 스위치의 프레임 전달 범위를 일치시키기 위해 VLAN을 도입합니다. 이번 레슨의 산출물은 포트 구성도와 변경 표이며 장비 설정을 실행하기 전에 양쪽 trunk와 각 access의 역할을 검토합니다.

역할을 VLAN 식별자에 대응합니다

학생은 VLAN 10과 10.20.10.0/24, 교직원은 VLAN 20과 10.20.20.0/24, 서버는 VLAN 30과 10.20.30.0/24, 게스트는 VLAN 40과 10.20.40.0/24로 대응합니다. VLAN 번호와 IP 주소 세 번째 칸이 같은 것은 사람이 읽기 쉽게 정한 프로젝트 규칙입니다. VLAN 10이 자동으로 10.20.10.0/24 주소를 배포하거나 게이트웨이를 만드는 기능은 없습니다. 표에서 두 종류의 식별자를 별도 열로 둡니다.

같은 VLAN의 포트들은 하나의 링크 전달 영역으로 묶입니다. 서로 다른 VLAN 사이에는 일반적인 스위칭만으로 프레임을 넘기지 않습니다. 학생과 서버가 통신하려면 다음 모듈에서 VLAN별 인터페이스와 라우팅이 필요하고 서비스별 제한은 후속 방화벽 모듈에서 구현합니다. 지금 VLAN을 나눴다는 사실만으로 “게스트의 웹만 차단하고 DNS는 허용했다”라고 보고할 수 없습니다. 서비스 정책과 링크 분리는 다른 설계 단계입니다.

access는 단말 쪽의 단순한 약속입니다

s1·s2 같은 일반 단말은 이 실습에서 VLAN 태그 없는 프레임을 보냅니다. access 포트는 그 수신 프레임을 지정한 VLAN으로 분류하고 단말로 내보낼 때 태그를 제거합니다. 그래서 단말 주소 설정을 바꾸지 않고도 역할을 나눌 수 있습니다. p1이 학생용이면 수신 분류 VLAN은 10이고 송신 형식은 untagged입니다. 수신과 송신을 한 가지 “태그 없음” 문장으로 뭉치면 설정을 빠뜨리기 쉽습니다.

PVID는 태그 없는 수신 프레임을 어느 VLAN으로 볼지 정하는 값입니다. Egress Untagged는 그 VLAN 프레임을 해당 포트로 내보낼 때 태그를 제거한다는 뜻입니다. 두 기능은 방향이 다르므로 따로 기록합니다. Linux에서는 VLAN membership에 pvid와 untagged 플래그를 함께 지정해 access 동작을 만듭니다. pvid만 넣으면 송신 태그가 남아 일반 단말이 기대한 입력 형식과 달라질 수 있습니다.

access라는 이름이 모든 제품에서 태그 프레임을 동일하게 거부한다는 뜻은 아닙니다. 이번 Linux 구성은 포트별 허용 VLAN 하나와 PVID·송신 untagged를 검사합니다. 허용 VLAN에 맞는 태그 프레임 처리나 추가 ingress 정책은 별도 설정 문제입니다. 제출물에는 일반 단말이 untagged를 보낸다는 전제를 적습니다. 이 실습의 분리 검증을 악의적인 단말에 대한 모든 보안 통제로 확대 해석하지 않습니다.

trunk는 링크 하나로 여러 VLAN을 운반합니다

학교의 두 가상 스위치 역할을 brschool과 brannex가 맡습니다. s1은 brschool p1, s2는 brannex p2에 연결합니다. 두 브리지 사이의 u1·u2 veth가 trunk이며 VLAN 10·20·30·40을 tagged로 운반합니다. 다른 건물의 학생 두 단말을 같은 VLAN으로 연결하면서도 하나의 물리적 링크에 여러 역할의 프레임을 실을 수 있다는 설계입니다. trunk 자체가 IP 라우터 역할을 하지는 않습니다.

이번 trunk에는 native VLAN을 두지 않습니다. 태그 없는 프레임을 분류할 PVID를 0으로 표현하고 네 VLAN은 모두 태그를 유지합니다. 0은 주소표의 역할 VLAN이 아니라 기본 분류를 두지 않는 설계 값입니다. brschool u1과 brannex u2의 허용 목록이 같아야 링크 전체에서 해당 VLAN을 운반할 수 있습니다. 한쪽에서 VLAN 10을 빼면 학생 간 연결이 끊길 수 있지만 다른 VLAN의 설정이 자동으로 지워지는 것은 아닙니다.

허용 목록에 현재 학생 VLAN만 적을지 앞으로 쓸 교직원·서버·게스트도 포함할지는 설계 결정입니다. 이번 프로젝트 계약은 네 VLAN 모두로 고정합니다. 지금 brannex에 학생만 연결돼 있어도 다음 확장을 위해 포트 문서와 설정이 네 VLAN을 표시합니다. 특정 단말의 ping 성공만으로 사용되지 않는 세 VLAN 허용 목록까지 검증했다고 말하지 않습니다. 커널 VLAN 표를 별도로 대조하는 이유입니다.

포트 이름으로 연결을 추적합니다

ports.csv는 bridge,port,peer,mode,vlans,pvid,egress 일곱 열입니다. p1은 s1, p2는 s2, p3은 t1, p4는 server1, p5는 guest1으로 이어집니다. u1의 peer는 u2이고 u2의 peer는 u1입니다. 같은 파일에서 brschool p2라고 잘못 적으면 VLAN 숫자가 맞더라도 구성도가 실제 연결과 어긋납니다. 포트와 역할만이 아니라 브리지 소속까지 각 행의 식별 정보로 취급합니다.

vlans에는 access의 단일 숫자 또는 trunk의 10;20;30;40 문자열을 씁니다. 세미콜론은 CSV의 쉼표와 충돌하지 않게 선택한 내부 구분자입니다. 빈 허용 목록이나 중복 포트를 승인하지 않습니다. 표의 태그 여부는 egress 열에서 읽고 단말의 실제 수신 형식과 대조합니다. access에서 vlans=10인데 pvid=20이라고 적으면 수신 분류와 허용 범위가 충돌하므로 문서 단계에서 거부합니다.

주소표의 s1 .11과 s2 .12는 그대로 유지합니다. 기존 m02의 topology.json과 path.md는 앞 단계의 라우팅 이력이며 현재 VLAN 적용 상태는 switching.json과 vlan-plan.md로 추가합니다. 이번에는 .1 주소를 어느 브리지에도 배정하지 않고 r1의 IPv4 전달을 끕니다. 게이트웨이 열은 다음 모듈을 위한 예약 값입니다. 이전 파일의 forwarding=true를 현재 실행 상태로 오해하지 않도록 적용 단계와 비활성 상태를 명시합니다.

설계 리뷰는 패킷의 두 방향을 따라갑니다

s1의 untagged 프레임은 p1의 PVID 10으로 분류되고 u1에서 VLAN 10 태그를 가진 채 이동합니다. u2가 VLAN 10을 허용하면 brannex에서 p2로 전달하며 p2의 untagged 설정으로 태그를 제거합니다. s2 응답은 반대 순서입니다. 이 설명을 구성도 화살표 위에 적어 단말→access→trunk→access→단말의 각 경계에서 형식이 바뀌는지 검토합니다. IP 주소를 변경하는 단계는 없습니다.

포트 오배정은 IP 대역을 새로 계산한다고 해결되지 않습니다. 학생 s2를 VLAN 20에 넣은 경우 .12/24는 여전히 학생 주소지만 ARP가 학생 VLAN에 도달하지 않습니다. 이때 주소표를 교직원 대역으로 바꾸면 잘못 꽂힌 포트를 정당화하며 원래 요구를 깨뜨립니다. 먼저 승인된 역할과 포트의 차이를 수정합니다. 역할을 의도적으로 바꿀 때만 주소·VLAN·서비스 정책 변경을 묶어 별도 설계합니다.

제출물에는 네 역할의 대역과 VLAN, 각 단말의 access 포트, 양쪽 trunk 허용 목록, 태그가 붙고 제거되는 위치, 게이트웨이의 예약 상태가 있어야 합니다. 동료가 s1에서 s2까지의 길을 그림만으로 찾고 server1까지 아직 갈 수 없는 이유를 설명할 수 있으면 설계 리뷰가 가능합니다. 전체 네트워크 계층과 캡슐화는 서재로 연결하고 이 표에서는 VLAN membership과 프레임 형식의 약속을 명확히 합니다.

따라하기

네 역할의 대응표를 만듭니다

이 출력은 주소 배포 결과가 아니라 검토할 설계 표입니다.

for role,vid in [('student',10),('staff',20),('server',30),('guest',40)]:
    print(role,'VLAN',vid,'10.20.'+str(vid)+'.0/24')

실행 결과

student VLAN 10 10.20.10.0/24
staff VLAN 20 10.20.20.0/24
server VLAN 30 10.20.30.0/24
guest VLAN 40 10.20.40.0/24

한 프레임의 태그 경계를 추적합니다

학생 프레임의 방향별 형식입니다. PVID는 수신 분류이고 untagged는 송신 처리입니다.

for point,form in [('s1->p1','untagged'),('u1->u2','tagged:10'),('p2->s2','untagged')]:
    print(point,form)

실행 결과

s1->p1 untagged
u1->u2 tagged:10
p2->s2 untagged

trunk 양쪽의 교집합을 구합니다

한쪽 누락이 통과 가능한 목록을 줄이는 설계 모형입니다. 실제 bridge 검사와 구분합니다.

left={20,30,40}
right={10,20,30,40}
print('end-to-end:',','.join(map(str,sorted(left & right))))
print('missing:',','.join(map(str,sorted(right-left))))

실행 결과

end-to-end: 20,30,40
missing: 10

일곱 포트의 구성도 초안을 출력합니다

출력의 각 행을 vlan-plan.md 화살표와 ports.csv 초안으로 옮깁니다. 미션 파일에 기록할 포트 이름과 소속을 먼저 확인하는 계산입니다.

rows=[("brschool","p1","s1","10"),("brannex","p2","s2","10"),("brschool","p3","t1","20"),("brschool","p4","server1","30"),("brschool","p5","guest1","40"),("brschool","u1","u2","10;20;30;40"),("brannex","u2","u1","10;20;30;40")]
for row in rows:
    print(",".join(row))

실행 결과

brschool,p1,s1,10
brannex,p2,s2,10
brschool,p3,t1,20
brschool,p4,server1,30
brschool,p5,guest1,40
brschool,u1,u2,10;20;30;40
brannex,u2,u1,10;20;30;40

확인 문제

실습

vlan-plan.md와 ports.csv 초안을 제출합니다. 네 역할의 /24·VLAN 10/20/30/40, p1~p5 단말과 브리지 소속, u1/u2 peer와 tagged 허용 목록, access PVID·송신 untagged, 학생 프레임의 태그 경계 화살표를 표시합니다. .1은 예약 비활성으로 기록합니다. 동료가 s1→s2의 두 방향과 아직 server1으로 통신하지 못하는 이유를 설명할 수 있어야 합니다. 제출 기준은 일곱 포트 누락·중복 없음, 양쪽 trunk 목록 동일, 역할 주소표 유지입니다.

더 읽기

면접 질문

  • VLAN을 나누고 통신을 허용하는 구성을 설명합니다.