RHEL 중급 #4 네트워킹 — NetworkManager (nmcli), bonding, teaming

9 분 소요

기초 #2에서 셋업할 때 잠깐 만난 네트워크 화면을 본격적으로 풀어봅니다. RHEL 9의 네트워크는 NetworkManager 하나로 정리됐고, 이 글에서는 그 설정을 실제 운영에서 어떻게 다루는지 살펴봅니다.

RHEL 중급 시리즈에서 이번 글의 위치:

NetworkManager가 왜 표준이 됐나 #

옛날 RHEL은 네트워크 설정을 /etc/sysconfig/network-scripts/ifcfg-* 파일에 적고 service network restart로 적용했습니다. 단순한 경우는 잘 동작했지만 무선,VPN,동적 IP,여러 인터페이스의 동시 처리에는 약했습니다.

NetworkManager는 이 모든 것을 하나의 데몬에 통합한 도구입니다. 데스크톱,서버,노트북,컨테이너 모두에서 동일한 모델로 동작하고, 변경은 즉시 반영되며(restart 불필요), 백엔드(D-Bus)와 클라이언트 도구(nmcli / nmtui / GUI)가 다양해 자동화도 쉽습니다.

NetworkManager의 모양
   사용자 도구:    nmcli (CLI)   nmtui (TUI)   GNOME (GUI)   D-Bus
                     │             │              │            │
                     └─────────────┴──────┬───────┴────────────┘
                              ┌────────────────────┐
                              │  NetworkManager    │   ← 데몬
                              │     (NM)           │
                              └─────────┬──────────┘
                  ┌─────────────────────┼─────────────────────┐
                  ▼                     ▼                     ▼
              [Device]              [Connection]         [Routing/DNS]
              실제 NIC               설정 프로파일         /etc/resolv.conf
              (enp0s1...)           (Wired-1, vpn-...)    /etc/hosts

핵심 두 개념:

  • Device (장치) — 실제 NIC. enp0s1, wlan0 같은 이름.
  • Connection (연결) — Device에 적용할 설정 프로파일. 한 Device에 여러 connection을 만들어두고 상황에 따라 골라 활성화 가능.

이 둘을 분리해서 보는 게 NetworkManager의 핵심 모델입니다. “지금 이 NIC에 어떤 설정이 적용돼 있나"를 항상 의식해야 합니다.

nmcli — 일상 명령군 #

nmcli(NetworkManager CLI)가 거의 모든 작업의 출발점입니다. 세 가지 객체(general / device / connection)에 명령을 붙이는 형태입니다.

현재 상태 한눈에
$ nmcli
enp0s1: connected to Wired connection 1
        "Virtio Network Device"
        ethernet (virtio_net), 52:54:00:..., hw, mtu 1500
        ip4 default
        inet4 192.168.64.15/24
        route4 default via 192.168.64.1 metric 100
        inet6 fe80::.../64
        route6 fe80::/64 metric 256

lo: unmanaged

DNS configuration:
        servers: 192.168.64.1
        interfaces: enp0s1

nmcli만 치면 모든 정보가 한 화면에 나옵니다. 운영에서 처음 머신에 들어가 “네트워크가 어떤 상태인지” 볼 때 가장 자주 칩니다.

Device 보기 #

device 명령군
$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION
enp0s1  ethernet  connected  Wired connection 1
lo      loopback  unmanaged  --

$ nmcli device show enp0s1     # 한 device의 상세
GENERAL.DEVICE:                         enp0s1
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         52:54:00:...
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
...
IP4.ADDRESS[1]:                         192.168.64.15/24
IP4.GATEWAY:                            192.168.64.1
IP4.DNS[1]:                             192.168.64.1

Connection 보기 #

connection 명령군
$ nmcli connection show
NAME                 UUID                   TYPE      DEVICE
Wired connection 1   a1b2c3d4-...           ethernet  enp0s1
my-static            d4e5f6a7-...           ethernet  --

$ nmcli connection show "Wired connection 1"   # 한 connection의 상세
connection.id:                          Wired connection 1
connection.uuid:                        a1b2c3d4-...
connection.type:                        ethernet
ipv4.method:                            auto
ipv4.dns:                               --
...

DEVICE 컬럼이 비어 있는 connection(my-static)은 만들어두기만 하고 활성화 안 한 프로파일입니다.

정적 IP 설정 — 가장 자주 만나는 작업 #

DHCP가 아닌 고정 IP를 쓰고 싶을 때.

새 connection 만들기 #

정적 IP 프로파일 생성
$ sudo nmcli connection add \
    type ethernet \
    con-name "static-enp0s1" \
    ifname enp0s1 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns "192.168.64.1 8.8.8.8" \
    autoconnect yes

옵션 풀이:

  • con-name — 사람이 알아볼 connection 이름
  • ifname — 적용할 device 이름
  • ipv4.method manual — 고정 IP (DHCP는 auto)
  • ipv4.addresses — IP/prefix 형태
  • ipv4.gateway — 디폴트 게이트웨이
  • ipv4.dns — DNS 서버 (공백으로 여러 개)
  • autoconnect yes — 부팅 시 자동 활성화

기존 connection 수정 #

기존 connection의 값 바꾸기
$ sudo nmcli connection modify "static-enp0s1" \
    ipv4.addresses 192.168.64.51/24

$ sudo nmcli connection up "static-enp0s1"     # 다시 활성화해야 반영

modify만으로는 즉시 반영이 안 됩니다. up으로 다시 활성화 하거나 device를 재연결해야 합니다.

Connection 전환 #

다른 connection으로 전환
$ sudo nmcli connection up "static-enp0s1"
$ sudo nmcli connection down "Wired connection 1"

같은 device에 두 connection이 있어도 한 번에 하나만 활성화됩니다. 자주 옮겨가는 환경(노트북의 사무실/집/카페 프로파일)에 유용합니다.

삭제 #

connection 삭제
$ sudo nmcli connection delete "static-enp0s1"

nmtui — TUI 도구 #

nmcli가 익숙해지기 전엔 nmtui (NetworkManager Text User Interface)로 방향을 잡기 쉽습니다.

실행
$ sudo nmtui

화살표 키로 메뉴 이동, 정적 IP / DNS / 게이트웨이를 폼에 입력하는 식. 운영 머신에 SSH로 들어가서 빠르게 한 줄 잡고 싶을 때 자주 씁니다.

/etc/resolv.conf — DNS는 NetworkManager가 관리 #

옛날엔 /etc/resolv.conf를 직접 편집했지만, 지금은 NetworkManager가 자동으로 관리합니다. 직접 편집하면 다음 connection 변경 때 덮어써집니다.

DNS 설정은 connection의 속성으로:

DNS 추가 / 변경
$ sudo nmcli connection modify "static-enp0s1" \
    ipv4.dns "1.1.1.1 8.8.8.8" \
    ipv4.dns-search "example.com"

$ sudo nmcli connection up "static-enp0s1"

DHCP가 주는 DNS를 무시하고 자기 DNS를 쓰려면:

DHCP DNS 무시
$ sudo nmcli connection modify "Wired connection 1" \
    ipv4.ignore-auto-dns yes \
    ipv4.dns "1.1.1.1 8.8.8.8"

Bonding — 두 NIC를 한 덩어리로 #

물리 NIC가 두 장 있을 때, 둘을 묶어 장애 대비 또는 대역폭 합산 효과를 얻는 게 bonding입니다. 장애 대비가 가장 흔한 용도입니다.

bonding의 모양
   eth0 ─┐
         ├── bond0 ── 192.168.64.50
   eth1 ─┘
         (한 NIC 죽어도 다른 NIC가 받음)

모드 #

mode이름용도
0balance-rr라운드 로빈 (스위치 지원 필요)
1active-backup한 NIC 활성, 나머지 대기 — 가장 흔함
2balance-xorXOR 해시 분산
3broadcast모든 NIC에 같은 패킷
4802.3ad / LACP표준 링크 어그리게이션 — 스위치 지원 필요
5balance-tlb송신만 분산
6balance-alb송수신 모두 분산

운영의 99%는 mode 1 (active-backup) 또는 mode 4 (LACP). 단순 장애 대비는 1, 대역폭 합산이 필요하고 스위치가 LACP를 지원하면 4.

bond 만들기 #

active-backup bond
# 1. bond 인터페이스(master) 생성
$ sudo nmcli connection add \
    type bond \
    con-name bond0 \
    ifname bond0 \
    mode active-backup \
    miimon 100 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns 192.168.64.1

# 2. slave 두 개를 bond에 붙임
$ sudo nmcli connection add \
    type ethernet \
    con-name bond0-slave1 \
    ifname enp0s1 \
    master bond0

$ sudo nmcli connection add \
    type ethernet \
    con-name bond0-slave2 \
    ifname enp0s2 \
    master bond0

# 3. 활성화
$ sudo nmcli connection up bond0-slave1
$ sudo nmcli connection up bond0-slave2
$ sudo nmcli connection up bond0

miimon 100링크 감시 주기 (ms). 100ms마다 NIC 상태를 확인해 끊긴 NIC를 자동으로 빼냅니다.

bond 상태 확인 #

bond 상태
$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v...
Bonding Mode: fault-tolerance (active-backup)
Currently Active Slave: enp0s1
MII Status: up
MII Polling Interval (ms): 100

Slave Interface: enp0s1
MII Status: up
Speed: 1000 Mbps
Duplex: full

Slave Interface: enp0s2
MII Status: up
Speed: 1000 Mbps
Duplex: full

Currently Active Slave로 어느 NIC가 활성인지 보여 줍니다. 활성 NIC를 뽑아 보면 다른 NIC로 즉시 페일오버 — bond가 동작하는 핵심 부분입니다.

Teaming — 왜 deprecated 됐나 #

RHEL 7~8 시절에는 bonding 외에 teaming이라는 비슷한 도구가 있었습니다. 사용자 영역에서 동작해 정책을 더 유연하게 짤 수 있다는 게 매력이었습니다. 그러나 RHEL 9에서 deprecated, RHEL 10에서 제거됐습니다.

이유는 단순합니다. 커널 안에 들어 있는 bonding이 더 안정적이고 빠르며, NetworkManager / nmcli 통합도 더 매끄럽습니다. teaming의 유연성은 결국 큰 가치가 안 됐습니다. 옛 글에서 teamdnmcli connection add type team 같은 명령을 보면 bonding으로 옮길 시점 입니다.

team → bond 전환
# 옛날 (deprecated):  nmcli connection add type team ...
# 지금:               nmcli connection add type bond ...

Bridge — 가상 머신과 컨테이너의 기반 #

VM이나 컨테이너를 호스트와 같은 네트워크 대역에 두고 싶을 때 쓰는 도구. 호스트의 NIC와 가상 NIC를 같은 L2 세그먼트로 묶습니다.

bridge의 모양
              ┌──── enp0s1 (외부)
   ┌──── br0 ─┤
   │          ├──── vnet0 (VM 1)
   │          │
   │          └──── vnet1 (VM 2)
   192.168.64.50/24 (브리지에 IP를 줌)

bridge 만들기 #

bridge 생성
# 1. bridge 인터페이스
$ sudo nmcli connection add \
    type bridge \
    con-name br0 \
    ifname br0 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns 192.168.64.1

# 2. 물리 NIC를 bridge에 붙임
$ sudo nmcli connection add \
    type ethernet \
    con-name br0-slave1 \
    ifname enp0s1 \
    master br0

# 3. 활성화
$ sudo nmcli connection up br0

이러면 enp0s1은 IP를 잃고, br0이 그 IP를 이어받습니다. VM을 만들 때 네트워크를 br0에 연결하면 같은 LAN의 다른 머신과 직접 통신할 수 있습니다.

함정 — 호스트가 SSH로 접속 중인 NIC를 그대로 bridge에 넣으면 일시적으로 연결이 끊깁니다. 콘솔 접근이 가능한 상태에서 작업하거나, 자동화 스크립트로 한 번에 적용하세요.

VLAN #

한 NIC에 여러 VLAN tag를 붙여 가상 인터페이스를 만들 수 있습니다.

VLAN 생성
$ sudo nmcli connection add \
    type vlan \
    con-name vlan100 \
    ifname enp0s1.100 \
    dev enp0s1 \
    id 100 \
    ipv4.method manual \
    ipv4.addresses 10.0.100.50/24

id 100이 802.1Q VLAN tag. 결과 인터페이스 이름은 보통 <base>.<id> 형태(enp0s1.100).

진단 도구 #

ip 명령 #

ip는 가장 직접적인 명령. NetworkManager를 거치지 않고 커널의 네트워크 상태를 봅니다.

ip 자주 쓰는 패턴
$ ip -4 addr show              # IPv4 주소
$ ip -6 addr show              # IPv6
$ ip route                     # 라우팅 테이블
$ ip neigh                     # ARP 테이블
$ ip link show                 # 링크 상태 (up/down)

연결성 #

ping / traceroute / mtr
$ ping -c 3 8.8.8.8
$ traceroute google.com
$ mtr -n google.com           # ping + traceroute 통합 (대화형)

포트 / 소켓 #

ss
$ ss -tlnp                     # TCP listening + 프로세스
$ ss -tunap                    # TCP+UDP 모든 소켓 + 프로세스
$ ss -s                        # 소켓 통계 요약

netstat은 deprecated. 새로 익히는 분은 ss로 통일.

DNS #

DNS 조회
$ dig example.com              # DNS 응답 상세
$ dig +short example.com       # IP만
$ host example.com             # 짧은 응답
$ nslookup example.com         # 옛 도구, 호환용

운영에서는 dig가 표준. +short을 자주 씁니다.

AlmaLinux / Rocky 차이 #

이번 글의 모든 명령이 그대로 동작 합니다. NetworkManager / nmcli / bonding / bridge / VLAN 모두 RHEL의 패키지를 그대로 가져옵니다.

자주 만나는 함정 #

“정적 IP를 잡았는데 외부와 통신 안 됨” #

99%는 게이트웨이 또는 DNS를 빼먹은 경우. nmcli connection show <name>ipv4.gatewayipv4.dns를 확인.

“DNS를 바꿨는데 /etc/resolv.conf가 그대로” #

connection의 속성으로 바꾸지 않고 파일을 직접 편집한 경우. NetworkManager가 다음 변경에서 덮어씁니다. **반드시 nmcli connection modify ... ipv4.dns ...**로.

“modify 했는데 변화가 없음” #

활성화된 connection은 modify 후 up으로 다시 적용 해야 반영됩니다. 또는 device를 reconnect.

“bond / bridge가 부팅 후 안 올라옴” #

slave connection들의 connection.autoconnectyes인지 확인. NetworkManager는 master를 먼저 띄우고 slave를 붙이는데, slave가 autoconnect가 아니면 안 붙습니다.

“두 connection이 충돌” #

같은 device에 connection 두 개가 만들어지면 부팅 시 어느 쪽이 활성화될지 불확실. 사용 안 하는 connection은 즉시 삭제 또는 connection.autoconnect no.

자주 쓰는 명령 한 표 #

명령하는 일
nmcli전체 상태 한눈에
nmcli device statusdevice 목록
nmcli device show <dev>device 상세
nmcli connection showconnection 목록
nmcli connection show <name>connection 상세
nmcli connection add type ethernet ...새 connection 추가
nmcli connection modify <name> <key> <value>속성 수정
nmcli connection up/down <name>활성화 / 비활성화
nmcli connection delete <name>삭제
nmcli connection reload디스크의 변경을 NM에 다시 읽힘
nmtuiTUI
ip -4 addr show / ip route / ip link커널 상태
ss -tlnp듣는 포트 + 프로세스
dig +short <host>DNS 조회

정리 #

이번 글에서 정리한 흐름:

  • RHEL 9의 네트워크 표준은 NetworkManager 한 도구. ifcfg / network 서비스는 사라짐.
  • 핵심 모델은 Device (NIC) + Connection (설정 프로파일). 한 device에 여러 connection이 가능.
  • nmcli가 일상 명령. 첫 줄은 항상 nmcli로 한눈에 본다.
  • 정적 IP 패턴: nmcli connection add type ethernet ... ipv4.method manual ipv4.addresses ... gateway ... dns ....
  • DNS는 connection의 속성으로 — /etc/resolv.conf 직접 편집 금지.
  • bonding의 99%는 mode 1 (active-backup), 또는 LACP가 가능한 환경에선 mode 4. teaming은 deprecated.
  • bridge는 VM / 컨테이너를 호스트와 같은 LAN에 두는 기반.
  • 진단은 ip / ss / dig가 표준 (netstat은 deprecated).

다음 — 로그 관리 #

네트워크가 잡히면 그 위에서 동작하는 시스템의 사건도 결국 로그로 남습니다. 다음 글에서는 그 로그를 어떻게 다루는지 살펴봅니다.

#5 로그 관리 — journald, rsyslog, log rotation에서는 journald의 보관 정책과 디스크 사용량 제어, 옛 표준이지만 여전히 살아 있는 rsyslog와 원격 로그 수집, 그리고 모든 로그 파일을 일정 크기,기간으로 자동 회전하는 logrotate까지 운영 관점에서 정리합니다.

X