안녕하세요.
저는 오픈소스컨설팅에서 리눅스 기술 지원을 하고 있는 이동원입니다.

빠르게 발전하고 있는 오픈소스 세상에서 리눅스 또한 계속 진화하고 있으며. Linux 의 Network 서비스도 이에 맞춰서 변화되고 있습니다.

이번 포스팅에서는 NetworkManager 와 여기서 사용하는 도구인 nmcli , nmtui 를 이용해서, RHEL 에서 네트워크 인터페이스를 설정하는 방법에 대하여 소개하겠습니다.



Intro

RHEL 7 부터 시작해서, RHEL 9 까지 기본 네트워크 관리 서비스로 NetworkManager 가 사용되고 있습니다.

RHEL 7의 initscript 또는 RHEL 8 의 network-scripts 패키지에서 제공하는 script 들을 활용하는 network 서비스는 RHEL 7, RHEL 8 까지는 유지되다가 RHEL 9 부터는 아예 제거되었습니다.

기존 network 서비스에서 각 네트워크 인터페이스 설정을 위해 관리하던 파일인 /etc/sysconfig/network-scripts/ifcfg-* (이후 ifcfg-rh 로 지칭) 는 NetworkManager 에서도 호환됩니다.

RHEL 9 에서도 ifcfg-rh 파일이 호환되지만, 기본적으로는 /etc/NetworkManager/system-connections/ 디렉토리<interface>.nmconnection (이후 keyfile 로 지칭) 이름으로 저장되어 있습니다.

위에 설명한 네트워크 관리 서비스와 설정파일의 변화등은 아래 블로그에서 자세히 설명하고 있습니다.

이 글에서는 선택사항이 아닌, 필수 서비스로 바뀐 NetworkManager 의 도구들을 활용하여, 네트워크 인터페이스를 설정하는 방법을 다루겠습니다.


NetworkManager 도구들

NetworkManager 에서 네트워크 구성을 위해 사용할 수 있는 도구들은 여러가지가 있습니다.

nmcliCLI 도구로 GUI 가 없는 환경에서, 대부분의 네트워크 설정을 할 수 있습니다.
nmtuiTUI (text user interface) 로 제공되어 CLI 환경에서 메뉴방식으로 선택하면서 구성할 수 있는 화면을 제공합니다. curse 기반으로 구성되어 있습니다.일부 설정등은 nmtui 에서 지원하지 않는 것들이 있습니다.
nm-connection-editorGUI 도구로 nm-connection-editor 패키지로 제공됩니다.
control-centerGNOME 쉘에서 제공되는 GUI 도구입니다.

이 외에도 nmstatectl , web console(cockpit) 등이 있습니다.

실서버 운영 환경에서는 대부분 GUI 가 구성되어 있지 않는 경향이 있습니다.

그래서 여기서는 GUI 가 없는 서버 환경에서 주로 쓰이는 nmcli , nmtui 도구를 중심으로 네트워크 인터페이스를 구성하는 방법을 설명하겠습니다.

각 도구의 사용법 참조는 Red Hat 문서와 각 도구의 man 페이지들을 참조합니다.


NetworkManager 도구에서 사용하는 용어의 의미

Connection

Connection 은 네트워크 연결을 설정하고 관리하는 데 필요한 모든 설정이 포함된 프로필(프로파일)을 의미합니다.

여러 Connection 프로필을 생성, 편집 및 저장하여,
다양한 네트워크 또는 액세스 포인트 간에 빠르게 전환할 수 있습니다.

Connection 개념은 다양한 네트워크 설정을 구성/관리할 수 있는 프로필을 만들 수 있게 해주어,
Device 를 다양한 type 의 네트워크와 더 간단하게 연관지을 수 있게 합니다.

그림으로 보면 아래 처럼, Device (NIC) 는 여러 Connection 중에서 하나를 활성화하여 사용할 수 있습니다.

            +------------------------------------------+
            |                   Device                 |
            +------------------------------------------+
                                  |                 
                                  |                 
                                  v                 
    +------------------+  +-----------------+  +-----------------+
    |   Connection 1   |  |   Connection 2  |  |   Connection 3  |
    |  (Profile 1)     |  |  (Profile 2)    |  |  (Profile 3)    |
    +------------------+  +-----------------+  +-----------------+

connection 프로파일에서는 설정할 수 있는 많은 property 가 있습니다.
간단히 제 테스트 환경에서 nmcli connetion show <con-name> 명령어로 확인되는 설정들을 볼 수 있습니다.
100줄이 넘어가는 설정이 있습니다. ㅎㅎ

connection 의 설정들 (펼치기)
[root@r86 ~]# PAGER=cat nmcli c s enp0s8
connection.id:                          enp0s8
connection.uuid:                        816b4dfc-7f43-49bf-9abf-817a218a782f
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp0s8
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1702471246
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --
connection.gateway-ping-timeout:        0
connection.metered:                     unknown
connection.lldp:                        default
connection.mdns:                        -1 (default)
connection.llmnr:                       -1 (default)
connection.dns-over-tls:                -1 (default)
connection.wait-device-timeout:         -1
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          no
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist:   --
802-3-ethernet.mtu:                     auto
802-3-ethernet.s390-subchannels:        --
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:            --
802-3-ethernet.wake-on-lan:             default
802-3-ethernet.wake-on-lan-password:    --
802-3-ethernet.accept-all-mac-addresses:-1 (default)
ipv4.method:                            auto
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.dns-options:                       --
ipv4.dns-priority:                      0
ipv4.addresses:                         --
ipv4.gateway:                           --
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)
ipv4.routing-rules:                     --
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-iaid:                         --
ipv4.dhcp-timeout:                      0 (default)
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.dhcp-fqdn:                         --
ipv4.dhcp-hostname-flags:               0x0 (none)
ipv4.never-default:                     no
ipv4.may-fail:                          yes
ipv4.required-timeout:                  -1 (default)
ipv4.dad-timeout:                       -1 (default)
ipv4.dhcp-vendor-class-identifier:      --
ipv4.dhcp-reject-servers:               --
ipv6.method:                            auto
ipv6.dns:                               --
ipv6.dns-search:                        --
ipv6.dns-options:                       --
ipv6.dns-priority:                      0
ipv6.addresses:                         --
ipv6.gateway:                           --
ipv6.routes:                            --
ipv6.route-metric:                      -1
ipv6.route-table:                       0 (unspec)
ipv6.routing-rules:                     --
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.required-timeout:                  -1 (default)
ipv6.ip6-privacy:                       -1 (unknown)
ipv6.addr-gen-mode:                     eui64
ipv6.ra-timeout:                        0 (default)
ipv6.dhcp-duid:                         --
ipv6.dhcp-iaid:                         --
ipv6.dhcp-timeout:                      0 (default)
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --
ipv6.dhcp-hostname-flags:               0x0 (none)
ipv6.token:                             --
proxy.method:                           none
proxy.browser-only:                     no
proxy.pac-url:                          --
proxy.pac-script:                       --
GENERAL.NAME:                           enp0s8
GENERAL.UUID:                           816b4dfc-7f43-49bf-9abf-817a218a782f
GENERAL.DEVICES:                        enp0s8
GENERAL.IP-IFACE:                       enp0s8
GENERAL.STATE:                          activated
GENERAL.DEFAULT:                        no
GENERAL.DEFAULT6:                       no
GENERAL.SPEC-OBJECT:                    --
GENERAL.VPN:                            no
GENERAL.DBUS-PATH:                      /org/freedesktop/NetworkManager/ActiveConnection/3
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/Settings/1
GENERAL.ZONE:                           --
GENERAL.MASTER-PATH:                    --
IP4.ADDRESS[1]:                         172.31.1.35/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 172.31.1.0/24, nh = 0.0.0.0, mt = 102
DHCP4.OPTION[1]:                        dhcp_lease_time = 600
DHCP4.OPTION[2]:                        dhcp_server_identifier = 172.31.1.2
DHCP4.OPTION[3]:                        expiry = 1702471847
DHCP4.OPTION[4]:                        ip_address = 172.31.1.35
DHCP4.OPTION[5]:                        requested_broadcast_address = 1
DHCP4.OPTION[6]:                        requested_domain_name = 1
DHCP4.OPTION[7]:                        requested_domain_name_servers = 1
DHCP4.OPTION[8]:                        requested_domain_search = 1
DHCP4.OPTION[9]:                        requested_host_name = 1
DHCP4.OPTION[10]:                       requested_interface_mtu = 1
DHCP4.OPTION[11]:                       requested_ms_classless_static_routes = 1
DHCP4.OPTION[12]:                       requested_nis_domain = 1
DHCP4.OPTION[13]:                       requested_nis_servers = 1
DHCP4.OPTION[14]:                       requested_ntp_servers = 1
DHCP4.OPTION[15]:                       requested_rfc3442_classless_static_routes = 1
DHCP4.OPTION[16]:                       requested_root_path = 1
DHCP4.OPTION[17]:                       requested_routers = 1
DHCP4.OPTION[18]:                       requested_static_routes = 1
DHCP4.OPTION[19]:                       requested_subnet_mask = 1
DHCP4.OPTION[20]:                       requested_time_offset = 1
DHCP4.OPTION[21]:                       requested_wpad = 1
DHCP4.OPTION[22]:                       subnet_mask = 255.255.255.0
IP6.ADDRESS[1]:                         fe80::a00:27ff:fedc:4be3/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 1024


Device

Device 는 NetworkManager 에서 인식되는 네트워크 인터페이스를 의미합니다.

많이 사용하는 네트워크 도구인 ip link 명령으로, 사용할 수 있는 네트워크 인터페이스를 확인하는 것과 비슷하기도 합니다.

다만, nmcli device 의 sub 명령어로 connect , disconnnect 가 있는데, ip link set dev <interface> up 같이 인터페이스를 up/down 하는거라기보다는, 위에 설명한 프로파일인 connection connect / disconnect 를 수행합니다. 이렇게 connection 을 연결/활성화하는 건, nmcli connection 명령에서도 가능하며, 여기서는 connection 명령에서 수행하겠습니다.


NetworkManager 에서 IP 설정

이제 본격적으로 NetworkManager 도구들을 이용하여, 기본적인 설정을 하는 방법들을 알아보겠습니다.

nmcli 로 IP 관리하기

NetworkManager 에서 인식되는 Device 를 확인하고, 선택한 Device 에 연결할 설정(Connection)을 추가합니다.

이 때, nmcli 명령어로 connection 을 생성/수정/삭제/활성화/비활성화 할 수 있습니다.

nmcli 명령어를 통한 설정은 ifcfg-rh 또는 keyfile 에 바로 반영이 됩니다.

nmcli 명령은 많은 옵션들이 있는데, 어떻게 쉽게 접근할 수 있을까요??!!!
바로 man page 로 nmcli-examples 를 제공합니다.

[root@r79 ~]# man nmcli-examples | grep -v ^$ | head -n 12
NMCLI-EXAMPLES(7)                        Examples                       NMCLI-EXAMPLES(7)
NAME
       nmcli-examples - usage examples of nmcli
SYNOPSIS
       nmcli [OPTIONS...]
DESCRIPTION
       nmcli is a command-line client for NetworkManager. It allows controlling
       NetworkManager and reporting its status. For more information please refer to
       nmcli(1) manual page.
       The purpose of this manual page is to provide you with various examples and usage
       scenarios of nmcli.
EXAMPLES

man page 에서 IP 를 관리하는 명령들을 찾아보겠습니다.

[root@r79 ~]# man nmcli-examples | grep "manual IP" -A 20
       Example 10. Adding an ethernet connection profile with manual IP configuration

           $ nmcli con add con-name my-con-em1 ifname em1 type ethernet \
             ip4 192.168.100.100/24 gw4 192.168.100.1 ip4 1.2.3.4 ip6 abbe::cafe
           $ nmcli con mod my-con-em1 ipv4.dns "8.8.8.8 8.8.4.4"
           $ nmcli con mod my-con-em1 +ipv4.dns 1.2.3.4
           $ nmcli con mod my-con-em1 ipv6.dns "2001:4860:4860::8888 2001:4860:4860::8844"
           $ nmcli -p con show my-con-em1

       The first command adds an Ethernet connection profile named my-con-em1 that is
       bound to interface name em1. The profile is configured with static IP addresses.
       Three addresses are added, two IPv4 addresses and one IPv6. The first IP
       192.168.100.100 has a prefix of 24 (netmask equivalent of 255.255.255.0). Gateway
       entry will become the default route if this profile is activated on em1 interface
       (and there is no connection with higher priority). The next two addresses do not
       specify a prefix, so a default prefix will be used, i.e. 32 for IPv4 and 128 for
       IPv6. The second, third and fourth commands modify DNS parameters of the new
       connection profile. The last con show command displays the profile so that all
       parameters can be reviewed.

ethernet type 의 connection 프로파일을 추가 생성하면서, 수동 IP 설정을 수행하는 명령어 샘플을 보여주네요.

nmcli 로 IP 추가하기

여기서는 connection 이름은 ether-enp0s9 로 하고, ip 와 gw 만 넣어보겠습니다. interface 명은 nmcli device 명령에서 인식되고, connection 프로파일이 없는 enp0s9 를 사용하겠습니다.

[root@r79 ~]# nmcli device status
DEVICE   TYPE      STATE         CONNECTION
enp0s3   ethernet  connected     enp0s3
enp0s8   ethernet  connected     enp0s8
enp0s10  ethernet  disconnected  --
enp0s9   ethernet  disconnected  --
lo       loopback  unmanaged     --

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep enp0s9
[root@r79 ~]# ls /etc/NetworkManager/system-connections/

아직 enp0s9 인터페이스와 관련된 설정파일이 없습니다.

[root@r79 ~]# nmcli con add con-name ether-enp0s9 ifname enp0s9 type ethernet \
> ip4 172.31.3.7/24 gw4 172.31.3.2
Connection 'ether-enp0s9' (e418999d-fb05-49dd-b33c-a6695d87618d) successfully added.

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep enp0s9
/etc/sysconfig/network-scripts/ifcfg-ether-enp0s9

[root@r79 ~]# ls /etc/NetworkManager/system-connections/

[root@r79 ~]# nmcli connection show
NAME          UUID                                  TYPE      DEVICE
enp0s3        3c36b8c2-334b-57c7-91b6-4401f3489c69  ethernet  enp0s3
enp0s8        00cb8299-feb9-55b6-a378-3fdc720e0bc6  ethernet  enp0s8
ether-enp0s9  e418999d-fb05-49dd-b33c-a6695d87618d  ethernet  enp0s9

[root@r79 ~]# nmcli connection show ether-enp0s9 | grep -i -e "ipv4.addr" -e "ipv4.gate"
ipv4.addresses:                         172.31.3.7/24
ipv4.gateway:                           172.31.3.2

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9

[root@r79 ~]# ip route | grep enp0s9
default via 172.31.3.2 dev enp0s9 proto static metric 102
172.31.3.0/24 dev enp0s9 proto kernel scope link src 172.31.3.7 metric 102

connection 을 추가하면, 설정 파일도 생성이 됩니다. RHEL 7/8 에서는 ifcfg-rh 파일로 생성됩니다.

nmcli 명령으로 connection 을 추가하니, 설정 파일이 생기고, 기존 활성 connection 이 없어서, 추가된 connection 이 바로 활성화되어 적용이 되었습니다.

RHEL 9 에서는 nmcli 로 conneciton 추가시 아래처럼 keyfile 에 설정이 저장되는 것을 볼 수 있습니다.

[root@r92 ~]# nmcli con add con-name ether-enp0s10 ifname enp0s10 type ethernet \
> ip4 172.31.3.92/24 gw4 172.31.3.2
'ether-enp0s10' (a13a7842-4d41-4d1b-aaf3-d830a32025c5) 연결이 성공적으로 추가되었습니다.

[root@r92 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep enp0s10

[root@r92 ~]# ls /etc/NetworkManager/system-connections/ | grep enp0s10
ether-enp0s10.nmconnection

nmcli 로 alias IP 추가 또는 변경/삭제하기

Alias IP 를 추가하는 경우도 있습니다.
또는
IP 를 변경해야 하는 경우가 있습니다.
네트워크 대역이 달라져서 NIC 를 다운시켜야 할 때도 있지만,
그게 아닌 같은 네트워크 대역에서 IP 만 변경하고자 한다면, 되도록 IP 를 가지고 있는 상태로 작업할 수 있습니다.

위에서 추가한 connection 프로파일을 수정하는 경우는 nmcli connection modify 명령을 사용할 수 있습니다. 이 명령 뒤에 수정할 connection 이름을 붙이고, 옵션을 통해 property 를 수정/추가/삭제할 수 있습니다. IP 처럼 동일한 타입의 property을 여러개 가질 수 있는 경우, +<property> 로 추가, -<property> 로 제거할 수 있습니다.

같은 대역의 IP 를 하나 추가해 보겠습니다.

[root@r79 ~]# nmcli connection modify ether-enp0s9 +ipv4.addr 172.31.3.77/24

[root@r79 ~]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-ether-enp0s9
IPADDR=172.31.3.7
IPADDR1=172.31.3.77

[root@r79 ~]# nmcli connection show ether-enp0s9 | grep -i -e "4.addr"
ipv4.addresses:                         172.31.3.7/24, 172.31.3.77/24
IP4.ADDRESS[1]:                         172.31.3.7/24

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9

nmcli 명령으로 connection 을 수정했습니다. 파일도 변경되고, nmcli connection show 로 볼 때도 반영이 되었는데, ip 명령에서는 보이지 않습니다…

이런 경우는 connection 프로파일을 다시 활성화해 줘야 합니다. nmcli connection up <con-name> 명령어를 사용합니다.

[root@r79 ~]# nmcli connection up ether-enp0s9
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/28)

[root@r79 ~]# nmcli connection show ether-enp0s9 | grep -i -e "4.addr"
ipv4.addresses:                         172.31.3.7/24, 172.31.3.77/24
IP4.ADDRESS[1]:                         172.31.3.7/24
IP4.ADDRESS[2]:                         172.31.3.77/24

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9
    inet 172.31.3.77/24 brd 172.31.3.255 scope global secondary noprefixroute enp0s9

추가만 하는 경우 여기까지만 하면 되겠지만, 변경하는게 목적이었다면 기존 IP 를 제거해 줘야 하겠죠.

이 때도, nmcli connection modify 명령을 사용합니다.

기존 IP 를 제거해 보겠습니다.

[root@r79 ~]# nmcli connection modify ether-enp0s9 -ipv4.addr 172.31.3.7/24

[root@r79 ~]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-ether-enp0s9
IPADDR=172.31.3.77

[root@r79 ~]# nmcli connection show ether-enp0s9 | grep -i -e "4.addr"
ipv4.addresses:                         172.31.3.77/24
IP4.ADDRESS[1]:                         172.31.3.7/24
IP4.ADDRESS[2]:                         172.31.3.77/24

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9
    inet 172.31.3.77/24 brd 172.31.3.255 scope global secondary noprefixroute enp0s9

제거 때에도 위에 추가할 때처럼, ip 명령으로 보니 설정이 반영되지 않았습니다.
위 결과 중에 IP4.ADDRESS[1] 처럼 대문자로 나오는 결과는 connection property 가 아닌, device 에서 가져온 property 입니다. 즉, 실제로 적용되어 있는 상태라고 보면 됩니다.

connection 프로파일을 다시 활성화해 줍니다.

[root@r79 ~]# nmcli connection up ether-enp0s9
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/29)

[root@r79 ~]# nmcli connection show ether-enp0s9 | grep -i -e "4.addr"
ipv4.addresses:                         172.31.3.77/24
IP4.ADDRESS[1]:                         172.31.3.77/24

[root@r79 ~]# ip address show enp0s9 | grep -w inet    
inet 172.31.3.77/24 brd 172.31.3.255 scope global noprefixroute enp0s9

nmcli 도구를 활용하여 IP 설정을 해 보았습니다.

다음은 nmtui 도구를 사용해 보겠습니다. 그러기 위해 기존 설정은 제거하겠습니다.

[root@r79 ~]# nmcli c del ether-enp0s9
Connection 'ether-enp0s9' (e418999d-fb05-49dd-b33c-a6695d87618d) successfully deleted.

[root@r79 ~]# nmcli c s
NAME    UUID                                  TYPE      DEVICE
enp0s3  3c36b8c2-334b-57c7-91b6-4401f3489c69  ethernet  enp0s3
enp0s8  00cb8299-feb9-55b6-a378-3fdc720e0bc6  ethernet  enp0s8

connection 프로파일을 ifcfg-rh 파일을 직접 수정하는 경우, nmcli connection reload 명령어를 사용해야 NetworkManager 에 설정이 반영됩니다. 이 때 추가 인자가 없으면, 모든 connection 프로파일을 리로드하여 변경 사항을 반영하며, connection 이름을 주는 경우, 해당 connection 만 리로드합니다.

리로드되더라도 변경한 설정이 바로 적용이 되지 않는 경우도 있는데, 이 때는 connection 프로파일을 nmcli connection up <con-name> 명령으로 다시 활성화해 줍니다.

nmtui 로 IP 설정하기

nmtui 도구는 CLI 환경에서 메뉴방식으로 선택하여 설정할 수 있도록 합니다. NetworkManager-tui 패키지에 포함되어 있는데, RHEL 최소 설치환경에서도 같이 설치됩니다.

nmtui 만 입력해서, TUI 로 진입할 수 있지만, edit 를 붙여서 connection 추가/수정/삭제를, connect 를 붙여서 connection 활성화/비활성화를 할 수 있습니다.

여기서도 connection 이름은 ether-enp0s9 로 하고, ip 와 gw 만 넣어보겠습니다.

nmtui 로 IP 추가하기

먼저 사용할 네트워크 인터페이스를 확인합니다.

[root@r79 ~]# nmcli device status
DEVICE   TYPE      STATE         CONNECTION
enp0s3   ethernet  connected     enp0s3
enp0s8   ethernet  connected     enp0s8
enp0s10  ethernet  disconnected  --
enp0s9   ethernet  disconnected  --

enp0s9 인터페이스를 사용하겠습니다.

connection 추가해야 하니, edit 모드로 들어갑니다.

nmtui edit

아래와 같은 화면이 나옵니다. 여기서는 connection 프로파일을 추가하기 위해 <Add> 를 선택합니다.

type 으로 Ethernet 을 선택합니다.

Profile name 부분은 connection 이름(id) 뿐만 아니라, 저장되는 설정파일의 이름이 되므로 구분하기 좋은 이름으로 설정합니다. Device 는 nmtui 를 들어오기전에 확인한 사용할 인터페이스 이름을 적어 줍니다. IPv4 CONFIGURATION (ipv4.method) 이 기본 Automatic 에서 Manual 로 변경합니다. 같은 라인 맨끝의 <show> 로 이동하여 엔터를 누름니다.

Profile name 이름을 변경하지 않고 그대로 쓰는 경우, 아래처럼 파일 이름만으로는 어떤 설정인지 구분이 어려워 질 수 있습니다. 가급적 구분할 수 있도록 지정하는게 좋습니다.

[root@r79 ~]# nmcli -t connection show

Ethernet connection 1:d2f8caa7-8340-4c72-8883-afa505544a8b:802-3-ethernet:

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1

/etc/sysconfig/network-scripts/ifcfg-Ethernet_connection_1

여기서 Device 를 설정하지 않을 수도 있습니다만, Automatically connect 설정으로 link 가 살아 있는 Device 와 자동으로 연결됩니다. Device 를 비워두는 경우, 의도하지 않은 Device 와 연결될 수 있습니다.

IPv4 CONFIGURATION 설정 부분이 확장이 되면서, Adresses , Gateway 등을 넣을 수 있는 메뉴들이 나옵니다. Addresses<Add…> 부분을 눌러 IP 를 입력하고, Gateway 라인에 Gateway 주소를 입력합니다.

맨 하단의 <OK> 로 이동하여, 엔터를 누르고, 다음 화면에서 <Quit> 을 선택해서 nmtui 를 빠져나옵니다.

connection 프로파일이 생성이 되었는지와 반영이 되었는지 확인합니다.

[root@r79 ~]# nmcli c s
NAME             UUID                                  TYPE      DEVICE
enp0s3           3c36b8c2-334b-57c7-91b6-4401f3489c69  ethernet  enp0s3
enp0s8           00cb8299-feb9-55b6-a378-3fdc720e0bc6  ethernet  enp0s8
ethernet-enp0s9  0cc49de5-e78a-4923-9a44-3cf118ff98ec  ethernet  enp0s9

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep enp0s9
/etc/sysconfig/network-scripts/ifcfg-ethernet-enp0s9

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9

nmtui 로 alias IP 추가하기

IP 를 추가 또는 변경하고 삭제해 보겠습니다.

nmtui edit 명령뒤에 connection 이름을 붙여서, 해당 conneciton 을 바로 수정할 수 있습니다.

nmtui edit ethernet-enp0s9

바로 ethernet-enp0s9 connetion 을 수정할 수 있는 화면이 출력됩니다.

IPv4 CONFIGURATION 하위의 Addresses<Add…> 를 누르고 아래와 같이 IP 를 추가합니다. 다음으로 <OK> 를 누르고 빠져나옵니다.

설정이 저장되고, 반영도 되었는지 확인해 봅니다.

[root@r79 ~]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-ethernet-enp0s9
IPADDR=172.31.3.7
IPADDR1=172.31.3.77

[root@r79 ~]# nmcli connection show ethernet-enp0s9 | grep -i -e "4.addr"
ipv4.addresses:                         172.31.3.7/24, 172.31.3.77/24
IP4.ADDRESS[1]:                         172.31.3.7/24

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9

이번에도 nmcli 도구를 사용할 때 처럼, 수정된 후에 connection 프로파일을 다시 활성화 해 줘야 합니다.

위에서 사용한 nmcli 도구로 수정한 connection 을 활성화해 줍니다.

[root@r79 ~]# nmcli connection up ethernet-enp0s9
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/44)

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9
    inet 172.31.3.77/24 brd 172.31.3.255 scope global secondary noprefixroute enp0s9

추가한 ip 가 보이는 것을 확인할 수 있습니다.

참고로, nmtui 도구의 nmtui connection 메뉴에서는 이미 활성화되어 있는 connection 을 비활성화 없이 다시 활성화하는 메뉴가 없습니다.

nmtui 로 IP 변경하기

설정한 IP 를 nmtui 로 변경해 보겠습니다.

nmtui edit ethernet-enp0s9

172.31.3.77 을 172.31.3.79 로 수정하겠습니다.

이 때도 수정한 후 connection 을 다시 활성화해야 합니다.

[root@r79 ~]# nmcli connection up ethernet-enp0s9
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/45)

[root@r79 ~]# ip address show enp0s9 | grep -w inet
    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute enp0s9
    inet 172.31.3.79/24 brd 172.31.3.255 scope global secondary noprefixroute enp0s9

IP 가 변경된 것이 보입니다.

nmtui 로 IP 제거하기

제거도 nmtui edit <con-name> 으로 메뉴에서 해당 Address 옆의 <Remove> 로 제거/저장 후에, 수정된 connection 을 다시 활성화하면 됩니다.

해당 connection 프로파일 자체를 제거하고자 하는 경우는 아래처럼 connection 을 삭제하면 됩니다.

nmtui edit

원하는 Connection 을 선택하고, <Delete> 를 선택하여 삭제합니다. 설정은 수정과 다르게 바로 반영됩니다.

메뉴를 <Quit> 으로 종료하고, 나와서 확인을 합니다.

[root@r79 ~]# nmcli c s
NAME    UUID                                  TYPE      DEVICE
enp0s3  3c36b8c2-334b-57c7-91b6-4401f3489c69  ethernet  enp0s3
enp0s8  00cb8299-feb9-55b6-a378-3fdc720e0bc6  ethernet  enp0s8

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep enp0s9

[root@r79 ~]# ip address show enp0s9 | grep -w inet

connection 프로파일과 설정파일, 그리고 ip 까지 제거된 것을 볼 수 있습니다.


NetworkManager 에서 Bonding 구성

다음으로 물리서버 환경에서 많이 구성하는 bonding 구성 방법을 알아 보겠습니다.

nmcli 로 bonding 구성하기

위에서 nmcli 로 IP 를 설정하는 명령을 확인할 때, man nmcli-examples 를 참조했습니다.

이번에도 활용해 보겠습니다.

[root@r79 ~]# man nmcli-examples | grep -v ^$ | grep "Adding a bonding" -A3
       Example 7. Adding a bonding master and two slave connection profiles
           $ nmcli con add type bond ifname mybond0 mode active-backup
           $ nmcli con add type ethernet ifname eth1 master mybond0
           $ nmcli con add type ethernet ifname eth2 master mybond0

bond 타입의 mybond0 이라는 bonding 인터페이스를 active-backup mode 로 해서 connection 을 추가합니다. 그리고 이후에 slave 인터페이스에 대한 connection 을 추가하고 있습니다.

여기서는 bonding mode 설정을 위 명령보다는 Red Hat 메뉴얼을 참고해서, bond.options 설정을 통해서 다른 bonding 옵션을 더해서 설정하겠습니다.

bond0 으로 bonding 인터페이스를 생성하겠습니다. slave 인터페이스는 enp0s9, enp0s10 을 사용합니다.

추가로 테스트 환경이 VirtualBox VM 이여서, bonding 이 동작하려면 fail_over_mac=1 설정이 필요합니다.

[root@r79 NetworkManager-1.18.8]# nmcli con add type bond ifname bond0 bond.options \
> "mode=active-backup,miimon=100,fail_over_mac=1"
Connection 'bond-bond0' (9b15f046-e2a8-4179-bcff-e2b152f496e7) successfully added.

[root@r79 NetworkManager-1.18.8]# nmcli con add type ethernet ifname enp0s9 master bond0
Connection 'bond-slave-enp0s9' (bbd08164-4432-4055-9454-2758080258ab) successfully added.

[root@r79 NetworkManager-1.18.8]# nmcli con add type ethernet ifname enp0s10 master bond0
Connection 'bond-slave-enp0s10' (61da921a-786d-409e-8376-71c1396f587f) successfully added.

[root@r79 NetworkManager-1.18.8]# nmcli c s | grep bond
bond-bond0          9b15f046-e2a8-4179-bcff-e2b152f496e7  bond      bond0
bond-slave-enp0s10  61da921a-786d-409e-8376-71c1396f587f  ethernet  enp0s10
bond-slave-enp0s9   bbd08164-4432-4055-9454-2758080258ab  ethernet  enp0s9

[root@r79 NetworkManager-1.18.8]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep bond
/etc/sysconfig/network-scripts/ifcfg-bond-bond0
/etc/sysconfig/network-scripts/ifcfg-bond-slave-enp0s10
/etc/sysconfig/network-scripts/ifcfg-bond-slave-enp0s9

[root@r79 NetworkManager-1.18.8]# ip l sh |grep bond
4: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000
5: enp0s10: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000
31: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000

bond-bond0 , bond-slave-enp0s10 , bond-slave-enp0s9 이름으로 connection 프로파일과 ifcfg-rh 설정 파일이 생성이 되었습니다. ip 명령으로 확인하면, bond0 과 slave 인터페이스들이 UP 상태로 올라와 있습니다.

아직 IP 가 없으니, IP 를 추가해 보겠습니다.

connection 추가시에 IP 설정을 하지 않는 경우, ipv4.method 가 auto 로 설정되어 dhcp 를 받게 되어 있습니다. 이 부분을 manual 로 바꾸면서, IP 와 GW 를 추가하겠습니다.

[root@r79 NetworkManager-1.18.8]# nmcli con mod bond-bond0 \
> ip4 172.31.3.7/24 gw4 172.31.3.2 ipv4.method manual

[root@r79 NetworkManager-1.18.8]# nmcli con show bond-bond0 |grep -i -e 4.add -e 4.gate -e 4.method
ipv4.method:                            manual
ipv4.addresses:                         172.31.3.7/24
ipv4.gateway:                           172.31.3.2
IP4.ADDRESS[1]:                         172.31.3.7/24
IP4.GATEWAY:                            172.31.3.2

[root@r79 NetworkManager-1.18.8]# ip -o -4 a s bond0
37: bond0    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute bond0\       valid_lft forever preferred_lft forever

기존에 할당된 IP가 없었는데, IP 가 할당되면서 IP기 바로 적용된 것 같습니다. 혹시, IP 가 반영되지 않았다면, nmci con up bond-bond0 명령으로 다시 활성화하면 IP 가 올라옵니다.

다음으로 nmtui 로 구성하기 위해, 기존 설정등을 모두 삭제합니다.

[root@r79 NetworkManager-1.18.8]# nmcli c del bond-bond0 bond-slave-enp0s10 bond-slave-enp0s9
Connection 'bond-bond0' (fa57cc19-0ee6-4cf2-a695-c80dca47f1bc) successfully deleted.
Connection 'bond-slave-enp0s10' (db14bf02-6018-48c5-97da-45615765629e) successfully deleted.
Connection 'bond-slave-enp0s9' (088b231c-4d57-4229-93bf-66a2fe320565) successfully deleted.

[root@r79 NetworkManager-1.18.8]# nmcli c s | grep bond

[root@r79 NetworkManager-1.18.8]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep bond

[root@r79 NetworkManager-1.18.8]# ip -o -4 a s | grep bond

[root@r79 NetworkManager-1.18.8]# ip -o -4 l sh | grep bond

nmtui 로 bonding 구성하기

위에서 nmcli 로 구성할 때 처럼, enp0s9, enp0s10 device 로 bond0 을 구성하겠습니다. 사용할 device 의 상태를 확인 합니다.

[root@r79 NetworkManager-1.18.8]# nmcli device status
DEVICE   TYPE      STATE         CONNECTION
enp0s3   ethernet  connected     enp0s3
enp0s8   ethernet  connected     enp0s8
enp0s10  ethernet  disconnected  --
enp0s9   ethernet  disconnected  --
lo       loopback  unmanaged     --

nmtui edit 명령으로 bonding connection 을 만들어 보겠습니다.

nmtui edit

아래 화면에서 <Add> 를 누르고, Connection Type 으로 Bond 를 선택하고 <Create> 를 합니다.

bonding conneciont 을 생성합니다.
Profile name 을 설정하고, Device 이름은 여기서는 bond0 으로 하겠습니다.
하단 부분에 AddressesGateway 를 설정합니다.
좀 더 윗 부분의 Slaves 메뉴에서 <Add> 를 눌러서 slave 추가 화면으로 넘어갑니다.

slave 인터페이스 connection 을 Ethernet 타입으로 <Create> 합니다.

아래 그림처럼, 첫번째 slave 인터페이스 connection 의 프로파일을 생성합니다.

Slaves 에 slave 인터페이스용 connection 프로파일이 추가된 것이 보입니다. <Add> 로 하나 더 추가합니다.

아래 그림처럼, 두번째 slave 인터페이스 connection 의 프로파일을 생성합니다.

Slave Connectoin 프로파일이 추가되었습니다. 맨 하단의 <OK> 를 눌러서 bonding connection 을 생성합니다.
Bond-bond0 connection 이 추가되었습니다. 하단의 <QUIT> 을 눌러서 nmtui 를 빠져 나옵니다.

빠져 나오면 바로, boding 및 slave 용 connection 과 ifcfg-rh 설정 파일이 추가가 되고, IP 도 바로 올라온 것을 확인할 수 있습니다.

[root@r79 NetworkManager-1.18.8]# nmcli c s|grep bond
Bond-bond0     736fcd3f-dd56-4e49-8e40-88b4af5e7f84  bond      bond0
bond0-enp0s10  bcf504e4-d945-493f-b59b-fb402f61211f  ethernet  enp0s10
bond0-enp0s9   b994dc91-1e80-40a3-9c49-1ce33e6fe7b8  ethernet  enp0s9

[root@r79 NetworkManager-1.18.8]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep bond
/etc/sysconfig/network-scripts/ifcfg-bond0-enp0s10
/etc/sysconfig/network-scripts/ifcfg-bond0-enp0s9
/etc/sysconfig/network-scripts/ifcfg-Bond-bond0

[root@r79 NetworkManager-1.18.8]# ip -o -4 l sh |grep bond0
4: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff
5: enp0s10: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff
38: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff

[root@r79 NetworkManager-1.18.8]# ip -o -4 a s bond0 | grep -w inet
38: bond0    inet 172.31.3.7/24 brd 172.31.3.255 scope global noprefixroute bond0\       valid_lft forever preferred_lft forever


NetworkManager 에서 VLAN 구성

nmcli 로 vlan 구성하기

vlan 구성은 man nmcli-examples 에서는 바로 참조할 명령어를 찾지는 못했습니다. 위에서 알아보았던 nmcli 명령들을 참조해 보겠습니다.

type , ifname , con-name 등은 connectoin 프로파일 생성시 일반적으로 지정하는 옵션입니다.

그리고 vlan 을 만드는 경우는,
어떤 device 위에 올리는 것을 지정하는 vlan.parent 설정과
VLAN ID 를 의미하는 vlan.id 설정이 필요합니다.

nmcli 명령은 아래처럼 만들 수 있습니다.

nmcli connection add type vlan con-name <connection_name> ifname <device> \
vlan.parent <parent_interface> vlan.id <vlan_id>

connection 을 만들면서 IP 를 추가할 수 있습니다.

nmcli connection add type vlan con-name vlan-vlan100 ifname vlan100 \
vlan.parent bond0 vlan.id 100 \
ip4 172.31.100.7/24 ipv4.method manual

위 명령으로 만들어 보겠습니다.

[root@r79 ~]# nmcli connection add type vlan con-name vlan-vlan100 ifname vlan100 \
> vlan.parent bond0 vlan.id 100 \
> ip4 172.31.100.7/24 ipv4.method manual
Connection 'vlan-vlan100' (07a9a7c6-008f-41a1-bf81-32851e64cae8) successfully added.

[root@r79 ~]# nmcli c s  | grep -e ID -e vlan
NAME           UUID                                  TYPE      DEVICE
vlan-vlan100   07a9a7c6-008f-41a1-bf81-32851e64cae8  vlan      vlan100

[root@r79 ~]# ip -d a sh vlan100
54: vlan100@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vlan protocol 802.1Q id 100 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
    inet 172.31.100.7/24 brd 172.31.100.255 scope global noprefixroute vlan100
       valid_lft forever preferred_lft forever

vlan-vlan100 이라는 connection 프로파일이 생성이 되었고, vlan100 이라는 인터페이스가 생겼습니다.
ip 도 설정이 되었으며, 인터페이스도 vlan id 가 100 으로 설정이 되었습니다.

VLAN ID 200 으로 해서 vlan200 인터페이스가 생성되면서, connection name 으로 vlan-vlan200 으로 해서, 다시 만들어 보겠습니다. IP 도 VLAN ID 에 맞춰서 172.31.200.7/24 로 설정해 보겠습니다.

[root@r79 ~]# nmcli connection add type vlan con-name vlan-vlan200 ifname vlan200 \
> vlan.parent bond0 vlan.id 200 \
> ip4 172.31.200.7/24 ipv4.method manual

[root@r79 ~]# nmcli c s  | grep -e ID -e vlan
NAME           UUID                                  TYPE      DEVICE
vlan-vlan100   07a9a7c6-008f-41a1-bf81-32851e64cae8  vlan      vlan100
vlan-vlan200   f65b716b-e06b-4a06-9520-96fd75ef2022  vlan      vlan200

[root@r79 ~]# ip -d a sh vlan200
55: vlan200@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vlan protocol 802.1Q id 200 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
    inet 172.31.200.7/24 brd 172.31.200.255 scope global noprefixroute vlan200
       valid_lft forever preferred_lft forever
    inet6 fe80::a22b:c2a3:27d3:682d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

nmtui 로 vlan 구성하기

nmtui 로 vlan 101 을 만들어 보겠습니다.
connection 추가해야 하니, edit 모드로 들어갑니다.

nmtui edit

아래와 같은 화면이 나옵니다. 여기서는 connection 프로파일을 추가하기 위해 <Add> 를 선택합니다. 이후에 type 으로 VLAN 을 선택하고, <Create> 를 선택합니다.

vlan-vlan101 이라는 connection profile 이름을 주고, Device 는 vlan101 로 선택합니다.
Parent 는 bond0 을 넣어줍니다.
아래에 IP 설정에서 <Manual> 을 지정하고, Addresses 에 IP 를 추가합니다.

이후 <OK> 를 누르고 나오면, vlan-vlan101 이 추가된게 보입니다.

<Quit> 을 누르고 나옵니다.

아래처럼 생성된 정보를 확인할 수 있습니다.

[root@r79 ~]# nmcli c s|grep vlan
vlan-vlan100   07a9a7c6-008f-41a1-bf81-32851e64cae8  vlan      vlan100
vlan-vlan101   1fba3896-c19b-47aa-ae1b-4f0e93331e21  vlan      vlan101
vlan-vlan200   f65b716b-e06b-4a06-9520-96fd75ef2022  vlan      vlan200

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep vlan
/etc/sysconfig/network-scripts/ifcfg-vlan-vlan100
/etc/sysconfig/network-scripts/ifcfg-vlan-vlan101
/etc/sysconfig/network-scripts/ifcfg-vlan-vlan200

[root@r79 ~]# ip -o -4 l sh |grep vlan
54: vlan100@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff
55: vlan200@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff
56: vlan101@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:e3:5b:c9 brd ff:ff:ff:ff:ff:ff

[root@r79 ~]# ip -o -4 a s vlan100
54: vlan100    inet 172.31.100.7/24 brd 172.31.100.255 scope global noprefixroute vlan100\       valid_lft forever preferred_lft forever
[root@r79 ~]# ip -o -4 a s vlan200
55: vlan200    inet 172.31.200.7/24 brd 172.31.200.255 scope global noprefixroute vlan200\       valid_lft forever preferred_lft forever
[root@r79 ~]# ip -o -4 a s vlan101
56: vlan101    inet 172.31.101.7/24 brd 172.31.101.255 scope global noprefixroute vlan101\       valid_lft forever preferred_lft forever

[root@r79 ~]# cat /proc/net/vlan/config
VLAN Dev name    | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
vlan100        | 100  | bond0
vlan200        | 200  | bond0
vlan101        | 101  | bond0

생성한 vlan 인터페이스들을 정리하겠습니다.

[root@r79 ~]# nmcli connection delete vlan-vlan100 vlan-vlan101 vlan-vlan200
Connection 'vlan-vlan100' (07a9a7c6-008f-41a1-bf81-32851e64cae8) successfully deleted.
Connection 'vlan-vlan101' (1fba3896-c19b-47aa-ae1b-4f0e93331e21) successfully deleted.
Connection 'vlan-vlan200' (f65b716b-e06b-4a06-9520-96fd75ef2022) successfully deleted.

NetworkManager 에서 Bridge 구성

nmcli 로 Bridge 구성하기

Bridge 는 MAC 주소를 기반으로 네트워크 간 트래픽을 전달하는 링크 계층 장치입니다. 리눅스에서는 소프트웨어 Bridge 를 구성하여, VM NIC 과 Host 의 NIC 간에 통신할 수 있게 연결할 수 있습니다.

man nmcli-examples 를 참조하여, bridge 구성에 활용할 수 있는 nmcli 명령어를 확인해 봅니다.

[root@r79 ~]# man nmcli-examples | grep "Adding a bridge" -A5
       Example 9. Adding a bridge and two slave profiles

           $ nmcli con add type bridge con-name TowerBridge ifname TowerBridge
           $ nmcli con add type ethernet con-name br-slave-1 ifname ens3 master TowerBridge
           $ nmcli con add type ethernet con-name br-slave-2 ifname ens4 master TowerBridge
           $ nmcli con modify TowerBridge bridge.stp no

type 은 bridge 이고, 생성되는 bridge interface 이름으로 ifname 을 설정하며, con-name 을 지정합니다.
이후 생성한 bridge 에 인터페이스들을 연결합니다.

con-name 으로 bridge-br0 , bridge interface 이름으로 br0 을 주고, 추가로 IP 도 설정하겠습니다.

[root@r79 ~]# nmcli con add type bridge con-name bridge-br0 ifname br0 ip4 172.31.3.17/24
Connection 'bridge-br0' (14fc7d0b-a8c1-4cab-987f-6c5de5214c54) successfully added.

[root@r79 ~]# nmcli c s | grep -e ID -e br0
NAME           UUID                                  TYPE      DEVICE
bridge-br0     14fc7d0b-a8c1-4cab-987f-6c5de5214c54  bridge    br0

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep br0
/etc/sysconfig/network-scripts/ifcfg-bridge-br0

[root@r79 ~]# ip -o -4 a sh br0
58: br0    inet 172.31.3.17/24 brd 172.31.3.255 scope global noprefixroute br0\       valid_lft forever preferred_lft forever

connection 프로파일과 설정 파일, br0 인터페이스 가 추가되었고, br0 인터페이스에 IP 가 할당되었습니다.

그렇지만, br0 에는 외부와 통신하는 실제 interface 가 연결이 되어 있지 않아서, 외부에서 할당한 IP 로 ping 을 보내도 받을 수가 없습니다.
실제 interface 를 br0 에 연결하여, 외부와 통신이 가능하게 합니다.
사용할 수 있는 인터페이스로 enp0s9 를 사용합니다.
그리고 위의 man nmcli-examples 에서 확인한 명령어를 활용합니다.

[root@r79 ~]# nmcli d s
DEVICE   TYPE      STATE         CONNECTION
enp0s3   ethernet  connected     enp0s3
enp0s8   ethernet  connected     enp0s8
br0      bridge    connected     bridge-br0
enp0s10  ethernet  disconnected  --
enp0s9   ethernet  disconnected  --
lo       loopback  unmanaged     --

[root@r79 ~]# nmcli con add type ethernet con-name br0-enp0s9 ifname enp0s9 master br0
Connection 'br0-enp0s9' (eb1b9943-7d8d-4609-91d5-6a20b4193d05) successfully added.

[root@r79 ~]# nmcli c s | grep -e ID -e br0
NAME           UUID                                  TYPE      DEVICE
bridge-br0     14fc7d0b-a8c1-4cab-987f-6c5de5214c54  bridge    br0
br0-enp0s9     eb1b9943-7d8d-4609-91d5-6a20b4193d05  ethernet  enp0s9

이제 br0 에 할당된 IP 는 enp0s9 인터페이스를 통해서 외부와 통신할 수 있습니다.

nmtui 로 Bridge 구성하기

nmtui 로 br1 을 만들어 보겠습니다.

br1 브릿지에 연결한 인터페이스를 미리 확인합니다.

[root@r79 ~]# nmcli d s
DEVICE   TYPE      STATE         CONNECTION
enp0s3   ethernet  connected     enp0s3
br0      bridge    connected     bridge-br0
enp0s8   ethernet  connected     enp0s8
enp0s9   ethernet  connected     br0-enp0s9
enp0s10  ethernet  disconnected  --
lo       loopback  unmanaged     --

enp0s10 을 사용하겠습니다.
edit 모드로 들어갑니다.

nmtui edit

아래와 같은 화면이 나옵니다. 여기서는 connection 프로파일을 추가하기 위해 <Add> 를 선택합니다. 이후에 type 으로 Bridge 을 선택하고, <Create> 를 선택합니다.

Profile name 으로 bridge-br1 , Device 로 br1 을 넣습니다. 그리고 아래쪽의 IPv4 Configuration 에서 <Manual> 로 바꾸고, Addresses 를 추가해 줍니다.
그리고 다시 위쪽으로 올라와서 BRIDGE Slaves 를 추가하기 위해 <Add> 를 선택합니다.

Ethernet type 으로 <Create> 합니다.

연결할 인터페이스의 connection 프로파일을 추가합니다. Profile name 과 Device 를 위에서 미리 확인한 인터페이스로 지정해 줍니다.

추가할 bridge-br1 프로파일에 br1-enp0s10 프로파일이 slave 로 들어간 것을 확인할 수 있습니다.
아래 부분의 <OK> 를 눌러 현재 설정으로 생성합니다.

bridge-br1 이 생성된 것을 볼 수 있습니다. <Quit> 을 눌러서 나갑니다.

아래처럼 Connection 프로파일과 설정파일, 그리고 Device 가 추가된 것이 확인되고, IP 도 설정된 것을 볼 수 있습니다.

[root@r79 ~]# nmcli c s |grep -e ID -e br1
NAME           UUID                                  TYPE      DEVICE
bridge-br1     84caca63-8772-414f-a605-49383c87f58d  bridge    br1
br1-enp0s10    9579931c-707c-4c06-a859-2a73e8c7dd0e  ethernet  enp0s10

[root@r79 ~]# ls /etc/sysconfig/network-scripts/ifcfg-* -1 | grep br1
/etc/sysconfig/network-scripts/ifcfg-br1-enp0s10
/etc/sysconfig/network-scripts/ifcfg-bridge-br1

[root@r79 ~]# nmcli d s | grep -e DEV -e br1
DEVICE   TYPE      STATE      CONNECTION
br1      bridge    connected  bridge-br1
enp0s10  ethernet  connected  br1-enp0s10

[root@r79 ~]# ip -o -4 l sh | grep br1
5: enp0s10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:bf:ce:e7 brd ff:ff:ff:ff:ff:ff
60: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\    link/ether 08:00:27:bf:ce:e7 brd ff:ff:ff:ff:ff:ff

[root@r79 ~]# ip -o -4 a sh br1
60: br1    inet 172.31.3.27/24 brd 172.31.3.255 scope global noprefixroute br1\       valid_lft forever preferred_lft forever

정리 및 요약

NetworkManager 에서 사용하는 nmcli , nmtui 도구를 이용해서 IP 설정, bonding 구성, vlan 구성, bridge 구성 방법을 확인해 보았습니다.

이 외에도 위에서도 잠깐 보았듯이, 여러가지 도구와 활용법들이 있습니다.

운영하는 시스템 환경에 따라 사용 가능한 도구 중에서, 편한 도구를 선택하여 사용하시면 됩니다.

그리고 Connection 프로파일은 중요한 부분이므로 잘 기억해 두시길 바랍니다.

감사합니다.


참조

  1. NetworkManager
  2. Networking Guide Red Hat Enterprise Linux 7 | Red Hat Customer Portal
  3. Configuring and managing networking Red Hat Enterprise Linux 8 | Red Hat Customer Portal
  4. Configuring and managing networking Red Hat Enterprise Linux 9 | Red Hat Customer Portal

오픈소스컨설팅에서 리눅스 기술 지원을 하고 있는 이동원입니다. 리눅스를 열심히 파헤치고 있어요.

Leave a Reply

Your email address will not be published. Required fields are marked *

One reply on “NetworkManager 적응하기”

  • Brian
    2024년 01월 03일 at 10:58 am

    감사합니다~