﻿# 第一次把玩 Cisco Router 就上手：基本 IOS 命令列環境學習筆記

這幾天都在跟公司的 Cisco Router 奮戰，以前並沒有什麼機會去管理這台設備，但最近由於公司內部有些 IT 設備異常，不得不進去調整一下設定，也藉此學習 Cisco [IOS](https://en.wikipedia.org/wiki/Cisco_IOS) (Internetwork Operating System) 的 CLI 命令列介面。今天這篇文章我就來整理這幾天的小小心得。

![Cisco 2951](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/d4198a6a3fafae2f9322-193470515-0e4bb4fc-c3d9-4ba6-b8f9-ce8c2d148bea.jpg)

> 由於我手邊的 Cisco 設備已經都是設定完成的狀態，所以我並不太熟悉如何從全新的設備開始設定，所以本篇文章主要著重在「設備維護」部分，針對 IOS 介面如何使用、基本觀念、基礎網路設定等等。

### 基本觀念

由於 Cisco IOS 是一套網路設備專用的作業系統，他的使用方式主要以 CLI 介面為主，而在進入 IOS 的 Shell 環境時，使用習慣與我們熟悉的 Bash 環境有很大的差異，所以有著不小的進入門檻，一定要先建立部分基本觀念，才能好好的使用它。

使用上，使用 Cisco IOS 時有好幾種**命令模式**(Command modes)與上百種**設定模式**(Configuration modes)，不同的**模式**(Modes)下就會有不同的**指令**可以用，而每個命令都有綁定最多 16 種不同的權限等級(`privilege level`)，用以決定你的登入身份是否可以執行該命令。所以你在進入 IOS 的 CLI 介面之前，這是最先需要知道的背景知識。

> 輸入命令時，你隨時都可以輸入 `?` (問號) 來顯示當下的輸入提示，這是操作 Cisco IOS 的必備技能之一。

以下是常見的幾個**模式**(Modes)：

| 簡寫/模式名稱 | 模式名稱 | 提示字元 | 描述  |
| --- | --- | --- | --- |
| (`U`) 使用者模式 | `User EXEC mode` | `Router>` | 一般帳號預設連入的模式 |
| (`P`) 特權模式 | `Privileged EXEC mode` | `Router#` | 管理者帳號預設連入的模式 |
| (`G`) 設定模式 | `Configuration mode` | `Router(config)#` | 你只能從**特權模式**進入 |
| (`I`) 介面模式 | `Interface mode` | `Router(config-if)#` | 你只能從**設定模式**進入 |
| (`R`) 路由模式 | `Routing mode` | `Router(config-router)#` | 你只能從**設定模式**進入 |

> 你可以透過 SSH 登入 Cisco 設備，若你先以**沒有權限的本機帳戶**登入，要輸入 `enable` 命令才能進入 `Privileged EXEC mode`。但如果你直接用**最高權限管理員帳號**登入，預設會進入 `Privileged EXEC mode`。但

基本上，你只要連入 Cisco IOS 之後，就是不斷的在不同**模式**之間切換，然後**輸入命令執行**與**調整設定**而已。

### 在不同模式之間切換

管理者透過 SSH 登入到 Cisco 設備之後，最常見的兩種模式就切換是 `Privileged EXEC mode` 與 `Configuration mode` 了！

1.  進入 `Configuration mode` (或稱 `Global Configuration mode`)
    
    ```bash
    configure terminal
    ```
    
    或可打簡寫
    
    ```bash
    config t
    ```
    
    Cisco IOS 的命令與參數都可以打簡寫，只要簡寫的程度不會跟相同模式與相同命令下的參數重複，最少可以只打一個字母就能執行，所以上述命令也可以打成 `conf t` 就好。如下圖示說明完整的操作情境！
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/5ece5c30a8338a29c9b2-193443761-a2d0fc50-e897-47ea-a123-11f5b688dd02.png)
    
2.  退出 `Configuration mode`
    
    你可以按下 `Ctrl+Z` 快速鍵，即可立即退出 `Configuration mode`，也可以輸入 `end` 或 `exit` 退出該模式。
    
    退出到上一層模式
    
    ```bash
    exit
    ```
    
    退出到最上層模式 (**使用者模式** 或 **特權模式**)
    
    ```bash
    end
    ```
    
3.  退出 Cisco IOS 的 CLI 環境
    
    這部分跟一般 Linux 一樣，輸入 `exit` 或 `logout` 就可以退出
    
    ```bash
    exit
    ```
    
    ```bash
    logout
    ```
    

除此之外，有時候我們也會選擇在 `User EXEC mode` 與 `Privileged EXEC mode` 這兩種模式之間切換！

由於 Cisco IOS 有 `0` ~ `15` 共 16 個**權限等級**(`privilege level`)可以設定，不同的權限等級代表你可以執行的命令數量不同，控制你可以看到的或修改的設定。基本上權限等級 `0` 代表「無權限」，而 `1` 代表「不含機敏資料的唯讀權限」，而 `15` 則代表「最高權限」。

所以你可以透過 `enable` 或 `disable` 命令來切換不同的執行模式(`EXEC mode`)，而 `enable 15` 就是 `Privileged EXEC mode`，其他的權限等級都算 `User EXEC mode`！

1.  設定 `enable` 密碼
    
    不是所有的 Cisco 設備都會設定所謂的 `enable` 密碼，因為如果你已經建立好權限等級 `15` 的本機帳號，登入後基本上就已經進入 `Privileged EXEC mode` 模式，從這個模式開始就已經可以對整台電腦進行完整的設定與管理。
    
    然後，有些網管人員習慣都以非管理者帳號登入，需要的時候才透過 `enable` 命令進入 `Privileged EXEC mode` 模式，此時你就要先設定好這個 `enable` 密碼，以下是設定步驟：
    
    ```bash
    config t
    enable secret {你的高強度密碼}
    exit
    write
    ```
    
    > 最後一步 `write` 命令是將目前的設定寫入設備，當設備重啟時就會套用當前的設定。
    
2.  使用 `enable` 命令進入 `Privileged EXEC mode` 模式
    
    ```bash
    enable
    ```
    
    這裡的 `enable` 命令等同於 `enable 15` 命令，就是變身為最高權限管理者的意思，也等同於要進入 `Privileged EXEC mode` 模式，輸入此命令要立即輸入 `enable` 密碼！
    
3.  使用 `disable` 命令進入 `User EXEC mode` 模式
    
    ```bash
    disable
    ```
    
    這裡的 `disable` 命令等同於 `enable 0` 命令，就是變身為**完全無權限的使用者**的意思，也等同於要進入 `User EXEC mode` 模式！
    
    > 從較高的權限等級進入較低的權限等級時，輸入 `enable <n>` 命令時是不用輸入密碼的。
    

操作 Cisco IOS 的基本步驟如下：

1.  進入 User EXEC mode
2.  進入 Privileged EXEC mode
3.  進入 Global Configuration mode
4.  進入 Specific Configuration modes
5.  進入 Configuration submodes
6.  進入 Configuration subsubmodes
7.  ... 以此類推 ...

總之，你就是在這些模式之間切換，然後輸入命令、進行設定、查詢狀態、...等等。

### 查詢設備狀態與設定

剛開始維護 Cisco 設備時，可以透過以下命令得知一些重要資訊：

> 以下請在 `Privileged EXEC mode` 模式下執行。

-   顯示設備中的各項版本資訊
    
    ```bash
    show version
    ```
    
    > 相關文章: [Cisco Show Version Command](https://blog.router-switch.com/2013/11/cisco-show-version-command/)
    
-   顯示執行中的設定 (套用到設備中的設定值)
    
    ```bash
    show running-config
    ```
    
    我比較習慣打簡寫：
    
    ```bash
    show run
    ```
    
    或這樣打：
    
    ```bash
    s run
    ```
    
    > 其中 `s` 是一個 alias command，你可以透過 `show aliases` 查詢有哪些 alias 命令！
    
    或這樣：
    
    ```bash
    s ru
    ```
    
    由於設定可能相當複雜，你可以透過 Pipe 給 `section` 或 `include` 來篩選出需要的設定，以下是取得關鍵字中有出現 `username` 的使用範例：
    
    ```bash
    show run | section username
    ```
    
    ```bash
    show run | include username
    ```
    
-   顯示啟動設定值 (已經寫入設備的設定值)
    
    ```bash
    show startup-config
    ```
    
-   顯示時鐘資訊
    
    ```bash
    show clock detail
    ```
    
    以下是修改時區的命令：
    
    ```bash
    config t
    clock timezone CST +8
    exit
    ```
    
    以下是設備設定時間的命令，先讀出硬體時鐘，然後手動設定正確時間，最後寫回硬體時鐘：
    
    ```bash
    clock read-calendar
    clock set 17:21:00 Oct 2 2022
    clock update-calendar
    ```
    
-   顯示 ARP 資訊
    
    ```bash
    show arp
    ```
    
-   顯示 IP 路由資訊
    
    ```bash
    show ip route
    ```
    
-   顯示 VLAN 資訊
    
    ```bash
    show vlan
    ```
    
-   顯示目前設定的 IP ACLs 清單
    
    ```bash
    show access-lists
    ```
    
-   顯示目前設定的 [Route-Maps](https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/49111-route-map-bestp.html) 清單
    
    ```bash
    show route-map all
    ```
    
-   顯示目前設定的 SNAT 位址轉譯統計資訊
    
    ```bash
    show ip nat statistics
    ```
    
-   顯示目前設定的 SNAT 位址轉譯清單
    
    ```bash
    show ip nat translations | include 192.168.132.69
    ```
    
-   顯示目前登入設備的使用者清單
    
    ```bash
    show users
    ```
    
-   顯示設備的 CPU 使用率資訊
    
    ```bash
    show proc cpu history
    ```
    

### 設備帳號管理

我公司的 [Cisco Router 2951](https://www.routeripaddress.com/routers/9871/cisco-2951.html) 其預設出廠的資訊如下：

-   Default IP Address: `10.0.0.1`
-   Default Login Username: `cisco`
-   Default Login Password: `cisco`

我們拿到設備後通常第一步就是先刪除預設帳號並重新建立帳號，本章節來說明多種不同的帳號建立方式。

-   管理使用者帳號要進入**全域設定模式** ( `Global Configuration mode`)
    
    ```bash
    config t
    ```
    
-   顯示現有帳號清單
    
    ```bash
    do show run | section username
    ```
    
    > 注意: 若要在 `Global Configuration mode` 執行 `Privileged EXEC mode` 下的命令，只要在命令前加上 `do` 即可！
    
    他會顯示所有帳號與密碼的清單：
    
    ```
    username admin privilege 15 secret 5 $1$lYgd$a53zaf93jFkNNI49lC/9h.
    username user01 password 0 Pa$$w0rd
    ```
    
    從上面的例子你可以看到，我們在 Cisco 設備中建立帳號時，有兩種密碼的儲存格式，一種是**有加密**的格式，一種則是**未加密**的格式。而當你透過 `show running-config` 顯示系統設定值，**未加密**的密碼就會完整的顯示出來，因此相對比較不安全。
    
-   建立新帳號 (密碼未加密)
    
    建立帳號的命令格式如下：
    
    ```
    username [帳號名稱] password [權限等級] [密碼]
    ```
    
    實際範例如下：
    
    ```
    username user02 password 0 Pa$$w0rd
    ```
    
    刪除現有帳號
    
    ```
    no username user02
    ```
    
    > Cisco IOS CLI 在任何設定前面只要加上 `no` 就是「刪除」的意思！
    
-   建立新帳號 (密碼採用預設 MD5 演算法雜湊加密)
    
    建立帳號的命令格式如下：
    
    ```
    username [帳號名稱] privilege [權限等級] secret [密碼]
    ```
    
    實際範例如下：
    
    ```
    username user02 privilege 0 secret Pa$$w0rd
    ```
    
    刪除現有帳號
    
    ```
    no username user02
    ```
    
    > Cisco IOS CLI 在任何設定前面只要加上 `no` 就是「刪除」的意思！
    
-   建立最高權限管理者帳號 (密碼採用預設 SHA256 演算法雜湊加密)
    
    建立帳號的命令格式如下：
    
    ```
    username [帳號名稱] privilege [權限等級] algorithm-type [演算法] secret [密碼]
    ```
    
    實際範例如下：
    
    ```
    username user02 privilege 15 algorithm-type sha256 secret Pa$$w0rd
    ```
    

### 設定 SSH 免密碼登入

若你想直接無密碼 SSH 登入 Cisco 設備，需要將你的 SSH 公開金鑰設定到設備之中，以下是設定步驟：

1.  先取得你的 SSH 公開金鑰並轉成 Cisco 所需的格式
    
    建議在 WSL 或任何 Linux 環境下執行以下命令，將 `~/.ssh/id_rsa.pub` 先格式化成一個**多行**的金鑰內容，並將輸出結果複製到剪貼簿：
    
    ```bash
    fold -b -w 72 ~/.ssh/id_rsa.pub
    ```
    
    若使用 WSL 你可以這樣執行，直接複製到剪貼簿之中：
    
    ```bash
    fold -b -w 72 ~/.ssh/id_rsa.pub | clip.exe
    ```
    
2.  設定 Cisco 綁定使用者的公開金鑰
    
    進入 `Configuration mode` (或稱 `Global Configuration mode`)
    
    ```bash
    conf t
    ```
    
    進入 `conf-ssh-pubkey` 設定模式
    
    ```bash
    ip ssh pubkey-chain
    ```
    
    再進入 `conf-ssh-pubkey-user` 設定模式
    
    ```bash
    username user02
    ```
    
    再進入 `conf-ssh-pubkey-data` 設定模式，並貼上剪貼簿內容(你的 SSH 公開金鑰)
    
    ```bash
    key-string
    ```
    
    貼上剪貼簿內容，也就是你的 SSH 公開金鑰！
    
    貼上後請直接輸入 `exit` 五次，即退出 `conf-ssh-pubkey-data` 資料輸入模式、退出 `conf-ssh-pubkey-user` 設定模式、退出 `conf-ssh-pubkey` 設定模式、退出 `Global Configuration mode`、退出 IOS 介面：
    
    ```bash
    exit
    exit
    exit
    exit
    exit
    ```
    

如果要刪除使用者的公開金鑰綁定，可以這樣設定：

1.  進入 `Configuration mode` (或稱 `Global Configuration mode`)
    
    ```bash
    conf t
    ```
    
2.  透過以下設定刪除 `user02` 使用者的 SSH 金鑰綁定
    
    ```bash
    ip ssh pubkey-chain
    no username user02
    exit
    ```
    
    > 任何設定前面只要加上 `no` 就是「刪除」的意思！
    

> 參考文章: [Using SSH public key authentication with Cisco](https://nsrc.org/workshops/2016/renu-nsrc-cns/raw-attachment/wiki/Agenda/Using-SSH-public-key-authentication-with-Cisco.htm)

### 設定 RADIUS 認證與授權

我在已經設定好 VPN 相關設定的情況下，若要設定後端 RADIUS Server 驗證，可以參考以下幾種管理命令：

-   建立一個認證群組
    
    假設我們建立一個名為 `NPS` 的 RADIUS 伺服器群組，且所有 `RADIUS` 封包一律從 `GigabitEthernet0/2` 介面出去！
    
    ```bash
    aaa group server radius NPS
     server-private {YourRadiusIP} auth-port 1812 acct-port 1813 key {YourRadiusKey}
     ip radius source-interface GigabitEthernet0/2
    ```
    
    測試 RADIUS 認證過程是否有效
    
    ```bash
    test aaa group NPS {帳號} {密碼} new-code
    ```
    
-   設定 `AAA` 的套用順序
    
    > AAA = Authentication Authorization Accounting = 認證、授權、簿記
    
    變更 `ppp` 認證 (VPN) 的預設群組(`default`)，優先使用 `NPS` 做身份驗證，其次才是使用 `local` (本機帳號) 來進行驗證。
    
    變更 `network` 授權的預設群組(`default`)，允許使用 `NPS` 登入的使用者，可以動態配置 vlan 給他們使用，其次才是給通過 `local` (本機帳號) 驗證的使用者來配置。
    
    ```bash
    config t
    !
    aaa authentication ppp default group NPS local
    aaa authorization network default group NPS local
    !
    exit
    ```
    
    > 這裡的 `!` 符號，只是一種分隔命令的字元，為了增加代碼的可讀性之用，本身並不會執行任何命令。
    

### 簡易 AAA 偵錯技巧

-   對 AAA 進行認證與授權的偵錯
    
    ```bash
    debug aaa authentication
    debug aaa authorization
    ```
    
-   將偵錯訊息顯示在 Terminal 上
    
    ```bash
    terminal monitor
    ```
    
    此時你透過 VPN 撥入時的所有認證與授權資訊，全部都會顯示在 Terminal 畫面上！👍
    

### 修改 VPN 登入時自動配發的 DNS 設定值

-   顯示目前有多少個 DHCP Pool
    
    這是用來給 VPN 撥入的使用者用的 DHCP 設定
    
    ```bash
    show ip dhcp pool
    ```
    
-   變更 DNS 設定值
    
    進入 `dhcp-config` 模式
    
    ```bash
    ip dhcp pool {YourPoolName}
    ```
    
    變更該 Pool 的 DNS 設定值
    
    ```bash
    dns-server 8.8.8.8 168.95.1.1
    ```
    
    退出設定 `dhcp-config` 模式
    
    ```bash
    exit
    ```
    

### 管理 VLAN 虛擬區域網路

這是我的另一台 Core Switch 的 Cisco 設備，因為我們有切 VLAN，所以當設備異動時，也是需要手動調整的！

-   查詢 VLAN 相關設定
    
    ```bash
    show running-config | section Vlan
    ```
    
-   查詢 VLAN 相關資訊
    
    ```bash
    show vlan
    ```
    
-   將特定 Core Switch PORT 切換到不同 VLAN 的方法
    
    假設 `Gi0/14` 介面原本綁定到 `vlan 100`，我要更換到 `vlan 110` 就只要輸入以下命令即可切換：
    
    ```bash
    config t
    !
    interface Gi0/14
    switchport access vlan 110
    !
    exit
    ```
    

### 寫入設定到 `startup-config` 之中

你在 `Configuration mode` 所做的任何設定，都會立即生效，設備完全不用重開，我們用 `show running-config` 命令就可以呈現目前正在運行的設定值。

其實 Cisco 的 Router 或 Switch 都有兩種儲存的地方：

1.  隨機存取記憶體 (`RAM`) (Random-Access Memory)
    
    重開機後設定值就會消失
    
2.  非揮發性記憶體 (`NVRAM`) (Non-Volatile Random-Access Memory)
    
    可以永久保存設定值
    

所我們還需要將這些設定值儲存到 Cisco 設備的 `NVRAM` (非揮發性記憶體) 之中，你可以用 `show startup-config` 命令查看目前設備的啟動設定內容，很有可能是不一致的喔！

以下兩種指令是相同的，你選擇任何一種都可以：

1.  將 `running-config` 複製到 `startup-config`
    
    ```bash
    copy running-config startup-config
    ```
    
2.  將 `running-config` 寫入到 `NVRAM` 記憶體
    
    ```bash
    write memory
    ```
    
    因為預設值就是 `memory`，因此可以簡寫成這樣：
    
    ```bash
    write
    ```
    

### 總結

Cisco 雖然貴，但真的超穩，設定好了很少出問題。Cisco IOS 使用上雖然門檻不低，強迫你使用 CLI 介面來做設定，但設定的過程可以全部指令化是我覺得最棒的部分，這樣可以非常穩定的重現各種情境問題，只要寫對了，也通常不太需要再動。

網管的知識真的太多太多了，短時間要消化這麼多東西，確實非常吃力，過程中也要一直查資料，但是當釐清背後原理與指令的宣告方式後，很多事就變的很簡單了，而且你可以很有信心的認為：「嗯，這樣設定就對了！」

### 相關連結

-   [Cisco IOS - Wikipedia](https://en.wikipedia.org/wiki/Cisco_IOS)
-   [Configuration Fundamentals Configuration Guide, Cisco IOS Release 15M&T - Using the Cisco IOS Command-Line Interface \[Cisco IOS 15.5M&T\] - Cisco](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/fundamentals/configuration/15mt/fundamentals-15-mt-book/cf-cli-basics.html#GUID-A8FDCE6B-9D7D-4213-B6F0-342E394F308E)
-   [RADIUS Configuration Guide, Cisco IOS Release 15M&T](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/sec_usr_rad/configuration/15-mt/sec-usr-rad-15-mt-book/sec-cfg-radius.html)
-   [Cisco IOS 15.0S - Command References - Cisco](https://www.cisco.com/c/en/us/support/ios-nx-os-software/ios-15-0s/products-command-reference-list.html)
-   [Cisco Commands Cheat Sheet](https://www.netwrix.com/cisco_commands_cheat_sheet.html)
-   [Cisco Commands Cheat Sheet - Learn the Most Important IOS CLI Commands](https://www.cbtnuggets.com/resource/cisco-ios-commands-cheat-sheet)
-   [Cisco Troubleshooting Commands at Your Service](https://blog.netwrix.com/2019/08/20/cisco-troubleshooting-commands-at-your-service/)
-   [Cisco - Testing AAA Authentication (Cisco ASA and IOS)](https://www.petenetlive.com/KB/Article/0001175)
-   [Configure Basic AAA on an Access Server](https://www.cisco.com/c/en/us/support/docs/security-vpn/terminal-access-controller-access-control-system-tacacs-/10384-security.html)
-   [Chapter: Configuring 802.1X Port-Based Authentication](https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst4500/12-2/31sga/configuration/guide/config/dot1x.html#wp1133313)
-   [Route-Maps for IP Routing Protocol Redistribution Configuration](https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/49111-route-map-bestp.html)
-   [Cisco - James LAB](http://www.james-tw.com/cisco)
