Linux NetworkManager을 Command Line에서 사용하기, nmcli


nmcli 툴은 readhat에서 개발한 NetworkManager을 제어할 수 있는 command-line 툴이다.

기본 명령은 다음과 같다.
nmcli OPTIONS OBJECT { COMMAND | help }
만일 설치된 Linux의 언어가 한글로 설정되어 있다면 설명과 결과들을 한글로 확인 할 수 있다.
~]$ nmcli help
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }

OPTIONS
  -t[erse]                                   terse output
  -p[retty]                                  pretty output
  -m[ode] tabular|multiline                  output mode
  -f[ields] |all|common   specify fields to output
  -e[scape] yes|no                           escape columns separators in values
  -n[ocheck]                                 don't check nmcli and NetworkManager versions
  -a[sk]                                     ask for missing parameters
  -w[ait]                           set timeout waiting for finishing operations
  -v[ersion]                                 show program version
  -h[elp]                                    print this help

OBJECT
  g[eneral]       NetworkManager's general status and operations
  n[etworking]    overall networking control
  r[adio]         NetworkManager radio switches
  c[onnection]    NetworkManager's connections
  d[evice]        devices managed by NetworkManager
보다 자세한 것은 [Reference.2] 내용을 참고하면 된다.

nmcli로 설정하는 모든 것들은 데스크탑 환경(http://edoli.tistory.com/119)에 내용들이 반영되기 때문에 네트워크 설정에 대한 호환성을 유지할 수 있지만, 내부적으로 D-Bus(https://en.wikipedia.org/wiki/D-Bus)을 사용함으로 응답 속도가 약간 느리다는 것을 확인할 수 있다. 하지만 command line에서 설정된 것을 그대로 데스크탑 환경에서도 사용가능하기 때문에 초보자들이 사용하는데 좋은 툴이다.

우선 NetworkManager에서는 'Device'와 'Connection' 개념을 알면 쉽게 사용할 수 있다.
위 nmcli 설명 중 'OBJECT' 항목에 있는 것이다.
  1. Device
    • 물리적인 장치로 유/무선 하드웨어 장치를 의미
    • Device는 한 개 이상의 Connection을 가질 수 있으며, 여러개의 Connection 중 하나를 선택할 수 있음.
    • 무선 장치는 여러 무선 공유기에 서로 다른 정보로 연결할 수 있기 때문에 여러 개의 Connection은 필수
    • 유선 장치는 IP 설정을 Static 또는 Dynamic(DHCP)으로 설정하는 연결을 각각 둔 후 필요시 사용 가능(보통은 DHCP로 하나만 설정해서 사용)
  2. Connection
    • Device를 이용하여 유/무선 네트워크 연결을 관리하는 것으로 이 설정에는 IPv4 또는 IPv6에서 IP를 어떻게 받을 것인지 여부와 더불어 무선 같은 경우에는 연결할 SSID, 암호 체계 및 암호 등을 관리한다. nmcli을 사용하면 wpa_supplicant을 사용하는 것보다 훨씬 무선 공유기(AP)의 암호 체계를 설정할 필요 없이 쉽게 해당 공유기에 쉽게 연결할 수 있다.

nmcli 툴 사용 후 로그들을 모두 영어로 보고 싶다면 다음과 같이 설정한다. 하지만 콘솔을 닫으면 설정은 초기화 된다.
~]$ nmcli d
장치              유형       상태          연결             
eth0             ethernet  연결됨        Local Connection 
wlx0013efc21589  wifi      연결됨        MarsNetworks     
eth1             ethernet  사용할 수 없음  --               
lo               loopback  관리되지 않음   -- 
~]$ export LC_ALL=C
~]$ nmcli d
DEVICE           TYPE      STATE        CONNECTION       
eth0             ethernet  connected    Local Connection 
wlx0013efc21589  wifi      connected    MarsNetworks     
eth1             ethernet  unavailable  --               
lo               loopback  unmanaged    --   
[DEVICE]
Device에 대한 command들은 다음과 같이 'nmcli d help'를 통해 자세하게 확인 할 수 있다.
~]$ nmcli d help

Usage: nmcli device { COMMAND | help }

COMMAND := { status | show | connect | reapply | disconnect | delete | monitor | wifi | lldp }
  status
  show []
  set [ifname]  [autoconnect yes|no] [managed yes|no]
  connect 
  reapply  ...
  disconnect  ...
  delete  ...
  monitor  ...
  wifi [list [ifname ] [bssid ]]
  wifi connect <(B)SSID> [password ] [wep-key-type key|phrase] [ifname ]
                         [bssid ] [name ] [private yes|no] [hidden yes|no]
  wifi hotspot [ifname ] [con-name ] [ssid ] [band a|bg] [channel ] [password ]
  wifi rescan [ifname ] [[ssid ] ...]
  lldp [list [ifname ]]
현재 연결 상태를 확인은 'status' 명령을 사용한다. 'nmcli d' command은 'nmcli d status'와 동일하다. 아래 표시 정보 중에 녹색은 장치가 네트워크에 연결되었다는 의미이며, 'CONNECTION' 필드에 있는 이름은 Device에 연결된 Connection 정보의 이름이다.


~]$ nmcli d
DEVICE           TYPE      STATE        CONNECTION       
eth0             ethernet  connected    Local Connection 
wlx0013efc21589  wifi      connected    MarsNetworks     
eth1             ethernet  unavailable  --               
lo               loopback  unmanaged    --
Device의 command 중에 'connect'는 연결된 Connection 정보로 연결을 시작한다.
~]$ nmcli c
NAME                  UUID                                  TYPE             DEVICE          
Local Connection      435586b8-ae15-46d2-889c-23826f139078  802-3-ethernet   eth0            
MarsNetworks          6c15b25a-6cb9-427a-9252-e9e579379b88  802-11-wireless  wlx0013efc21589 
TFTP/HTTP Connection  fb895358-84bf-408d-982c-a00b6e47f03d  802-3-ethernet   --              
그리고 Device command에 있는 'wifi'는 무선 장치에 대한 여러가지 정보들을 확인하거나 설정할 수 있는데, 주변의 AP 검색, 특정 AP에 연결을 시도할 수 있다.

AP 검색을 위해서는 다음과 같이 command을 입력한다. 색상은 신호 세기에 따라 표시되는데, 녹색이 가장 신호가 좋고, 오렌지색이 그 다음으로 신호 세기가 좋다는 의미이다. '*' 표시는 현재 연결된 AP 정보를 알려 준다.
~]$ nmcli device wifi list
*  SSID          MODE   CHAN  RATE       SIGNAL  BARS  SECURITY         
   T wifi home   Infra  1     54 Mbit/s  59      ***   WPA1 WPA2 802.1X 
   iptimejry     Infra  1     54 Mbit/s  55      **    WPA2             
*  MarsNetworks  Infra  11    54 Mbit/s  51      **    WPA2      
검색된 무선 공유기에 연결은 쉽다. 단지 'nmcli d wifi connect password ' 형태로 SSID와 password 정보만 입력하면 자동으로 Connection이 생성되면서 연결을 시도한다. 만일 암호가 틀리면 오류를 표시하지만, 연결 정보는 생성된다. 생성된 연결 정보는 'nmcli c' command로 확인 가능하다.

~]$ nmcli d wifi connect 'T wifi home' password '12345678'

Error: Connection activation failed: (7) Secrets were required, but not provided.

~]$ nmcli c
NAME                  UUID                                  TYPE             DEVICE          
Local Connection      435586b8-ae15-46d2-889c-23826f139078  802-3-ethernet   eth0            
MarsNetworks          6c15b25a-6cb9-427a-9252-e9e579379b88  802-11-wireless  wlx0013efc21589 
TFTP/HTTP Connection  fb895358-84bf-408d-982c-a00b6e47f03d  802-3-ethernet   --              
iptimejry             e5e57cea-dbd1-4ba9-ae6f-900430f0b837  802-11-wireless  --   
[CONNECTION]
Connection은 Device에서 설명했던 것처럼 Device을 기반으로 서로 다른 연결 정보를 가지도록 하여 한 개 이상 생성할 수 있다. 하지만 Device는 오직 한 개의 Connection만 사용하여 연결이 된다.
~]$ nmcli c help

Usage: nmcli connection { COMMAND | help }

COMMAND := { show | up | down | add | modify | edit | delete | monitor | reload | load }

  show [--active] [--order ]
  show [--active] [id | uuid | path | apath]  ...

  up [[id | uuid | path] ] [ifname ] [ap ] [passwd-file ]

  down [id | uuid | path | apath]  ...

  add COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS SLAVE_OPTIONS IP_OPTIONS [-- ([+|-]. )+]

  modify [--temporary] [id | uuid | path]  ([+|-]. )+

  clone [--temporary] [id | uuid | path ]  

  edit [id | uuid | path] 
  edit [type ] [con-name ]

  delete [id | uuid | path] 

  monitor [id | uuid | path]  ...

  reload

  load  [ ... ]

  import [--temporary] type  file 

  export [id | uuid | path]  []

'nmcli c' command 사용하여 추가, 삭제 및 수정과 더불어 현재 연결된 정보을 확인할 수 있다.

다음은 'Local Connection' 연결 정보를 확인하는 명령이다. 이 Connection 이름에는 공백이 있기 때문에 ''을 사용했다.
~]$ nmcli c show 'Local Connection'

connection.id:                          Local Connection
connection.uuid:                        435586b8-ae15-46d2-889c-23826f139078
connection.interface-name:              --
connection.type:                        802-3-ethernet
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.timestamp:                   1475720441
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:                        -1 (default)
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  full
802-3-ethernet.auto-negotiate:          yes
802-3-ethernet.mac-address:             00:1C:42:F5:43:D8
802-3-ethernet.cloned-mac-address:      --
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:             1 (default)
802-3-ethernet.wake-on-lan-password:    --
ipv4.method:                            auto
ipv4.dns:                               
ipv4.dns-search:                        
ipv4.dns-options:                       (default)
ipv4.addresses:                         
ipv4.gateway:                           --
ipv4.routes:                            { ip = 10.0.1.1/32 }
ipv4.route-metric:                      -1
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-timeout:                      0
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.dhcp-fqdn:                         --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
ipv4.dad-timeout:                       -1 (default)
ipv6.method:                            auto
ipv6.dns:                               
ipv6.dns-search:                        
ipv6.dns-options:                       (default)
ipv6.addresses:                         
ipv6.gateway:                           --
ipv6.routes:                            
ipv6.route-metric:                      -1
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.ip6-privacy:                       0 (disabled)
ipv6.addr-gen-mode:                     eui64
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --
GENERAL.NAME:                           Local Connection
GENERAL.UUID:                           435586b8-ae15-46d2-889c-23826f139078
GENERAL.DEVICES:                        eth0
GENERAL.STATE:                          activated
GENERAL.DEFAULT:                        yes
GENERAL.DEFAULT6:                       no
GENERAL.VPN:                            no
GENERAL.ZONE:                           --
GENERAL.DBUS-PATH:                      /org/freedesktop/NetworkManager/ActiveConnection/2
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/Settings/2
GENERAL.SPEC-OBJECT:                    /
GENERAL.MASTER-PATH:                    --
IP4.ADDRESS[1]:                         10.0.1.15/24
IP4.GATEWAY:                            10.0.1.1
IP4.DNS[1]:                             10.0.1.1
IP4.DOMAIN[1]:                          kornet
DHCP4.OPTION[1]:                        requested_routers = 1
DHCP4.OPTION[2]:                        requested_domain_search = 1
DHCP4.OPTION[3]:                        requested_time_offset = 1
DHCP4.OPTION[4]:                        requested_domain_name = 1
DHCP4.OPTION[5]:                        requested_rfc3442_classless_static_routes = 1
DHCP4.OPTION[6]:                        requested_broadcast_address = 1
DHCP4.OPTION[7]:                        requested_netbios_scope = 1
DHCP4.OPTION[8]:                        requested_wpad = 1
DHCP4.OPTION[9]:                        next_server = 0.0.0.0
DHCP4.OPTION[10]:                       expiry = 1478310264
DHCP4.OPTION[11]:                       requested_interface_mtu = 1
DHCP4.OPTION[12]:                       requested_subnet_mask = 1
DHCP4.OPTION[13]:                       routers = 10.0.1.1
DHCP4.OPTION[14]:                       dhcp_message_type = 5
DHCP4.OPTION[15]:                       ip_address = 10.0.1.15
DHCP4.OPTION[16]:                       requested_static_routes = 1
DHCP4.OPTION[17]:                       domain_name = kornet
DHCP4.OPTION[18]:                       requested_domain_name_servers = 1
DHCP4.OPTION[19]:                       broadcast_address = 10.0.1.255
DHCP4.OPTION[20]:                       requested_ntp_servers = 1
DHCP4.OPTION[21]:                       requested_netbios_name_servers = 1
DHCP4.OPTION[22]:                       dhcp_lease_time = 2592000
DHCP4.OPTION[23]:                       domain_name_servers = 10.0.1.1
DHCP4.OPTION[24]:                       requested_ms_classless_static_routes = 1
DHCP4.OPTION[25]:                       subnet_mask = 255.255.255.0
DHCP4.OPTION[26]:                       network_number = 10.0.1.0
DHCP4.OPTION[27]:                       requested_host_name = 1
DHCP4.OPTION[28]:                       dhcp_server_identifier = 10.0.1.1
IP6.ADDRESS[1]:                         fe80::21c:42ff:fef5:43d8/64
IP6.GATEWAY:                            
만일 위 정보에서 IP4 정보만 얻고 싶다면 'grep' 명령을 다음과 같이 추가하면 된다.
~]$ nmcli c show 'Local Connection' | grep IP4
IP4.ADDRESS[1]:                         10.0.1.15/24
IP4.GATEWAY:                            10.0.1.1
IP4.DNS[1]:                             10.0.1.1
IP4.DOMAIN[1]:                          kornet

[추가 유용한 설정들]
  • Static IP 설정
  • ~]$ nmcli con mod "Local Connection” ipv4.method manual ipv4.addr "10.0.1.25/8, 10.0.1.1/8"
  • DHCP IP 설정 
  • ~]$ nmcli con mod "Local Connection" ipv4.method auto ipv4.addr "" ipv4.gateway "" ipv4.dns ""

[Reference]
1. RPiWebUI.Luna: https://github.com/kmansoo/RPiWebUI.Luna, 2016, nmcli을 이용한 Web UI기반 유/무선 네트워크 설정 툴

2. USING THE NETWORKMANAGER COMMAND LINE TOOL, NMCLI

3. D-Bus: https://en.wikipedia.org/wiki/D-Bus

4. 7가지 데스크탑 환경: http://edoli.tistory.com/119

댓글

이 블로그의 인기 게시물

macOS가 갑자기 부팅이 되지 않을 경우 데이터 복구 또는 백업 방법

C++로 프로그래밍할 때 인자 또는 리턴 값으로 std::vector 등 STL 데이터 타입 처리하는 좋은 방법

Git 저장소를 병합하는 방법(How to merge repositories in Git)