RHEL 중급 #4 네트워킹 — NetworkManager (nmcli), bonding, teaming
기초 #2에서 셋업할 때 잠깐 만난 네트워크 화면을 본격적으로 풀어봅니다. RHEL 9의 네트워크는 NetworkManager 하나로 정리됐고, 이 글에서는 그 설정을 실제 운영에서 어떻게 다루는지 살펴봅니다.
RHEL 중급 시리즈에서 이번 글의 위치:
- #1 SELinux 입문 — Enforcing/Permissive, 라벨, 트러블슈팅
- #2 LVM — PV/VG/LV, 스냅샷, 확장
- #3 스토리지 심화 — Stratis, NFS, Samba
- #4 네트워킹 — NetworkManager (nmcli), bonding, teaming ← 이번 글
- #5 로그 관리 — journald, rsyslog, log rotation
- #6 작업 스케줄링 — cron, systemd timer, at
- #7 컨테이너 입문 — Podman/Buildah/Skopeo (Docker와의 차이)
NetworkManager가 왜 표준이 됐나 #
옛날 RHEL은 네트워크 설정을 /etc/sysconfig/network-scripts/ifcfg-* 파일에 적고 service network restart로 적용했습니다. 단순한 경우는 잘 동작했지만 무선,VPN,동적 IP,여러 인터페이스의 동시 처리에는 약했습니다.
NetworkManager는 이 모든 것을 하나의 데몬에 통합한 도구입니다. 데스크톱,서버,노트북,컨테이너 모두에서 동일한 모델로 동작하고, 변경은 즉시 반영되며(restart 불필요), 백엔드(D-Bus)와 클라이언트 도구(nmcli / nmtui / GUI)가 다양해 자동화도 쉽습니다.
사용자 도구: 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: enp0s1nmcli만 치면 모든 정보가 한 화면에 나옵니다. 운영에서 처음 머신에 들어가 “네트워크가 어떤 상태인지” 볼 때 가장 자주 칩니다.
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.1Connection 보기 #
$ 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 만들기 #
$ 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 수정 #
$ sudo nmcli connection modify "static-enp0s1" \
ipv4.addresses 192.168.64.51/24
$ sudo nmcli connection up "static-enp0s1" # 다시 활성화해야 반영modify만으로는 즉시 반영이 안 됩니다. up으로 다시 활성화 하거나 device를 재연결해야 합니다.
Connection 전환 #
$ sudo nmcli connection up "static-enp0s1"
$ sudo nmcli connection down "Wired connection 1"같은 device에 두 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의 속성으로:
$ 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를 쓰려면:
$ 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입니다. 장애 대비가 가장 흔한 용도입니다.
eth0 ─┐
├── bond0 ── 192.168.64.50
eth1 ─┘
(한 NIC 죽어도 다른 NIC가 받음)모드 #
| mode | 이름 | 용도 |
|---|---|---|
0 | balance-rr | 라운드 로빈 (스위치 지원 필요) |
1 | active-backup | 한 NIC 활성, 나머지 대기 — 가장 흔함 |
2 | balance-xor | XOR 해시 분산 |
3 | broadcast | 모든 NIC에 같은 패킷 |
4 | 802.3ad / LACP | 표준 링크 어그리게이션 — 스위치 지원 필요 |
5 | balance-tlb | 송신만 분산 |
6 | balance-alb | 송수신 모두 분산 |
운영의 99%는 mode 1 (active-backup) 또는 mode 4 (LACP). 단순 장애 대비는 1, 대역폭 합산이 필요하고 스위치가 LACP를 지원하면 4.
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 bond0miimon 100이 링크 감시 주기 (ms). 100ms마다 NIC 상태를 확인해 끊긴 NIC를 자동으로 빼냅니다.
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: fullCurrently Active Slave로 어느 NIC가 활성인지 보여 줍니다. 활성 NIC를 뽑아 보면 다른 NIC로 즉시 페일오버 — bond가 동작하는 핵심 부분입니다.
Teaming — 왜 deprecated 됐나 #
RHEL 7~8 시절에는 bonding 외에 teaming이라는 비슷한 도구가 있었습니다. 사용자 영역에서 동작해 정책을 더 유연하게 짤 수 있다는 게 매력이었습니다. 그러나 RHEL 9에서 deprecated, RHEL 10에서 제거됐습니다.
이유는 단순합니다. 커널 안에 들어 있는 bonding이 더 안정적이고 빠르며, NetworkManager / nmcli 통합도 더 매끄럽습니다. teaming의 유연성은 결국 큰 가치가 안 됐습니다. 옛 글에서 teamd나 nmcli connection add type team 같은 명령을 보면 bonding으로 옮길 시점 입니다.
# 옛날 (deprecated): nmcli connection add type team ...
# 지금: nmcli connection add type bond ...Bridge — 가상 머신과 컨테이너의 기반 #
VM이나 컨테이너를 호스트와 같은 네트워크 대역에 두고 싶을 때 쓰는 도구. 호스트의 NIC와 가상 NIC를 같은 L2 세그먼트로 묶습니다.
┌──── enp0s1 (외부)
│
┌──── br0 ─┤
│ ├──── vnet0 (VM 1)
│ │
│ └──── vnet1 (VM 2)
│
192.168.64.50/24 (브리지에 IP를 줌)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를 붙여 가상 인터페이스를 만들 수 있습니다.
$ 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/24id 100이 802.1Q VLAN tag. 결과 인터페이스 이름은 보통 <base>.<id> 형태(enp0s1.100).
진단 도구 #
ip 명령
#
ip는 가장 직접적인 명령. NetworkManager를 거치지 않고 커널의 네트워크 상태를 봅니다.
$ ip -4 addr show # IPv4 주소
$ ip -6 addr show # IPv6
$ ip route # 라우팅 테이블
$ ip neigh # ARP 테이블
$ ip link show # 링크 상태 (up/down)연결성 #
$ ping -c 3 8.8.8.8
$ traceroute google.com
$ mtr -n google.com # ping + traceroute 통합 (대화형)포트 / 소켓 #
$ ss -tlnp # TCP listening + 프로세스
$ ss -tunap # TCP+UDP 모든 소켓 + 프로세스
$ ss -s # 소켓 통계 요약netstat은 deprecated. 새로 익히는 분은 ss로 통일.
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.gateway와 ipv4.dns를 확인.
“DNS를 바꿨는데 /etc/resolv.conf가 그대로”
#
connection의 속성으로 바꾸지 않고 파일을 직접 편집한 경우. NetworkManager가 다음 변경에서 덮어씁니다. **반드시 nmcli connection modify ... ipv4.dns ...**로.
“modify 했는데 변화가 없음” #
활성화된 connection은 modify 후 up으로 다시 적용 해야 반영됩니다. 또는 device를 reconnect.
“bond / bridge가 부팅 후 안 올라옴” #
slave connection들의 connection.autoconnect가 yes인지 확인. NetworkManager는 master를 먼저 띄우고 slave를 붙이는데, slave가 autoconnect가 아니면 안 붙습니다.
“두 connection이 충돌” #
같은 device에 connection 두 개가 만들어지면 부팅 시 어느 쪽이 활성화될지 불확실. 사용 안 하는 connection은 즉시 삭제 또는 connection.autoconnect no.
자주 쓰는 명령 한 표 #
| 명령 | 하는 일 |
|---|---|
nmcli | 전체 상태 한눈에 |
nmcli device status | device 목록 |
nmcli device show <dev> | device 상세 |
nmcli connection show | connection 목록 |
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에 다시 읽힘 |
nmtui | TUI |
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까지 운영 관점에서 정리합니다.