IT·테크/인프라

VLAN 부하분산과 이더채널 — 놀고 있는 회선을 일하게 만들기

레루루 2026. 8. 8. 21:35
반응형

이 글은 2021년 11월 기준 기록입니다.

 

STP는 루프를 없애기 위해 포트를 막습니다. 그래서 회선을 두 줄 뽑아도 실제로 트래픽이 흐르는 것은 한 줄뿐입니다. 이 낭비를 회수하는 방법이 두 가지 있습니다. VLAN마다 다른 경로를 쓰게 하거나, 아예 여러 회선을 한 회선처럼 묶어 버리는 것입니다.

부하분산에는 두 가지 전제 조건이 있다

부하분산은 복수 개의 경로로 트래픽을 분산시키는 것입니다. 2계층 스위치에서 설정해 네트워크 성능을 향상시킬 수 있습니다.

다만 VLAN 부하분산을 하려면 반드시 VLAN이 2개 이상이고 스위치가 루프 구조를 가져야 합니다. 나눌 대상이 둘 이상 없거나 나눠 갈 경로가 하나뿐이면 성립하지 않기 때문입니다.

 

VLAN 부하분산에 영향을 주는 요소는 STP가 경로를 고를 때 쓰는 값들과 같습니다. 루트 ID, 경로값, 브리지 ID, 포트 ID입니다. 이 넷 중 무엇을 건드리느냐에 따라 방법이 갈립니다.

경로값은 대개 유일하게 손댈 수 있는 값이다

네 가지 요소 중 현재 스위치에서 경로값이 유일하게 설정 가능한 경우가 많습니다. 루트 ID나 상대 스위치의 브리지 ID는 다른 장비의 영역이기 때문입니다.

 

경로값은 인터페이스에서 VLAN별로 지정합니다.

// 해당 포트에서
spanning-tree vlan 10 cost ?
spanning-tree vlan 20 cost ?

VLAN 10은 e0/1을, VLAN 20은 e0/0을 쓰게 하려면 각 VLAN이 쓰길 원하는 포트의 경로값을 낮춰 줍니다.

// SW4에서 각 vlan이 사용할 포트에 경로값 설정
SW4(config)#int e0/1
SW4(config-if)#spanning-tree vlan 10 cost 10

SW4(config)#int e0/0
SW4(config-if)#spanning-tree vlan 20 cost 10
SW4(config-if)#exit

결과를 보면 VLAN마다 막힌 포트가 반대로 갈렸습니다.

// SW4에서 각 VLAN별 차단 포트 확인
SW4(config)#do sh span

VLAN0010
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Altn BLK 100       128.1    Shr
Et0/1               Root FWD 10        128.2    Shr

VLAN0020
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Root LRN 10        128.1    Shr
Et0/1               Altn BLK 100       128.2    Shr

다른 방식을 확인하기 위해 경로값을 원래대로 되돌립니다.

// 다른 방식 확인을 위해 경로값 원래대로 설정
SW4(config)#int e0/1
SW4(config-if)#no spanning-tree vlan 10 cost
SW4(config-if)#int e0/0
SW4(config-if)#no spanning-tree vlan 20 cost
SW4(config-if)#exit

브리지 ID를 쓰면 스위치 단위로 갈린다

각각의 VLAN에 대해 스위치별로 우선순위 값을 조정하는 방법입니다. 포트 단위가 아니라 스위치 단위로 경로가 갈립니다.

// 해당 스위치에서
spanning-tree vlan 10 priority ?
spanning-tree vlan 20 priority ?

SW2를 VLAN 10 쪽에서, SW3을 VLAN 20 쪽에서 앞세웁니다.

// 각 스위치에서 해당하는 VLAN 우선순위 변경
SW2(config)#spanning-tree vlan 10 priority 8192
SW3(config)#spanning-tree vlan 20 priority 8192
// SW4에서 확인
SW4(config)#do sh span

VLAN0010
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Altn BLK 100       128.1    Shr
Et0/1               Root FWD 100       128.2    Shr

VLAN0020
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Root LIS 100       128.1    Shr
Et0/1               Altn BLK 100       128.2    Shr

경로값을 건드리지 않았는데도 VLAN별 경로가 갈렸습니다.

포트 ID는 상대 스위치에서 조정해야 한다

스위치 간에 복수 개의 케이블로 연결된 경우, 루트 스위치가 가까운 쪽 스위치의 포트 ID를 조정해서 부하를 나눕니다. 여기서 주의할 점이 있습니다. 포트 ID는 상대 스위치에서 설정해야 합니다. 루트 포트를 고르는 쪽이 참조하는 것이 자신의 포트 ID가 아니라 인접 스위치의 포트 ID이기 때문입니다.

 

SW2가 판단을 바꾸게 하려면 SW1에서 설정합니다.

// SW1에서 포트 우선순위 설정
SW1(config)#int e1/0
SW1(config-if)#spanning-tree vlan 20 port-priority 64

SW2에서 보면 VLAN 20의 루트 포트가 Et1/0으로 바뀌어 있습니다.

// SW2에서 확인
SW2(config)#do sh span

VLAN0010
Spanning tree enabled protocol ieee
Root ID    Priority    10
Address     aabb.cc00.0100
Cost        100
Port        1 (Ethernet0/0)
Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
Bridge ID  Priority    32778  (priority 32768 sys-id-ext 10)
Address     aabb.cc00.0200
Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
Aging Time  300 sec

Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Root FWD 100       128.1    Shr
Et0/1               Desg FWD 100       128.2    Shr
Et1/0               Altn BLK 100       128.5    Shr

VLAN0020
Spanning tree enabled protocol ieee
Root ID    Priority    20
Address     aabb.cc00.0100
Cost        100
Port        5 (Ethernet1/0)
Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
Bridge ID  Priority    32788  (priority 32768 sys-id-ext 20)
Address     aabb.cc00.0200
Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
Aging Time  15  sec

Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Altn BLK 100       128.1    Shr
Et0/1               Desg FWD 100       128.2    Shr
Et1/0               Root LRN 100       128.5    Shr

설정을 넣은 SW1 쪽에서는 포트 역할이 그대로입니다. 바뀐 것은 Prio.Nbr 값뿐입니다.

// SW1에서 확인
SW1#sh spanning-tree

VLAN0010
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Desg FWD 100       128.1    Shr
Et0/1               Desg FWD 100       128.2    Shr
Et1/0               Desg FWD 100       128.5    Shr

VLAN0020
...
Interface           Role Sts Cost      Prio.Nbr Type
Et0/0               Desg FWD 100       128.1    Shr
Et0/1               Desg FWD 100       128.2    Shr
Et1/0               Desg FWD 100        64.5    Shr

값을 바꾼 쪽이 아니라 그것을 읽는 쪽이 움직인다는 점이 포트 ID 방식의 특징입니다.

이더채널은 여러 포트를 STP에게 하나로 보이게 한다

부하분산이 VLAN을 갈라 회선에 나눠 태우는 방식이라면, 이더채널은 두 스위치 간에 연결된 복수 개의 포트를 하나의 포트처럼 동작시킵니다. 시스코가 아닌 회사(벤더)에서는 이를 트렁크라고 부르기도 합니다.

 

프로토콜은 두 가지입니다. PAgP는 시스코에서 만들었고 최대 8개까지 하나의 포트로 묶을 수 있습니다. LACP는 IEEE에서 만들었으며 16포트까지 구성 가능하나 8개를 사용하고 나머지 8개는 백업으로 둡니다.

 

이더채널이 STP의 낭비를 해결하는 이유는 간단합니다. STP는 이더채널을 하나의 포트로 간주하기 때문에, 묶인 포트들 사이에서 루프를 찾지 않고 따라서 아무것도 막지 않습니다.

 

묶으려면 조건이 맞아야 합니다. 액세스 포트를 구성하려면 모든 포트의 속도, 두플렉스, VLAN 번호가 같아야 하고, 트렁크 포트를 구성하려면 인캡슐레이션, 네이티브 VLAN, 허용 VLAN이 같아야 합니다.

 

이더채널은 기본적으로 출발지 MAC 주소를 가지고 부하분산을 합니다. 방식을 변경하려면 다음을 씁니다.

port-channel load-balance ?

협상 모드는 다섯 가지이고, 어느 프로토콜을 쓰느냐와 먼저 나설 것이냐로 갈립니다.

  • active — 무조건 LACP. 상대 스위치와 협상하여 이더채널 멤버 포트를 활성화합니다.
  • passive — 상대 스위치가 LACP를 사용하면 LACP를 활성화합니다.
  • auto — 상대 스위치가 PAgP를 사용하면 PAgP를 활성화합니다.
  • desirable — 무조건 PAgP. 상대 스위치와 협상합니다.
  • on — 상대 스위치와 협상하지 않고 포트를 모두 활성화합니다.

라우티드 이더채널 — 3계층 포트로 묶는다

각 인터페이스에 no switchport를 설정해 3계층 포트로 만든 뒤 채널 그룹으로 묶습니다.

SW1(config)#int range e0/0-1
SW1(config-if-range)#no switchport
// 이더채널로 묶을 번호 지정해주고 이더채널 협상 모드를 active
SW1(config-if-range)#channel-group 12 mode active

SW2(config)#int range e0/0-1
SW2(config-if-range)#no switchport
SW2(config-if-range)#channel-group 12 mode active

묶인 상태는 요약 정보로 확인합니다.

// 이더채널 요약 정보 확인
SW1#sh etherchannel summary

IP는 개별 인터페이스가 아니라 포트 채널 인터페이스에 줍니다. 이더채널이 하나의 포트이기 때문입니다.

// 이더채널 포트에 IP 넣기
SW1(config)#int port-channel 12
SW1(config-if)#ip add 1.1.12.1 255.255.255.0

SW2(config)#int po 12
SW2(config-if)#ip add 1.1.12.2 255.255.255.0

3계층 정보를 보면 물리 인터페이스는 주소가 없고 포트 채널에만 주소가 붙어 있습니다.

// 인터페이스 3계층 정보 조회
SW1#sh ip int bri
Interface              IP-Address      OK? Method Status                Protocol
Ethernet0/0            unassigned      YES manual up                    up
Ethernet0/1            unassigned      YES manual up                    up
...
Serial4/3              unassigned      YES unset  administratively down down
Port-channel12         1.1.12.1        YES manual up                    up

포트 채널 인터페이스를 자세히 보면 대역폭이 20000 Kbit/sec으로, 두 포트가 합쳐진 것을 확인할 수 있습니다. Members in this channel 항목에 어떤 포트가 묶였는지도 나옵니다.

// 포트 채널 12 인터페이스 정보 확인
SW1#sh int po 12
Port-channel12 is up, line protocol is up (connected)
Hardware is EtherChannel, address is aabb.cc80.0100 (bia aabb.cc80.0100)
Internet address is 1.1.12.1/24
MTU 1500 bytes, BW 20000 Kbit/sec, DLY 1000 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Auto-duplex, Auto-speed, media type is unknown
input flow-control is off, output flow-control is unsupported
Members in this channel: Et0/0 Et0/1
ARP type: ARPA, ARP Timeout 04:00:00
Last input never, output never, output hang never
Last clearing of "show interface" counters never
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
15 packets input, 3120 bytes, 0 no buffer
Received 0 broadcasts (0 IP multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 input packets with dribble condition detected
19 packets output, 4209 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 unknown protocol drops
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier
0 output buffer failures, 0 output buffers swapped out

SVI 이더채널 — VLAN 인터페이스에 주소를 준다

각 인터페이스를 액세스로 VLAN에 할당한 뒤 채널 그룹으로 묶고, IP는 VLAN 인터페이스에 줍니다.

SW1(config)#int range e1/0-1
SW1(config-if-range)#sw ac vlan 13
SW1(config-if-range)#sw mo ac
SW1(config-if-range)#channel-group 13 mode desirable

SW3(config)#int range e1/0-1
SW3(config-if-range)#sw ac vlan 13
SW3(config-if-range)#sw mo ac
SW3(config-if-range)#channel-group 13 mode desirable

SW1(config)#int vlan 13
SW1(config-if)#no sh
SW1(config-if)#ip add 1.1.13.1 255.255.255.0

SW3(config)#int vlan 13
SW3(config-if)#no sh
SW3(config-if)#ip add 1.1.13.3 255.255.255.0

액세스 포트 이더채널 — 협상 없이 묶는다

각 인터페이스에 액세스 설정을 하고 채널 그룹으로 묶습니다. 여기서는 on 모드를 써서 협상 없이 붙입니다.

SW2(config)#int range e1/0-1
SW2(config-if-range)#sw ac vlan 24
SW2(config-if-range)#sw mo ac
SW2(config-if-range)#channel-group 24 mode on

SW4(config)#int range e1/0-1
SW4(config-if-range)#sw ac vlan 24
SW4(config-if-range)#sw mo ac
SW4(config-if-range)#channel-group 24 mode on

요약 정보를 보면 프로토콜 칸이 갈립니다. LACP로 묶은 12번은 프로토콜이 표시되고, on으로 묶은 24번은 협상을 하지 않았으므로 -입니다.

// SW2에서 확인
SW2#sh etherc sum
...
Number of channel-groups in use: 2
Number of aggregators:           2

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
12     Po12(RU)        LACP      Et0/0(P)    Et0/1(P)
24     Po24(SU)         -        Et1/0(P)    Et1/1(P)

트렁크 포트 이더채널 — PAgP를 양쪽에서 다르게 건다

각 인터페이스에 트렁크 설정을 하고 묶습니다. 한쪽은 desirable, 다른 쪽은 auto로 두어도 PAgP 협상이 성립합니다.

SW3(config)#int range e0/0-1
SW3(config-if-range)#sw tr enc dot
SW3(config-if-range)#sw mo tr
SW3(config-if-range)#channel-group 34 mode desirable

SW4(config)#int range e0/0-1
SW4(config-if-range)#sw tr enc dot
SW4(config-if-range)#sw mo tr
SW4(config-if-range)#channel-group 34 mode auto

설정은 포트 채널에서 바꿔야 한다

이더채널을 만든 뒤에 설정을 변경하려면 개별 인터페이스가 아니라 포트 채널에서 해야 합니다. 이 규칙을 어기면 채널이 통째로 멈춥니다.

먼저 현재 상태를 봅니다. 포트 채널과 구성 인터페이스가 모두 트렁크입니다.

// 변경 전 확인
SW3#sh run
Building configuration...
!
interface Port-channel34
switchport trunk encapsulation dot1q
switchport mode trunk
!
interface Ethernet0/0
switchport trunk encapsulation dot1q
switchport mode trunk
channel-group 34 mode desirable
!
interface Ethernet0/1
switchport trunk encapsulation dot1q
switchport mode trunk
channel-group 34 mode desirable
!

포트 채널에서 액세스로 바꿔 봅니다.

// 각 인터페이스가 아닌 묶어 준 포트 채널에서 설정을 변경
SW3(config)#int port-channel 34
SW3(config-if)#switchport mode access

포트 채널의 설정을 변경하면 자동으로 구성하는 인터페이스 설정도 함께 변경됩니다.

// 변경 후 확인
SW3#sh run
Building configuration...
!
interface Port-channel34
switchport trunk encapsulation dot1q
switchport mode access
!
interface Ethernet0/0
switchport trunk encapsulation dot1q
switchport mode access
channel-group 34 mode desirable
!
interface Ethernet0/1
switchport trunk encapsulation dot1q
switchport mode access
channel-group 34 mode desirable
!

반대로 구성 인터페이스 쪽을 바꾸면 어떻게 되는지 확인합니다.

// 구성하는 인터페이스 설정을 바꿔보기
SW3(config)#int range e0/0-1
SW3(config-if-range)#sw mo tr
// 포트 채널 설정이 변경되지 않아서 포트 채널이 작동하지 않음
*Jan 22 01:20:00.064: %EC-5-CANNOT_BUNDLE2: Et0/0 is not compatible with Po34 and will be suspended (dtp mode of Et0/0 is on, Po34 is off)
*Jan 22 01:20:00.064: %EC-5-CANNOT_BUNDLE2: Et0/1 is not compatible with Po34 and will be suspended (dtp mode of Et0/1 is on, Po34 is off)

포트 채널과 구성 인터페이스의 설정이 어긋나면 멤버 포트가 suspend됩니다.

// 확인
SW3#sh run
Building configuration...
!
interface Port-channel34
switchport trunk encapsulation dot1q
switchport mode access
!
interface Ethernet0/0
switchport trunk encapsulation dot1q
switchport mode trunk
channel-group 34 mode desirable
!
interface Ethernet0/1
switchport trunk encapsulation dot1q
switchport mode trunk
channel-group 34 mode desirable
!

이더채널을 없애도 포트 채널은 남는다

멤버 포트에서 채널 그룹을 빼도 포트 채널 인터페이스 자체는 살아 있습니다.

SW3(config)#int range e0/0-1
SW3(config-if-range)#no channel-group
// 확인
!
interface Port-channel34
switchport trunk encapsulation dot1q
switchport mode access
!
interface Ethernet0/0
switchport trunk encapsulation dot1q
switchport mode trunk
!
interface Ethernet0/1
switchport trunk encapsulation dot1q
switchport mode trunk
!

요약 정보에서도 34번 그룹은 멤버 없이 SD 상태로 남아 있습니다.

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
13     Po13(SU)        PAgP      Et1/0(P)    Et1/1(P)
34     Po34(SD)         -

따라서 포트 채널은 따로 지워야 합니다.

SW3(config)#no int port-channel 34

STP가 막아 둔 회선을 되찾는 두 방법은 성격이 다릅니다. 부하분산은 VLAN 단위로 경로를 갈라 놓는 것이고, 이더채널은 여러 회선을 STP의 시야에서 하나로 만들어 버리는 것입니다.

반응형