1. RHEL 9 서버 신규 구축 시 네트워크 본딩 구성 방법 (active-backup 구성)

안녕하세요 오늘은 **RHEL 9 서버를 새로 구축하면서 네트워크 본딩(Network Bonding)**을 설정했던 과정을 공유해보려고 합니다. 서버에 네트워크 카드가 2장이 장착되어 있고, 이를 하나의 논리적 인터페이스로 묶어 고가용성과 이중화를 구성하는 게 목표였습니다.

특히 저는 active-backup 모드를 사용하면서 primary_reselect=failure 옵션을 설정해, 장애 복구 시 불필요한 네트워크 스위칭을 방지하고 싶었습니다. 그 과정과 설정 방법을 단계별로 정리해볼게요.

네트워크 본딩은 두 개 이상의 물리적 네트워크 인터페이스를 하나의 논리적 인터페이스로 묶어주는 기술입니다. 이를 통해 다음과 같은 장점을 얻을 수 있습니다:

고가용성(High Availability): 한 쪽 네트워크에 장애가 나도 다른 쪽으로 자동 전환

  • 로드 밸런싱: 트래픽을 여러 인터페이스에 분산
  • 대역폭 증가: 물리적 인터페이스의 대역폭을 합산

저는 이번 구축에서 고가용성 목적으로 본딩을 설정했습니다.

2. 본딩 모드 종류

본딩에는 여러 가지 모드가 있으며, 각각의 특징과 동작 방식이 다릅니다. 아래 표로 정리해봤습니다.

모드 번호모드 이름설명
0balance-rr라운드 로빈 방식. 모든 인터페이스에 순차적으로 트래픽 전송.
1active-backup하나의 인터페이스 active. 장애 시 backup으로 전환.
2balance-xor송수신 해시 기반으로 트래픽 분산.
3broadcast모든 인터페이스에 동일한 패킷 전송.
4802.3ad (LACP)IEEE 802.3ad (LACP) 기반 링크 집계. 스위치 설정 필요.
5balance-tlb송신 부하 분산. 수신은 단일 인터페이스로 수신.
6balance-alb송수신 모두 부하 분산.

참고: 일반적으로 스위치 설정 없이 고가용성을 원할 땐 **mode=1 (active-backup)**을 많이 사용합니다.

3. ethtool로 인터페이스 확인

본딩 설정 전에 어떤 인터페이스를 사용할지 정확히 확인해야 합니다. 저는 ethtool 명령어를 사용했습니다.

ethtool eno1 ethtool ensfo1

출력 결과에서 Link detected: yes로 연결 여부를 확인하고, 속도(Speed), 드라이버 정보도 함께 확인했습니다. 이 과정으로 실제 연결된 인터페이스와 속성을 파악할 수 있습니다.

4. primary 인터페이 + primary_reselect 옵션 설정

active-backup 모드에서는 기본적으로 primary_reselect=always 옵션이 적용됩니다. 이 옵션은 primary 인터페이스가 복구되면 무조건 active로 다시 전환되도록 만듭니다.

지만 저는 이렇게 설정하면 복구 시 네트워크 스위칭 과정에서 ping 유실, 순간적 연결 끊김 현상이 발생한다는 문제를 발견했습니다. 이를 방지하기 위해 다음과 같은 설정을 원했습니다:

  • eno1: primary (초기 active)
  • ensfo1: backup
  • eno1 장애 시 → ensfo1 active
  • eno1 복구해도 active는 ensfo1 유지
  • 이후 ensfo1 장애 시 → eno1로 active 전환

이렇게 하려면 primary_reselect=failure 옵션을 설정해야 합니다.

primary_reselect 옵션 종류 참고로 primary_reselect에는 아래와 같은 값이 있습니다:

옵션 이름설명
alwaysprimary가 복구되면 무조건 primary로 active 전환 (기본값)
betterprimary가 복구되고 성능(링크 속도, duplex 등)이 더 좋으면 active 전환
failureprimary가 장애 상태였다가 복구될 때만 active 전환

저는 failure로 설정하여 불필요한 active 전환을 방지했습니다.

5. nmcli를 이용한 본딩 설정

이제 실제로 nmcli를 이용해 본딩을 설정한 과정을 정리해볼게요.

① 본딩 인터페이스 생성 nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup bond0이라는 이름으로 본딩 인터페이스를 생성하고, active-backup 모드를 지정했습니다.

② primary, primary_reselect 옵션 지정 `nmcli connection modify bond0 bond.options “primary=eno1 primary_reselect=failure”

이 명령어로 eno1을 primary로 지정하고, primary_reselect=failure를 적용했습니다.

③ IP 주소 설정

nmcli connection modify bond0 ipv4.addresses 192.168.1.100/24
nmcli connection modify bond0 ipv4.gateway 192.168.1.1
nmcli connection modify bond0 ipv4.method manual

IP 주소와 게이트웨이를 수동으로 설정했습니다.

④ 슬레이브 인터페이스 추가

nmcli connection add type ethernet con-name eno1-slave ifname eno1 master bond0
nmcli connection add type ethernet con-name ensfo1-slave ifname ensfo1 master bond0

본딩에 eno1, ensfo1을 슬레이브 인터페이스로 추가합니다.

⑤ 연결 활성화

nmcli connection up eno1-slave
nmcli connection up ensfo1-slave
nmcli connection up bond0

모든 연결을 활성화하여 설정을 적용했습니다.

6. 설정 확인

설정 완료 후 본딩 상태는 아래 명령어로 확인했습니다:

cat /proc/net/bonding/bond0

여기서 현재 active 인터페이스, primary 설정 등을 확인할 수 있습니다.

7. 장애 테스트

설정 테스트를 위해 ethtool로 링크 다운 시뮬레이션을 했습니다:

ethtool -s eno1 down

→ eno1 장애 발생 → ensfo1로 active 전환

ethtool -s eno1 up

→ eno1 복구 → active는 여전히 ensfo1 유지

이렇게 설정하면 불필요한 네트워크 스위칭 없이 안정적으로 failover 동작을 구현할 수 있었습니다.

마치며

이번 구축 과정에서 느낀 점은, 본딩은 단순히 인터페이스를 묶는 것 이상으로 장애 상황 시 네트워크 동작 방식을 어떻게 정의할지에 대한 고민이 필요하다는 점입니다. primary_reselect 같은 세부 옵션 하나로도 실제 장애 대응 방식이 크게 달라질 수 있더라고요