伺服器架設篇 - RockyLinux 9

第十章、遠端連線伺服器 SSH / X / VNC

管理伺服器還是從遠端登入比較方便!之前我們就有提過相關的用法!這裡則是講的更多囉!

最近更新時間: 2024/04/16

維護網路伺服器最簡單的方式不是跑去實體伺服器前面登入,而是透過遠端連線伺服器連線功能來登入主機, 然後再來進行其他有的沒的維護就是了。Linux 主機幾乎都會提供 sshd 這個連線服務,而且這個服務還是主動進行資料加密的! 訊息在網路上面跑安全多了。同時我們還能透過 rsync 這個指令以 sshd 通道來達成異地資料備援的功能哩!相當不賴。 另外,如果需要伺服器提供的圖形界面軟體,除了使用 VNC 之外,也可以使用 ssh 的 X forwarding 功能, 搭配類似 windterm 就能使用伺服器的圖形軟體了!

10.1、文字界面遠端連線伺服器: sshd 伺服器

我們在前面的防火牆章節、DNS 章節,為了方便管理員在不同的系統間切換,就一直是使用『 ssh user@server 』的方式來進入其他 Linux 系統,而不是透過直接取得 VNC 終端畫面的方式~這個 ssh 就是遠端連線伺服器的用戶端軟體,伺服器端基本上是要啟動 sshd 服務的~那麼什麼是遠端連線伺服器?你也可能聽過 telnet,那又是什麼?我們連到虛擬機用的 VNC 也是取得遠端伺服器的方式, 這也是遠端連線伺服器嘛?就讓我們來聊一聊。

10.1.1、什麼是遠端連線伺服器

首先,我們來瞭解一下,什麼是『遠端連線伺服器』?這個東西的功能為何? 我想,你應該已經聽過,一部開放到網際網路上的伺服器,基本上,它可以不需要螢幕、鍵盤、滑鼠等等的周邊配備,只要有基本的主機板、CPU 、RAM、磁碟再加上一塊好一點的網路卡,並且連上網際網路,那這部主機就能夠提供你有需要的網路服務了。 但如果你需要重新設定這部主機,該如何登入主機取得類似 bash 的介面來操縱與進行修改呢?那就得要透過連線伺服器的服務了。

是的!你猜對啦,遠端連線伺服器在提供你由遠端透過文字或圖形介面的方式來登入系統, 讓你在遠端的工作機前面登入 Linux 主機以取得可操控主機之介面 (shell),而登入後的操作感覺上就像坐在系統前面一樣! 所以啦,你當然不需要遠端網路伺服器的鍵盤、滑鼠、螢幕等等。你只要工作機可以正常連線到遠端主機即可啊。

  • 連線伺服器的功能作用之一:分享 Unix Like 主機的運算能力

當你的工作需要使用到 Linux 強大的程式語言編譯功能時,那麼你一定需要 Linux 對吧!而且最好是運算速度快一點的主機, 這個時候你可以將你研究室最快的那一部主機開放出來,設定一下遠端連線伺服器,讓你的學生啦,或者是研究室的同仁啦, 可以透過這部機器幫他們進行研究的工作,這個時候,你的主機就可以讓多人進行分享 Linux 運算的功能啦!

舉例來說,台灣有個台灣杉系統,目前 (2024) 主力仍是三號機,這套系統目前提供台灣地區學者們登入進行數值模擬, 由於這套系統後端共有 5 萬多個 CPU 核心數,可以提供使用者相當大量的運算資源~那麼廣大的用戶們難道每個都要衝進去高速網路中心用電腦? 當然不用!台灣杉系統就是提供 sshd 給大家來連線登入後,再進一步去操作後端運算資源的方式!甚至於這套系統也提供 GPU 資源,用在 AI 運算上也是相當有效益的!

但是否每一部連到 Internet 上面的主機都應該要開放遠端連線的功能呢?其實並不盡然, 還是需要針對你的主機來進行規劃的,我們底下分伺服器與工作站來說明:

  • 伺服器類型 (Server) 防火牆設定:有限度的開放連線

在一般對網際網路開放服務的伺服器中,由於開放的服務可能會有較為重要的資訊,而遠端連線程式連進主機之後, 可以進行的工作又太多了(幾乎就像在主機前面工作一般!),因此伺服器的遠端連線程式通常僅針對少部分系統維護者開放而已! 除非必要,否則 Server 類型的主機的防火牆設定,還真的不建議開放連線的服務呢!

以鳥哥為例,我的主機提供了我們研究室使用 Mail 與 Internet 上面的 WWW 服務,如果還主動提供遠端連線的話, 那麼萬一不小心被入侵,那可就傷腦筋了!因此,鳥哥僅開放『很小部分的網域』讓系統管理員連進來, 其他來源的 IP 一律抵擋!不許使用遠端連線的功能呢!

  • 工作站類型 (Workstation) 防火牆設定:只對內網開放

所謂的工作站就是不提供網際網路服務的主機,僅提供大量的運算能力給使用者,例如上面提到的台灣杉系統。 既然不提供網際網路的服務,那你還開連線伺服器幹嘛?不是啊!這套系統還是得要提供給台灣的學者登入進行研究吧! 那就得要提供遠端連線功能才行!不過,為了避免被攻擊,其實台灣杉系統使用了多重身份驗證程序,要登入台灣杉系統, 其實還真的很繁瑣...那如果是我們自己內部架設的工作站呢?當然就不需要對網際網路提供連線功能囉! 只需要針對內部,或者是特定的某些來源開放他們使用你的工作站就好啊!

  • 連線伺服器界面類型

連線伺服器早期有文字界面、圖形界面等等,文字界面還有分明碼與密碼傳輸!不過,自從 ssh 出來之後, 加上可以透過 ssh 通道做圖形界面的轉遞 (X forwarding),因此,目前大多使用 ssh 了!但是一些舊系統, 可能還是得要使用比較舊的機制,因此,還是知道一些專有名詞比較好!

  • 文字介面明碼: telnet, rsh 等為主,目前非常少用;
  • 文字介面密碼: ssh 為主,已經取代上述的 telnet, rsh 等明碼方式;
  • 圖形介面: Xdmcp, VNC, RDP 等較為常見,也可以透過 ssh 的 X forwarding 功能
圖形介面最大的優點是『圖形』啊!不過,因為是透過圖形來傳送,傳輸的資料量相當的大, 所以速度與安全性都有待考量。因此,我們僅建議你將圖形介面的遠端登入伺服器開放在內部網域 (LAN) 就好了!
  • 資料傳送的明碼與密碼

什麼是『明碼』與『加密』的資料封包傳送模式呢?為什麼 telnet 使用明碼就比較不安全?所謂的明碼就是: 『當我們的資料封包在網路上傳輸時,該資料封包的內容為資料的原始格式』, 舉個常見的例子,網址列 http:// 就是明碼傳輸,網址列 https:// 就是加密傳輸~當你使用網路銀行或網路 ATM 時, 總不希望你的帳號/密碼被竊取吧?這時得用 https 對吧!所以,使用 ssh 取代 telent 當然就是必要的! 不管你輸入什麼指令,在網際網路上面傳輸時,就是被編碼過的密碼,這樣即使被竊聽,問題也就比較小!

說 ssh 比較安全,其實是透過 ssh 通道傳輸訊息時,該訊息在網路上面比較安全,因為資料是加密過的,即使被竊取, 對方可能也不會知道資料內容為何,因此資訊比較安全。但這不代表 ssh 這個通訊協定就比較安全喔!兩者意義不同!

10.1.2、連線加密技術簡介

什麼是『資料加密』呢?簡單的說,就是將人們看的懂得原始電子資料,經過一些加密運算,讓這些資料變成沒有意義的亂碼 (至少對人類來說),然後再讓這個咚咚在網路上面傳輸,而當使用者想要查閱這個資料時,再透過解密運算, 將這些咚咚反推出原始的電子資料。由於這些資料已經被重新處理過,所以,即使資料在網際網路上被 cracker 監聽而竊取,他們也不容易就推算得出來原始資料內容的。

鳥哥常常說,加密機制有點像是兩個人之間的火星語對話啦!如果你跟你的朋友約定好使用你們制訂的某種特別語言, 這個語言只對你們兩個有意義。那麼當你們兩人講話時,在旁邊的人聽到的只是一堆沒有意義的聲音,因為他們聽不懂啊! 即使路人將你的聲音錄下來,只要他不知道你們的特殊用語,那他就不可能瞭解你們對話的內容囉。

加解密運算的機制與技術非常多,我們這裡不去討論複雜的理論問題,只談對我們比較有關的一些加解密概念而已。 目前常見的網路封包加密技術通常是藉由所謂的『非對稱金鑰系統』來處理的。 主要是透過兩把不一樣的公鑰與私鑰 (Public and Private Key) 來進行加密與解密的過程。由於這兩把鑰匙是提供加解密的功用, 所以在同一個方向的連線中,這兩把鑰匙當然是需要成對的!它的功用分別如下:

  • 公鑰 (public key):提供給遠端主機進行資料加密的行為,也就是說,大家都能取得你的公鑰來將資料加密的意思;
  • 私鑰 (private key):遠端主機使用你的公鑰加密的資料,在本地端就能夠使用私鑰來進行解密。由於私鑰是這麼的重要, 因此私鑰是不能夠外流的!只能保護在自己的主機上。

由於每部主機都應該有自己的金鑰 (公鑰與私鑰),且公鑰用來加密而私鑰用來解密, 其中私鑰不可外流。但因為網路連線是雙向的,所以,每個人應該都要有對方的『公鑰』才對!那如果以 ssh 這個通訊協定來說,在用戶端與伺服器端的相對連線方向上,應該有如下的加密動作:

圖 10.1.2-1、公鑰與私鑰在進行資料傳輸時的角色示意圖
圖 10.1.2-1、公鑰與私鑰在進行資料傳輸時的角色示意圖

如上圖所示,我們如果站在用戶端的角度來看,那麼,首先你必須要取得伺服器端的公鑰,然後將自己的公鑰發送給伺服器端, 最終在用戶端上面的金鑰會是『伺服器的公鑰加上用戶端我自己的私鑰』來組成的。

另外,目前 SSH 的協定版本有兩種,分別是 version 1 與 version 2 ,其中 V2 由於加上了連線檢測的機制, 可以避免連線期間被插入惡意的攻擊碼,因此,建議直接關掉 V1 僅使用 V2 就好。既然 server 與 client 都需要提供自己的公鑰給對方加密, 那麼這把公私鑰又是如何運作與產生的呢?就讓我們來看下去!

    SSH 的連線行為簡介

我們可以將 ssh 伺服器端與用戶端的連線步驟示意為下圖,至於步驟說明如後:

圖 10.1.2-2、ssh 伺服器端與用戶端的連線步驟示意圖
圖 10.1.2-2、ssh 伺服器端與用戶端的連線步驟示意圖
  1. 伺服器取得本身的 server public/private keys: 每一次啟動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的公私鑰檔案,若系統剛剛安裝完成時,由於沒有這些公私鑰檔案,因此 sshd 會主動去計算出這些需要的成對公私鑰檔案。(如果你新建的伺服器系統想要沿用之前的 public/private keys,可以將 /etc/ssh/ssh_host* 檔案複製到新系統當中,就可以繼續沿用之前 server 的金鑰了。)
  2. 用戶端主動連線要求: 若用戶端想要連線到 ssh 伺服器,則需要使用適當的用戶端程式來連線,包括 ssh, putty 等用戶端程式。當開始連線後,server / client 兩端會協商取得兩者皆可接受的加密運算機制。若無法取得兩者皆可接受的加密機制時,該連線就中斷了。(例如,新的 RHEL 9 捨棄很多舊的加密機制, 因此,使用舊的軟體,例如 pietty 這類軟體,預設是無法連接到 RHEL 9 的 ssh 服務喔!)
  3. 伺服器傳送公鑰檔給用戶端: 接收到用戶端的要求後,伺服器便將第一個步驟取得的公鑰檔案傳送給用戶端使用。(此時應是明碼傳送,反正公鑰本來就是給大家使用的!)
  4. 用戶端記錄/比對伺服器的公鑰資料及隨機計算自己的公私鑰: 若用戶端第一次連接到此伺服器,則會將伺服器的公鑰資料記錄到用戶端的使用者家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該伺服器的公鑰資料,則用戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰資料, 則開始計算用戶端自己的公私鑰資料。
  5. 回傳用戶端的公鑰資料到伺服器端: 用戶將自己的公鑰傳送給伺服器。此時伺服器:『具有伺服器的私鑰與用戶端的公鑰』,而用戶端則是: 『具有伺服器的公鑰以及用戶端自己的私鑰』,你會看到,在此次連線的伺服器與用戶端的金鑰系統 (公鑰+私鑰) 並不一樣,所以才稱為非對稱式金鑰系統喔。
  6. 開始雙向加解密: (1)伺服器到用戶端:伺服器傳送資料時,拿用戶的公鑰加密後送出。用戶端接收後,用自己的私鑰解密; (2)用戶端到伺服器:用戶端傳送資料時,拿伺服器的公鑰加密後送出。伺服器接收後,用伺服器的私鑰解密。

在上述的第 4 步驟中,用戶端的金鑰是隨機運算產生於本次連線當中的,所以你這次的連線與下次的連線的金鑰可能就會不一樣啦! 此外在用戶端的使用者家目錄下的 ~/.ssh/known_hosts 會記錄曾經連線過的主機的 public key ,用以確認我們是連接上正確的那部伺服器。

10.1.3、工作站/備份主機的硬體準備、網路參數與 LVM 設定

什麼時候會使用到 ssh 提供給我們的用戶呢?如上面提到的高速網路中心的介紹,很多時候,我們會讓用戶連線到工作站進行數值模式模擬等任務, 同時,也可能透過 rsync 或其他 scp 等方式進行資料的異地備援,因此,在這個章節當中,我們預計會在 DMZ 的區域當中,建置兩部新系統, 一部用來作為工作站,一部用來作為備份用伺服器。基本上,相關的網路環境配置有點像底下這樣:

圖 10.1.3、本章節用來測試 ssh 的工作站/備份伺服器相關性示意圖
圖 10.1.3、本章節用來測試 ssh 的工作站/備份伺服器相關性示意圖
  • 處理硬體設定檔 (XML)、磁碟檔 (.img) 等資訊

要先記得,我們的母系統是在 cloud 的主機底下,然後我們複製的伺服器來源檔案,主要是由 server_raw 來的! 現在就讓我們來處理 XML 以及映像檔資料:

# 1. 複製 server_raw 給 server_workstation/server_bakcup 伺服器檔
[root@cloud ~]# cd /kvm/img/
[root@cloud img]# cp server_raw.img server_workstation.img
[root@cloud img]# cp server_raw.img server_backup.img

# 1.2. 由於 backup 容量要較大,因此將原本的 30G 磁碟放大到 100G!
[root@cloud img]# qemu-img resize server_backup.img 100G
[root@cloud img]# qemu-img info server_backup.img
image: server_backup.img
file format: qcow2
virtual size: 100 GiB (107374182400 bytes)
disk size: 2.39 GiB
cluster_size: 2097152
....

# 2.1. 前往設定 work station xml 設定檔
[root@cloud img]# cd /kvm/xml/
[root@cloud xml]# cp server_raw.xml server_workstation.xml
[root@cloud xml]# vim server_workstation.xml
  <name>server_workstation</name>
    <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/kvm/xml/server_workstation.uefi.fd</nvram>
      <source file="/kvm/img/server_workstation.img"/>
      <mac address="52:54:00:00:30:c4"/>
    <graphics type="vnc" port="5934" listen="0.0.0.0" passwd="rocky9">

# 2.2. 啟動 work station 虛擬機器
[root@cloud xml]# virsh create server_workstation.xml

# 3.1. 前往設定 backup xml 設定檔
[root@cloud xml]# cp server_raw.xml server_backup.xml
[root@cloud xml]# vim server_backup.xml
  <name>server_bakcup</name>
    <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/kvm/xml/server_backup.uefi.fd</nvram>
      <source file="/kvm/img/server_backup.img"/>
      <mac address="52:54:00:00:30:c5"/>
    <graphics type="vnc" port="5935" listen="0.0.0.0" passwd="rocky9">

# 3.2. 啟動 backup 虛擬機器
[root@cloud xml]# virsh create server_backup.xml

# 4. 觀察兩部系統的資訊
[root@cloud xml]# virsh list
 Id   Name                 State
------------------------------------
....
 18   server_workstation   running
 19   server_backup        running

[root@cloud xml]# netstat -tlunp | egrep '^Pro|qemu'
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 0.0.0.0:5935   0.0.0.0:*         LISTEN   2228145/qemu-kvm
tcp        0      0 0.0.0.0:5934   0.0.0.0:*         LISTEN   2227973/qemu-kvm
  • 工作站的網路佈建

工作站用的網路規劃如下:

  • IP address: 192.168.30.214/24
  • Gateway: 192.168.30.254
  • DNS server: 192.168.30.211, 192.168.30.212
  • hostname: works.server.vbird

底下的動作需要在剛剛啟用的虛擬機底下實做 (vnc://192.168.201.249:5934),這是因為我們會修改網路參數的緣故啊!

# 在工作站虛擬機 (VNC 環境) 完成如下的參數設定:
[root@server001 ~]# hostnamectl hostname works.server.vbird
[root@dhcp ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.30.214/24 \
> ipv4.gateway 192.168.30.254 ipv4.dns 192.168.30.211,192.168.30.212 \
> ipv4.dns-search server.vbird,lan.vbird,ap.vbird
[root@dhcp ~]# nmcli connection up enp1s0
[root@dhcp ~]# curl https://linux.vbird.org
# 有回應網頁資訊就對了!
  • 備份伺服器的網路佈建

備份伺服器的網路規劃如下:

  • IP address: 192.168.30.215/24
  • Gateway: 192.168.30.254
  • DNS server: 192.168.30.211, 192.168.30.212
  • hostname: backup.server.vbird

底下的動作需要在剛剛啟用的虛擬機底下實做 (vnc://192.168.201.249:5935)

# 在備份伺服器虛擬機 (VNC 環境) 完成如下的參數設定:
[root@server001 ~]# hostnamectl hostname backup.server.vbird
[root@dhcp ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.30.215/24 \
> ipv4.gateway 192.168.30.254 ipv4.dns 192.168.30.211,192.168.30.212 \
> ipv4.dns-search server.vbird,lan.vbird,ap.vbird
[root@dhcp ~]# nmcli connection up enp1s0
[root@dhcp ~]# curl https://linux.vbird.org
# 有回應網頁資訊就對了!
  • 更新 DNS zone file

因為我們多了兩個主機名稱的對應,為了讓這部主機的名稱與 IP 位址能對應,所以我們就得要去修改 master DNS 的 server.vbird 的 zone file 內容才行!你應該要在 master DNS (dns1) 上面處理 intranet 的 server.vbird zone file,也就是 /var/named/named.server.vbird 這個檔案內容才對!

# 底下所有的動作都應該要在 dns1 (master DNS) 上面動作:
[root@dns1 ~]# vim /var/named/named.server.vbird
@  IN SOA  dns1.server.vbird. adm.mail.server.vbird. ( 2024032002 3H 15M 1D 600 )
....
works    IN A    192.168.30.214
backup   IN A    192.168.30.215
....

[root@dns1 ~]# vim /var/named/named.192.168.30
@ IN SOA  dns1.server.vbird. adm.mail.server.vbird. ( 2024032002 3H 15M 1D 600 )
...
214     IN PTR  works.server.vbird.
215     IN PTR  backup.server.vbird.
...

[root@dns1 ~]# systemctl restart named-chroot
[root@dns1 ~]# dig +short works.server.vbird
192.168.30.214
[root@dns1 ~]# dig +short backup.server.vbird
192.168.30.215
[root@dns1 ~]# dig +short -x 192.168.30.214
works.server.vbird.
[root@dns1 ~]# dig +short -x 192.168.30.215
backup.server.vbird.
[root@dns1 ~]# dig +short works.server.vbird @dns2
192.168.30.214
[root@dns1 ~]# dig +short -x 192.168.30.214 @dns2
works.server.vbird.
# 從兩部 DNS 系統上面都看到相同的 IP 位址與主機名稱了!
  • 更新備份伺服器的磁碟狀態:使用 LVM 保留未來成長空間

我們在建置虛擬機器磁碟的時候,有將備份伺服器的磁碟『放大』到 100G 喔!原本僅有 30G 而已。那麼如何使用到新增加的磁碟空間呢? 先讓我們到備份用伺服器來查閱一下磁碟的狀態:

# 1. 在備份用伺服器裡面,先查看看磁碟容量有沒有變化?
[root@backup ~]# lsblk /dev/vda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    253:0    0  100G  0 disk
├─vda1 253:1    0  200M  0 part /boot/efi
├─vda2 253:2    0    1G  0 part [SWAP]
└─vda3 253:3    0 28.8G  0 part /

我們很清楚的看到,容量長大到 100G 喔!這就是虛擬機器愉快的地方!哈哈!磁碟容量可以放大咧! 因為未來不知道還會不會有需要使用到其他更多的磁碟空間,因此,目前我們預計使用 LVM 機制,將所有的多出來的容量, 通通放置到 /data 目錄下!接下來的動作怎麼進行啊?找一下 LVM 囉!很簡單~這樣做:

  1. 將剩餘的容量分割到 /dev/vda4
  2. 將 /dev/vda4 建置成為 PV
  3. 建立名為 backvg 的 VG,並加入 /dev/vda4
  4. 將所有容量通通丟給名為 backlv 的 LV
  5. 格式化成為 xfs 檔案系統後,開機自動掛載到 /data 目錄中。
# 1. 建立新分割
[root@backup ~]# fdisk /dev/vda
Command (m for help): n
Partition number (4-128, default 4): 
First sector (62912512-209715166, default 62912512): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (62912512-209715166, default 209715166): 

Created a new partition 4 of type 'Linux filesystem' and of size 70 GiB.

Command (m for help): 5
Partition number (1-4, default 4): 4
Partition type or alias (type L to list all): 30

Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): p
Device        Start       End   Sectors  Size Type
/dev/vda1      2048    411647    409600  200M EFI System
/dev/vda2    411648   2508799   2097152    1G Linux swap
/dev/vda3   2508800  62912511  60403712 28.8G Linux filesystem
/dev/vda4  62912512 209715166 146802655   70G Linux LVM

Command (m for help): w
The partition table has been altered.
Syncing disks.
# 很快的,建立好所需要的 partition 並更新了分割槽的類型 (Linux LVM)

# 2. 建立 PV
[root@backup ~]# yum -y install lvm2
[root@backup ~]# pvcreate /dev/vda4
[root@backup ~]# pvscan
  PV /dev/vda4                      lvm2 [70.00 GiB]
  Total: 1 [70.00 GiB] / in use: 0 [0   ] / in no VG: 1 [70.00 GiB]

# 3. 建立名為 backvg 的 VG
[root@backup ~]# vgcreate backvg /dev/vda4
[root@backup ~]# vgscan
  Found volume group "backvg" using metadata type lvm2

# 4. 建立名為 backlv 的 LV
[root@backup ~]# vgdisplay backvg
  --- Volume group ---
  VG Name               backvg
  System ID
  Format                lvm2
....
  VG Size               <70.00 GiB
  PE Size               4.00 MiB
  Total PE              17919
  Alloc PE / Size       0 / 0
  Free  PE / Size       17919 / <70.00 GiB

[root@backup ~]# lvcreate -n backlv -l 17919 backvg
[root@backup ~]# lvscan
  ACTIVE            '/dev/backvg/backlv' [<70.00 GiB] inherit

# 5. 格式化之後,進行自動掛載
[root@backup ~]# mkfs.xfs /dev/backvg/backlv
[root@backup ~]# mkdir /data
[root@backup ~]# vim /etc/fstab
/dev/backvg/backlv      /data   xfs     defaults 0 0

[root@backup ~]# systemctl daemon-reload
[root@backup ~]# mount -a
[root@backup ~]# df -Th /data /
Filesystem                Type  Size  Used Avail Use% Mounted on
/dev/mapper/backvg-backlv xfs    70G  532M   70G   1% /data
/dev/vda3                 xfs    29G  2.0G   27G   7% /

這樣就使用了既有的放大的磁碟來建立 LVM 檔案系統!未來如果還有額外的磁碟容量可以使用,透過上述相同的作法, 唯一的差別是,將新的 PV (假設 /dev/vda5) 加入到 backvg 當中,並且將 backlv 放大,再使用 xfs_growfs /data 來放大檔案系統, 在不需要重新格式化的情況下,我們的 /data 目錄內容,就可以放大容量啦!這就是 LVM 的好處!

10.1.4、測試:工作站 ssh 伺服器 server key 更新與 ~/.ssh/known_hosts

在鳥哥這次的虛擬環境中,所有的 server 磁碟其實都來自原本的那個 server_raw.img,那當然啦!連同系統的 sshd 伺服器金鑰, 在所有的系統當中,也都是相同的!因此當你第一次使用 ssh 連線到我們新建立的工作站主機時,可能會出現如下圖示:

# 1. 從骨幹系統 (master) 第一次連線到工作站 (works) 的情況:
[vbird@master ~]# ssh works
The authenticity of host 'works (192.168.30.214)' can't be established.
ED25519 key fingerprint is SHA256:Va9Z79fb2Kv16vT9QP46iRksvxDayLYKcMY64n3txv8.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: 192.168.11.1
    ~/.ssh/known_hosts:4: 192.168.21.1
    ~/.ssh/known_hosts:5: client001
    ~/.ssh/known_hosts:6: server001
    ~/.ssh/known_hosts:7: 192.168.30.211
    ~/.ssh/known_hosts:8: 192.168.30.212
    ~/.ssh/known_hosts:9: dns1
    ~/.ssh/known_hosts:10: dns2
    (6 additional names omitted)
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'works' (ED25519) to the list of known hosts.
vbird@works's password: 這裡輸入密碼
Last login: Mon Nov 13 10:52:35 2023 from 192.168.30.254
[vbird@works ~]$ exit

上面的大意是說,我們的 master 上面的 vbird 用戶,還未曾連線到 works 這部主機,這是第一次連線,因此需要將 server 的 public key 記載到 ~vbird/.ssh/known_hosts 檔案內。不過,這個 public key 竟然在許多部主機上面都相同!上面就是列出具有相同 server public key 的主機群~你還是可以繼續接受此金鑰就是了。最終請離開 works 主機系統!

  • 建立 works 自己的 server keys

那如何建立屬於自己的新系統的 server keys 呢?很簡單!刪除舊的 key 然後重新啟動 sshd 就好了! 不過要注意的是,這是針對新的系統來設計的一個練習,請不要在已經運作許久的系統上面操作!因為...很可能讓你的用戶大受驚嚇! 另外,也不要使用 ssh 的方式連線進新系統運作底下的流程,因為需要重新啟動 sshd 嘛!所以,底下的動作鳥哥是透過 VNC 界面運作的!

# 1. 在工作站系統 (works) 用 root 的身份刪除舊的 key
[root@works ~]# rm /etc/ssh/ssh_host_*

# 2. 重新啟動 sshd 服務
[root@works ~]# systemctl restart sshd

# 3. 查看是否有新的 keys 產生了!
[root@works ~]# ll /etc/ssh/ssh_host_*
  • server key 變更後的處理方式

當你在區網內,某個 server 的 IP 位址突然被其他主機佔用,因此,這個 IP 位址的 sshd 金鑰當然不同! 另外的案例,就是在上個練習中,我們將 works 的 server keys 變更了!這就類似我們的 server 重新安裝系統是一樣的! 反正就是 sshd 的金鑰改變了啦!此時,我們再次於 master 骨幹連線到 works,就可能出現如下圖示:

# 
[vbird@master ~]# ssh works
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:cwoKb9cr2Z6nuL1LoHiVhCkGjUincT7BbZtmtz71ANY.
Please contact your system administrator.
Add correct host key in /home/vbird/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/vbird/.ssh/known_hosts:17
Host key for works has changed and you have requested strict checking.
Host key verification failed.

上面的錯誤訊息就是在告知我們,遠端主機 sshd 金鑰跟之前我們連線時所紀錄的不同了!要注意這是正確的還是被攻擊了? 然後,如上的特殊字體部份,在第 17 行的紀錄可能就是衝突點!我們知道這是正常的錯誤!因為剛剛重建金鑰而已嘛!那要如何處理呢? 超簡單!只要根據上面提示的資料,到 ~user/.ssh/known_hosts 的該行,將那一行 (這個案例中就是第 17 行) 刪除, 那就可以再次使用了。另外,如果不想要每次都按下 (yes) 才紀錄到 .ssh/known_hosts 的話,也能夠用特殊參數處理掉!

# 1. 先刪除紀錄資料
[vbird@master ~]# vim ~/.ssh/known_hosts
# 請自己刪除掉第 17 行喔!

[vbird@master ~]# ssh -o StrictHostKeyChecking=no works
Warning: Permanently added 'works' (ED25519) to the list of known hosts.
vbird@works's password: 
Last login: Thu Mar 21 23:03:10 2024 from 192.168.30.254
[vbird@works ~]$

這樣就自動加入 works 的金鑰進入 .ssh/known_hosts 檔案中了!這個參數其實很有效用的!尤其是在虛擬機器環境中! 然後使用 shell script 進行某些測試時,不用瘋狂按下 yes 啦!方便得很!

10.1.5、用戶端程式 ssh, scp, sftp 與 windterm

現代的 PC 使用的作業系統: Linux/Windows,以及蘋果電腦的 MAC 系統,這三大主流桌上型電腦的系統當中,都有內建的 ssh 用戶端軟體, 且使用的語法方式幾乎相同!唯一的差別是,Linux 啟動的是類似 bash 的 shell 環境,Windows 與 MAC 則需要啟動各自的終端機環境, 在 Windows 環境可以從搜尋框輸入『 cmd 』找到命令提示字元,MAC 則從『應用程式』、『工具程式』找到『終端機』來啟動即可。 底下的指令大部分都可以在三個主流作業系統當中使用喔!

  • ssh: 直接登入遠端伺服器的指令

SSH 在 client 端使用的是 ssh 這個指令,也可以指定非正規的 ssh port (正規 ssh port 為 22)。不過,一般的用法可以使用底下的方式:

[vbird@master ~]# ssh [-f] [-o 參數項目] [-p 非正規埠口] [帳號@][IP|主機名] [指令]
[vbird@master ~]# ssh -p 2233 user@server_name
[vbird@master ~]# ssh user@server_name uptime

基本上,我們最常使用的是『 ssh user@server_name 』的方式來登入遠端主機,但是,如果遠端主機啟用的埠口並非在正規埠口, 那就得要轉用其他埠口來連線~所以可能會用到『 ssh -p 2233 user@server_name 』的方式。如果不想要登入遠端主機, 僅需要在遠端主機執行一個指令就離開,那就可以在後頭加上需要執行的指令,例如『 ssh user@server_name uptime 』。 有時候你也可以加上一些特殊的參數,那就需要用到 -o 的選項,這部份我們在下一個小節再來詳細介紹。

如果登入遠端去立刻執行個指令就離開~也可以這樣做:

[vbird@master ~]# ssh -f works find / &> ~/find.log
[vbird@master ~]# <==你會發現,你的游標還是在自己原本的系統中喔!

讓指令自己在 works 跑,我們立刻回來繼續做 master 自己的任務!

  • scp: 檔案異地複製的指令

ssh 除了可以『登入遠端主機』之外,透過這個 ssh 的連線通道,我們也可以進行異地複製檔案的功能!那就是透過 scp 這個指令的協助了! scp 常見的簡單用法如下:

[vbird@master ~]# scp [-Cpr] [-l 速率] file  [帳號@]主機:目錄名  <==上傳
[vbird@master ~]# scp [-Cpr] [-l 速率] [帳號@]主機:file  目錄名  <==下載
選項與參數:
-C :傳送與接收進行壓縮功能,適用於頻寬較低的環境中
-p :保留原本檔案的權限資料;
-r :複製來源為目錄時,可以複製整個目錄 (含子目錄)
-l :可以限制傳輸的速度,單位為 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s

其實上傳或下載的重點是那個冒號 (:) 囉!連接在冒號後面的就是遠端主機的檔案。因此,如果冒號在前, 代表的就是從遠端主機下載下來,如果冒號在後,則代表本機資料上傳啦!而如果想要複製目錄的話,那麼可以加上 -r 的選項!

# 1. 將 /etc/hosts 及 /etc/fstab 傳送到 works 的 /dev/shm 上
[vbird@master ~]# scp /etc/hosts /etc/fstab works:/dev/shm
vbird@works's password: 
hosts                          100%  246   645.5KB/s   00:00
fstab                          100%  608     2.2MB/s   00:00

如果你的網路頻寬比較低 (例如傳輸資料到不同國家去),而且你的資料比較屬於文字型態的 (可壓縮率比較高的檔案格式), 那可以加上 -C 在送出之前進行壓縮,這樣在網際網路上面傳輸時,可以加快速度!只是 server/client 兩端就得要花費比較多的 CPU 資源進行壓縮/解壓縮。因此,在內網 (LAN) 時,就不建議使用 -C 這個增加壓縮的參數。

# 1. 傳輸一個巨型檔案到 works 上
[vbird@master ~]# dd if=/dev/zero of=/dev/shm/bigfile.txt bs=1M count=200
[vbird@master ~]# ll -h /dev/shm/bigfile.txt
-rw-r--r--. 1 vbird vbird 200M Mar 31 17:13 /dev/shm/bigfile.txt

[vbird@master ~]# scp -C /dev/shm/bigfile.txt works:/dev/shm
vbird@works's password:
bigfile.txt                    100%  200MB 185.2MB/s   00:01
# 看看傳輸速率,有時候會提升到很莫名其妙的狀態!就是因為壓縮!

# 2. 每秒 10Mbytes/s 的速度,傳送到 works 上!
[vbird@master ~]# scp -l 80000 /dev/shm/bigfile.txt works:/dev/shm
vbird@works's password:
bigfile.txt                    100%  200MB   9.6MB/s   00:20
# 同樣的傳輸方式,你會發現到速度變得比較慢!

[vbird@master ~]# rm /dev/shm/bigfile.txt
[vbird@master ~]# ssh works rm /dev/shm/bigfile.txt
# 雖然是放置在 /dev/shm 底下~不過,安全起見,還是手動刪除測試檔案好了!
在鳥哥的經驗中,scp 加上 -C 的參數用在網際網路的傳輸上面,進行異地備援之類的工作時,真的會節省不少頻寬! 有需要的朋友可以測試看看!會減少很多傳輸的時間喔!
  • sftp: 模擬 FTP 功能的檔案傳輸方式

雖然 scp 也可以使用萬用字元來進行檔案的傳輸,不過...如果你不知道檔案的檔名,還得要去遠端主機搜尋時, 那就比較麻煩一點~此時,使用模擬 ftp 功能的 sftp ,就是你的好朋友~sftp 同樣是登入到遠端伺服器, 只是, ssh 的功能是取得 shell 去跟系統互動,sftp 則是透過 ftp 功能去進行檔案的傳輸!使用方式很簡單:

[vbird@master ~]# sftp works
vbird@works's password:
Connected to works.
sftp> help
Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
...
exit                               Quit sftp
get [-afpR] remote [local]         Download file
...
lcd path                           Change local directory to 'path'
lls [ls-options [path]]            Display local directory listing
lmkdir path                        Create local directory
...
lpwd                               Print local working directory
ls [-1afhlnrSt] [path]             Display remote directory listing
...
mkdir path                         Create remote directory
progress                           Toggle display of progress meter
put [-afpR] local [remote]         Upload file
pwd                                Display remote working directory
quit                               Quit sftp
reget [-fpR] remote [local]        Resume download file
...
reput [-fpR] local [remote]        Resume upload file
sftp> exit

進入到 sftp 之後,那就跟在一般 FTP 模式下的操作方法沒有兩樣了!底下我們就來談一談, sftp 這個介面下的使用指令吧!

sftp 常用指令彙整
針對遠方伺服器主機 (Server) 之行為
變換目錄到 /etc/test 或其他目錄 cd /etc/test
cd PATH
列出目前所在目錄下的檔名 ls
dir
建立目錄 mkdir directory
刪除目錄 rmdir directory
顯示目前所在的目錄 pwd
更改檔案或目錄群組 chgrp groupname PATH
更改檔案或目錄擁有者 chown username PATH
更改檔案或目錄的權限 chmod 644 PATH
其中,644 與權限有關!回去看基礎篇!
建立連結檔 ln oldname newname
刪除檔案或目錄 rm PATH
更改檔案或目錄名稱 rename oldname newname
離開遠端主機 exit (or) bye (or) quit
針對本機 (Client) 之行為(都加上 l, L 的小寫 )
變換目錄到本機的 PATH 當中 lcd PATH
列出目前本機所在目錄下的檔名 lls
在本機建立目錄 lmkdir
顯示目前所在的本機目錄 lpwd
針對資料上傳/下載的行為
將檔案由本機上傳到遠端主機 put [本機目錄或檔案] [遠端]
put [本機目錄或檔案]
如果是這種格式,則檔案會放置到目前遠端主機的目錄下!
將檔案由遠端主機下載回來 get [遠端主機目錄或檔案] [本機]
get [遠端主機目錄或檔案]
若是這種格式,則檔案會放置在目前本機所在的目錄當中!可以使用萬用字元,例如:
get *
get *.rpm
亦是可以的格式!

就整體而言,sftp 在 Linux 底下,如果不考慮圖形介面,那麼他已經可以取代 FTP 了呢!因為所有的功能都已經涵蓋啦! 因此,在不考慮到圖形介面的 FTP 軟體時,可以直接關掉 FTP 的服務,而改以 sftp-server 來提供 FTP 的服務吧! 讓我們來玩一玩底下的流程:假設你要在 master/works 之間傳輸資料,但是希望可以隨時觀察兩端的檔案檔名資料, 可以這樣做:

[vbird@master ~]# sftp -C works
vbird@works's password:
Connected to works.
sftp> 

# 1. 跑到 works 的 /etc/yum.repos.d 目錄,並查看裡面的檔名
sftp> cd /etc/yum.repos.d/
sftp> ls -l
-rw-r--r--  1 root   root    6586 Jun 11  2023 rocky-addons.repo
-rw-r--r--  1 root   root    1161 Jun 11  2023 rocky-devel.repo
-rw-r--r--  1 root   root    2379 Jun 11  2023 rocky-extras.repo
-rw-r--r--  1 root   root    3405 Jun 11  2023 rocky.repo

# 2. 切換本機 (master) 目錄,到 /dev/shm 底下,並查看檔案
sftp> lcd /dev/shm/
sftp> lpwd
Local working directory: /dev/shm
sftp> lls -l
total 0

# 3. 在本機端 (master) 建立 copy_file 目錄,並將 works 的 rocky.repo 檔案複製過來
sftp> lmkdir copy_file
sftp> lcd copy_file/
sftp> get rocky.repo
Fetching /etc/yum.repos.d/rocky.repo to rocky.repo
rocky.repo                   100% 3405     4.1MB/s   00:00

# 4. 檢查 works 有沒有 /etc/vi* ,有的話就複製到 master 下
sftp> ls /etc/vi*
/etc/vimrc  /etc/virc
sftp> get /etc/vi*
Fetching /etc/vimrc to vimrc
vimrc                        100% 4017   233.7KB/s   00:00
Fetching /etc/virc to virc
virc                         100% 1184   279.1KB/s   00:00
sftp> lls -l
total 12
-rw-r--r--. 1 vbird vbird 3405 Apr  4 23:20 rocky.repo
-rw-r--r--. 1 vbird vbird 4017 Apr  4 23:23 vimrc
-rw-r--r--. 1 vbird vbird 1184 Apr  4 23:23 virc
sftp> exit

基本上,sftp 跟 scp 都是在進行檔案的異地複製功能,不同的地方在,scp 每次進行,都需要重新登入與敲擊密碼, sftp 則是一次登入後,可以在遠端進行資料查詢、複製、下載、上傳等任務,而且在上傳/下載過程中,如果網路失敗導致傳輸遺失的時候, 你可以透過 reget 或 reput 的方式,或者是 put -a 或 get -a 的方式,讓檔案可以在遺失點重新『繼續』動作,而不用重複傳輸已經傳輸過的部份! 這對於節省頻寬或者是實際傳輸大型檔案的過程中來說,實在非常有幫助喔!

  • putty: Windows 的 ssh 用戶端軟體

windows 原生的 ssh 指令在命令提示字元 (cmd) 環境下,用起來怪怪的~所以,一般鳥哥使用的工作機,比較常用的其實是 putty 這套軟體。 putty 可以簡單的調整字體大小,調整歷史紀錄資料,用滑鼠進行複製貼上也很簡單。還有,也可以進行圖形界面的轉遞 (X11 forwarder)。 基本上,你可以從底下的連結抓到 putty 的下載點,除了有安裝版本,也有綠色執行檔版本 (不需要安裝)。通常鳥哥喜歡使用 putty.exe 而已, 所以,鳥哥僅下載使用 putty.exe 而已囉。

下載 putty.exe 之後,雙擊圖示,就會出現如下的畫面。基本上,你只要填寫預計要連線的伺服器 IP 或主機名稱即可開始連線! 不過,鳥哥通常會喜歡做些額外的設定,那這個軟體操作起來,才會更符合你自己的使用習慣!所以,就讓我們來處理處理。 主要需要處理的部份大致有:

  • Session 部份:(1)伺服器的 IP 位址或主機名稱,以及(2)埠口 (一般是 port 22) 設定,最後,(3)為你的設定取一個好記的名稱
    putty 的設定示意圖
  • Terminal --> Features 部份:勾選『Disable application keypad mode』項目,讓你鍵盤右側的數字鍵能正常發揮效果
    putty 的設定示意圖
  • Window 部份:(1)設定視窗的大小 (columns, Rows) 以及 (2)設定滾輪紀錄的筆數
    putty 的設定示意圖
  • Windows --> Appearance 部份:設定字型選項,隨便你選擇適用的字型囉!
    putty 的設定示意圖
  • Windows --> Colours 部份:原本是黑底白字,要改成白底黑字,選擇『Use system colours』項目即可。
    putty 的設定示意圖
  • Connection --> SSH --> X11 部份:如果需要進行 X 視窗畫面的轉遞,勾選這個項目即可。
    putty 的設定示意圖
  • Session 部份:按下『Save』按鈕,就會將你的紀錄記下來,未來雙擊 vbird_master 這個你的名稱設定,就可以使用上述的設定連線!
    putty 的設定示意圖
  • 最終登入的畫面當中,在標題列按下右鍵,也能繼續選擇『Change Settings』做短暫的即時變更設定功能
    putty 的設定示意圖
  • 詳細的設定,其實紀錄在 『HKEY_CURRENT_USER --> Software --> SimonTatham --> PuTTY --> Sessions』裡面!使用『 regedit 』 指令,就可以看到如下的內容示意:
    putty 的設定示意圖
鳥哥還蠻喜歡使用 putty 這套軟體的~除了複製資料非常方便之外,滑鼠的協助功能也很棒~右鍵直接貼上~ 啟動所花費的時間也很短,設定又能儲存,用久了就變笨了...哈哈!登入遠端伺服器之後,操作的行為則跟一般的 ssh 軟體沒有兩樣囉!
  • windterm: 圖形化界面軟體

有時候,我們可能會需要同時做 ssh 與 sftp 等任務,有沒有更簡單的方式,可以讓我們同時登入處理這些任務? 也是有的,此時需要用到圖形使用者界面。鳥哥只用過兩套這種界面,分別是:

雖然兩套都有免費版本,但 windterm 是完全自由的軟體,同時支援 Linux/Windows/MAC 系統,而且標榜速度超級快!所以鳥哥單純介紹 windterm。 此外,其實鳥哥都使用 putty 而已,用 windterm 的原因,只是要取得後面要介紹的 X11 forwarding 功能而已!現在,請到底下的連結, 開始下載 windterm 吧!鳥哥在實驗時,使用的是 WindTerm_2.6.1_Windows_Portable_x86_64.zip 這個檔案的下載, 您也可以下載更新的軟體~

下載完畢之後,你可以將該檔案解壓縮在任何位置上,之後進入 WindTerm_version 目錄,雙擊『WindTerm.exe』檔案, 就可以出現如下的畫面,因為可以紀錄上次登入的資訊,這裡建議直接選擇軟體目錄即可。

putty 的設定示意圖

有趣的是,windterm 會從登錄檔當中抓取 putty 的設定,所以,如果一切無誤,你可以在 windterm 右上方的是角落中,找到你剛剛的設定值。

putty 的設定示意圖

假設你沒有相關的 putty 設定,那此時只需要在『會議』選擇『新會話』的按鈕,如下所示:

putty 的設定示意圖

在出現的新視窗中,填寫你的主機號碼 (主持人),之後就可以按下『連線』按鈕,如下所示:

putty 的設定示意圖

一切順利的話,接下來就是要接受 server 的公鑰,同時選擇『 Account 』的頁面,並輸入你的帳號。windterm 連帳號都隱藏喔! 所以輸入帳號名稱的時候,也會跑出密碼類似的樣式!如下所示:

putty 的設定示意圖

出現輸入密碼的畫面,這個也很有趣!當你輸入密碼字元時,螢幕上出現的密碼位數會改變喔~為了防止你的密碼長度被人家猜到的緣故! 鳥哥覺得這相當有趣!如下所示:

putty 的設定示意圖

順利登入後的畫面如下所示,中央的部份就是你可以下達指令的位置,左側下方則是你目前目錄的檔案內容,你可以使用拖曳的方式, 將檔案上傳或下載,相當方便!只是,在鳥哥的環境中,上傳/下載啟動的時間頗長,不知道為什麼。

putty 的設定示意圖

最後要特別注意的,是這個 windterm 還有提供一個 X server 的功能!內建就提供,不用額外安裝什麼軟體!同時,X 運作的效率頗強! 圖形界面顯示相當快速!在 windterm 右上方的畫面就有一個 X 的圖樣,如下所示。鳥哥目前沒有要用到這個,所以暫時不啟動~ 之後講到時,會再次使用喔!

putty 的設定示意圖
  • 其他可使用 ssh 通道的軟體

ssh 的軟體大致上就如上面的介紹,但是,透過 ssh 通道的軟體應用就非常多!例如圖形化界面的傳輸可以使用 Filezilla, 線上編輯可以使用 nodepad++,想要寫複雜的程式,可以透過 vs code 等等,這些軟體通通支援 SSH 通道!也就是說,一個 ssh, 大家都能使用!非常愉快啊!相關軟體的官網如下,有興趣的夥伴們可以自行前往下載應用。

鳥哥的學生很喜歡使用 vs code 進行程式,如 python, javascript, php 的撰寫,而且 vs code 也是跨平台,各個平台都有相對的下載程式。 不過,鳥哥個人比較喜歡使用輕量的 nodepad++ 軟體,寫簡單的程式頗方便,啟動快速,設定簡單!只是...目前只有 windows 版本, 比較可惜就是了。

10.1.6、用戶端設定檔 ssh_config 與 ~/.ssh/config

我們在講到 scp 指令應用中,曾經提到 -C 這個參數,他可以透過 server / client 兩端在傳送訊息前,主動將訊息壓縮後傳出, 這樣可以節省頻寬。那,你應該要問的問題是,如果預設就是加強壓縮了,能不能取消壓縮?另外,能不能改用其他的訊息加密機制 (ciphers)? 有沒有什麼特定的設定檔呢?有的!那就是 /etc/ssh/ssh_config 設定檔!這個設定檔主要是針對用戶端軟體的預設參數設計, 也就是針對 ssh, scp , sftp 等的預設值設計喔!我們可以在 master 系統上面,使用 ssh -v 來查詢看看設定檔在哪裡:

# 使用 -v 參數,查詢連線機制的預設設定檔檔名
[vbird@master ~]# ssh -v vbird@works
OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug1: configuration requests final Match pass
debug1: re-parsing configuration
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug1: Connecting to works [192.168.30.214] port 22.
debug1: Connection established.
.....

你可以很清楚的看到基本設定檔就是上面那幾個~基本上,其實主設定檔僅有 ssh_config 而已, 其他兩個 (50-redhat.conf, openssh.config) 都是被主設定檔或上層設定檔引用 (include) 進來的! 那我們先來查查主設定檔的內容吧:

[vbird@master ~]# vim /etc/ssh/ssh_config
# Host *
#   ForwardAgent no
#   ForwardX11 no
#   PasswordAuthentication yes
....
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
....
#   Port 22
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
....
Include /etc/ssh/ssh_config.d/*.conf

上面是大部分的預設值~如果你想要修改預設值,可以在該檔案最後一行的設定值中,將自己的設定寫入 /etc/ssh/ssh_config.d/file.conf 當中即可!那如果想要立刻查詢目前的設定呢?可以使用 ssh -Q 喔!

# 1. 查詢支援的壓縮功能
[vbird@master ~]# ssh -Q compression
none
zlib@openssh.com
zlib

# 2. 查詢支援的演算法機密機制
[vbird@master ~]# ssh -Q ciphers
3des-cbc
aes128-cbc
....
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com

目前的 CPU 都有 AES 加解密的硬體加速機制,所以,使用 aes 的傳輸速度會是比較快速的!因此,在 LAN 裡面的傳輸, 建議『不要啟動壓縮,使用最低限度的加密演算』可能比較有利於網路傳輸!那要如何執行指令?可以這樣做看看:

# 使用自訂功能進行 ssh 連線
[vbird@master ~]# ssh -o Compression=no -o Ciphers=aes128-gcm@openssh.com works
vbird@works's password: 
[vbird@works ~]$ exit

不過,除非有特殊要大家通通遵守的規定,否則,這個設定檔就保留吧!不用更動他~要處理的,反而是底下這個檔案。

  • ~/.ssh/config: 自訂設定值

如果每次都要加上『 -o... 』一堆資料,你可能會覺得很煩~那麼有沒有其他『個人化』的設定檔可以指定某些特定的主機進行個別參數設定? 是有的!就直接修改家目錄底下 .ssh/config 即可!這個檔案的設定方式也很簡單!基本上,都是照抄 /etc/ssh/ssh_config 而已! 假設你在 master 的 vbird 用戶,可以這樣指定你的設定值喔:

[vbird@master ~]# vim ~/.ssh/config
# Host 自行設定的好記的名稱
#  Hostname 通常就是 IP 位址,或是可以找到 IP 位址的主機名稱
#  Compression 是否啟動壓縮功能
#  Ciphers 使用的加密機制設計
Host works
  Hostname 192.168.30.214
  Compression no
  Ciphers aes128-gcm@openssh.com
Host backup
  Hostname 192.168.30.215
  Compression no
  Ciphers aes128-gcm@openssh.com
Host myserver
  Hostname my.server.name
  Port 3388
  User myname
  Compression yes
  ForwardX11 yes

[vbird@master ~]# ssh myserver

未來在使用 ssh 相關軟體時,就會主動出現 works, backup, myserver 等主機名稱,可以讓你輕鬆的連線到你想要去的位置, 不但不用記憶 IP 位址,而且例如登入的埠口、使用者帳號等,都可以額外設定在各自的環境下!使用相當方便! 更多的參數可以使用『 man ssh_config 』去查詢看看。

10.1.7、工作站:編譯與執行 AERMOD 空品軟體

什麼時候你會需要使用 ssh 連線到工作站呢?鳥哥這邊提供個例子來處理。鳥哥之前讀書的時候,主要的工作在研究大氣污染, 後來著重在了解污染源排放與擴散之後產生的環境影響相關的專案。那有什麼數值軟體可以模擬排放到空氣中的污染物,經過氣象條件 (風速、風向、溫濕度的影響等) 的擴散/傳輸作用之後,到達下風處時,該空氣污染物的濃度剩下多少呢?有的,那就是 AERMOD 這套軟體。

AERMOD 這套軟體主要是美國環保署開發,要給他們國內做空氣品質研究的學者、顧問公司使用的一套擴散模擬的軟體。 比較有趣的是,它還是開放源碼!除了提供預設的 Windows 預編執行檔之外,也額外提供了 fortran 相關的程式碼,詳細的流程請參考如下網站:

AERMOD 使用的程式語言為 fortran ,為了開發方便,所以將各個功能以多個不同的 fortran 程式檔案撰寫,因此會有很多程式碼檔案, 編譯過程就比較複雜~而且程式功能與時俱進,版本眾多,目前 (2024) 提供的版本為 v23132 (2023/10/12)。 你可以在上面的網站下載原始碼。不過,在進行軟體的編譯之前,我們的 Linux 也要成為開發環境才行啊!那...很多軟體需要安裝耶! 沒關係,RHEL 提供了『Development Tools』開發工具組給大家使用~我們可以一次安裝好大部分需要的開發軟體:

# 前往 words 工作站主機,安裝開發環境所需要的支援軟體
[vbird@master ~]# ssh works
[vbird@works ~]# sudo yum -y groupinstall "Development Tools"
[vbird@works ~]# sudo yum -y install wget unzip gcc-gfortran

安裝完畢,自然就可以下載原始碼了!再次強調,鳥哥這邊使用的是 v23132 的版本,但是台灣地區在 2024 年公告的模式依舊使用 v21112 的版本。 只是,美國環保署網站上面我找不到 v21112 的原始碼了...所以只好拿 v23132 的版本來解說。鳥哥就不知道當讀者們要使用時,到底剩下哪個版本可以用... 所以,鳥哥只好從美國環保署下載 v23132 的原始碼提供大家操作使用~台灣模式支援中心的說明以及鳥站的下載點如下:

# 在 works 工作站,從鳥站下載 v23132 的 AERMOD 原始碼
[vbird@works ~]# wget https://linux.vbird.org/linux_server/rocky9/0230sshd/aermod_source_v23132.zip
[vbird@works ~]# unzip aermod_source_v23132.zip
[vbird@works ~]# cd aermod_source_code_23132/

如果參考 gfortran-aermod.bat 這個原始碼目錄中提供的編譯流程,你會發現到編譯過程還挺麻煩的!所以, 我們通常建議寫一隻 Makefile 作為等等編譯 (make) 的參考資料。只是這個檔案的語法比較特別,需要注意的是:

  • 在 makefile 當中的 # 代表註解;
  • <tab> 需要在命令行 (例如 gfortran 這個編譯器指令) 的第一個字元;
  • 標的 (target) 與相依檔案(就是目標檔)之間需以『:』隔開。
# 開始設計 make 功能
[vbird@works aermod_source_code_23132]# vim Makefile
# 1. 先規範編譯器、編譯參數、連結參數
FC = gfortran
FFLAGS = -fbounds-check -Wuninitialized -O3  -march=native -Wno-uninitialized
LFLAGS = -O3  -march=native

# 2. 建立原始檔案與處理目標檔案 (object file)
SRC = \
 modules.f  grsm.f     aermod.f   setup.f    coset.f    soset.f    \
 reset.f    meset.f    ouset.f    inpsum.f   metext.f   iblval.f   \
 siggrid.f  tempgrid.f windgrid.f calc1.f    calc2.f    prise.f    \
 arise.f    prime.f    sigmas.f   pitarea.f  uninam.f   output.f   \
 evset.f    evcalc.f   evoutput.f rline.f    bline.f
OBJ = $(SRC:.f=.o)

# 3. 處理編譯流程
main: ${OBJ}
	${FC} -o aermod.exe ${LFLAGS} ${OBJ}

clean:
	rm -fv *.o  *.mod

[vbird@works aermod_source_code_23132]# make
gfortran -fbounds-check -Wuninitialized -O3  -march=native -c -o modules.o modules.f
gfortran -fbounds-check -Wuninitialized -O3  -march=native -c -o grsm.o grsm.f
....
gfortran -o aermod.exe -O3  -march=native modules.o grsm.o aermod.o ... rline.o bline.o

[vbird@works aermod_source_code_23132]# ll aermod.exe
-rwxr-xr-x. 1 vbird vbird 2873720 Apr  9 15:33 aermod.exe

# 將 aermod.exe 放置到所有用戶都可以執行的 PATH 內
[vbird@works aermod_source_code_23132]# sudo cp -a aermod.exe /usr/local/bin
[vbird@works aermod_source_code_23132]# aermod.exe --help
 usage: 0, 1, or 2 args

 Usage: AERMOD 23132  takes either no or one or two parameters.
        Either
              AERMOD
        Or
              AERMOD plumetest.inp
        Or
              AERMOD plumetest.inp plumetest.out

        The first parameter  is the .INP file name,
        The second parameter is the .OUT file name,

上面的 Makefile 可以在底下的網址下載:

這樣就編譯成功,而且等待我們執行了!現在,我們可以從模式支援中心去下載適用的輸入範例檔,拿來作為執行過程的資料, 看看能否操作 aermod.exe 擴散模式~同樣的,鳥哥為了方便大家下載,也先將模式支援中心的範例下載好了,大家直接取用吧:

# 前往使用者家目錄,下載範例檔,然後解壓縮
[vbird@works ~]# wget https://linux.vbird.org/linux_server/rocky9/0230sshd/aermod_example.tar.gz
[vbird@works ~]# tar -zxvf aermod_example.tar.gz
[vbird@works ~]# cd aermod_example/
[vbird@works aermod_example]# ll
-rw-r--r--. 1 vbird vbird  588528 Jun  8  2022 aermod.pfl   <==高空氣象資料檔
-rw-r--r--. 1 vbird vbird 1563673 Jun  8  2022 aermod.sfc   <==地面氣象資料檔
-rw-r--r--. 1 vbird vbird    1780 Apr  9  2024 aermod.inp   <==主要輸入檔
-rw-r--r--. 1 vbird vbird   24255 Sep  1  2022 grid.dat     <==地形資料檔

# 開始運作 aermod 主程式
[vbird@works aermod_example]# aermod.exe aermod.inp aermod.out
+Now Processing SETUP Information
+Now Processing Data For Day No.    1 of 2020
+Now Processing Data For Day No.    2 of 2020
.....
+Now Processing Data For Day No.  365 of 2020
+Now Processing Data For Day No.  366 of 2020
+Now Processing Output Options

[vbird@works aermod_example]# ll
-rw-r--r--. 1 vbird vbird    1780 Apr  9 15:54 aermod.inp
-rw-r--r--. 1 vbird vbird   86897 Apr  9 15:57 aermod.out  <==輸出資料說明檔
-rw-r--r--. 1 vbird vbird  588528 Jun  8  2022 aermod.pfl
-rw-r--r--. 1 vbird vbird 1563673 Jun  8  2022 aermod.sfc
-rw-r--r--. 1 vbird vbird   24255 Sep  1  2022 grid.dat
-rw-r--r--. 1 vbird vbird   48452 Apr  9 15:57 plot.plt    <==繪圖檔

很快的,我們就執行過一個簡單的 AERMOD 範例程式~而且也順利的跑出繪圖檔~未來只需要使用相同的方式,放置不同的輸入參數資料, 這樣就可以充分的應用工作站的執行能力了!

10.1.8、備份伺服器:使用 rsync 同步鏡像

我們現在知道異地備份可以使用 scp 或者是腳本化的 sftp。但是,這些工具大部份都是『重新上傳一次所有資料』的角度來處理備份的工作, 如果我需要的是『有需要的資料才備份』時,該如何處理?這時就可以使用 rsync 啦!rsync 也可以在本機上面做差異備份! 備份的方式挺簡單!我們來測試看看:

# 1. 先登入 backup 備份伺服器,看看伺服器的內容
[vbird@master ~]# ssh backup
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.30.215' (ED25519) to the list of known hosts.
vbird@192.168.30.215's password:

[vbird@backup ~]# df -Th -x tmpfs -x devtmpfs
Filesystem                Type  Size  Used Avail Use% Mounted on
/dev/vda3                 xfs    29G  2.0G   27G   7% /
/dev/vda1                 vfat  200M  7.0M  193M   4% /boot/efi
/dev/mapper/backvg-backlv xfs    70G  532M   70G   1% /data  <==這個掛載點!

# 2. 將 /etc, /root 備份到 /data/local 目錄內
[vbird@backup ~]# sudo mkdir /data/local
[vbird@backup ~]# sudo yum -y install rsync
[vbird@backup ~]# sudo rsync -av /root /etc /data/local/
sending incremental file list
etc/
etc/.pwd.lock
etc/.updated
etc/DIR_COLORS
.....
root/anaconda-ks.cfg
root/.ssh/
root/.ssh/known_hosts

sent 20,096,002 bytes  received 10,519 bytes  13,404,347.33 bytes/sec
total size is 20,046,915  speedup is 1.00

[vbird@backup ~]# ll /data/local/
drwxr-xr-x. 99 root root 8192 Apr  9 17:13 etc
dr-xr-x---.  3 root root 4096 Mar 20 23:26 root

# 3. 再次備份看看
[vbird@backup ~]# sudo rsync -av /root /etc /data/local/
sending incremental file list

sent 28,118 bytes  received 266 bytes  56,768.00 bytes/sec
total size is 20,046,915  speedup is 706.28
# 最後重新做一次 rsync,你會發現,根本沒有東西被複製了喔!因為沒有更新過!

最簡單的 rsync 就這樣使用~至於 rsync 一般常用的參數如下:

[vbird@backup ~]# rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
選項與參數:
-v :觀察模式,可以列出更多的資訊,包括鏡像時的檔案檔名等;
-q :與 -v  相反,安靜模式,略過正常資訊,僅顯示錯誤訊息;
-r :遞迴複製!可以針對『目錄』來處理!很重要!
-u :僅更新 (update),若目標檔案較新,則保留新檔案不會覆蓋;
-l :複製連結檔的屬性,而非連結的目標原始檔案內容;
-p :複製時,連同屬性 (permission) 也保存不變!
-g :保存原始檔案的擁有群組;
-o :保存原始檔案的擁有人;
-D :保存原始檔案的裝置屬性 (device)
-t :保存原始檔案的時間參數;
-I :忽略更新時間 (mtime) 的屬性,檔案比對上會比較快速;
-z :在資料傳輸時,加上壓縮的參數!
-e :使用的通道協定,例如使用 ssh 通道,則 -e ssh
-a :相當於 -rlptgoD ,所以這個 -a 是最常用的參數了!
--del   :若僅存在接收端,則將接收端檔案刪除 (危險!注意!)
--mkpath:類似 mkdir -P 那個概念,會自己產生上層目錄
更多說明請參考 man rsync 的解說! 
  • 透過 ssh 連線通道進行傳輸

rsync 最大的好處就是可以透過 ssh 通道直接進行資料傳遞!舉例來說,我們要使用 root 的身份,將 master 系統的 /etc, /root, /home, /var/lib, /var/log 複製到 backup 備份系統上,那可以這樣做看看:

# 1. 先在 backup 系統上面建立好 master 可以傳來的訊息
[vbird@backup ~]# sudo mkdir /data/master
[vbird@backup ~]# sudo chown vbird:vbird /data/master
[vbird@backup ~]# ll -d /data/master
drwxr-xr-x. 2 vbird vbird 6 Apr  9 17:53 /data/master

# 2. 在 master 系統上面,使用 root 身份,將資料送出去!
[root@master ~]# yum install rsync
[root@master ~]# rsync -avz -e ssh --del /etc /root /home vbird@backup:/data/master
[root@master ~]# rsync -avz -e ssh --del /var/log /var/lib vbird@backup:/data/master/var/

要注意的是, -z 可以進行額外的壓縮後送出的功能,可以節省頻寬。至於 --del 可以將接收端存在的不需要檔案直接刪除, 使用上要特別注意!另外,目錄後面有沒有加上斜線 (/) 是不一樣的!因為我們都是要將整個目錄複製過去,因此接收端需要保留原有的目錄名稱, 所以不可以加上斜線喔!大致的意思,我們以 /root 來做說明。

  • 前提假設, backup 系統上面已經有 /data/test 這個目錄存在了。
  • 未加斜線 (ex> rsync -av -e ssh /root vbird@backup:/data/test):
    代表將 /root 放到 /data/test 裡面去,因此,最終會有 /data/test/root 這個目錄的意思。
  • 加上斜線 (ex> rsync -av -e ssh /root/ vbird@backup:/data/test):
    代表將 /root 裡面的內容放到 /data/test 裡面去,因此,最終 /root/ 內的資料會複製到 /data/test/ 裡面, 不會有 /data/test/root 這個目錄的意思。

另外,你可能會問,如果我需要 ssh 的不同額外參數,例如埠口號碼或加密機制之類的變更協助,那應該如何下達指令呢? 很簡單,就是在 -e 後面處理即可!例如底下的方式:

[root@master ~]# rsync -avz -e "ssh -c aes128-gcm@openssh.com" --del /etc /root /home vbird@backup:/data/master

10.2、 sshd 伺服器的進階應用

正常的 ssh 用法,大概上面的章節就已經介紹的差不多了!但是呢,sshd 這個服務畢竟『不算太安全』,畢竟你只要能夠登入系統, 就幾近無敵!如果 sshd 被使用 root 登入了,那就麻煩了!因此,最好不要將 sshd 暴露在網際網路上。另外,某些中心會將 port 22 自動導向或關閉,因此,你在某些單位裡面,也沒有辦法使用 port 22 的啦!那怎辦?只好透過轉埠口的方式來處理囉! 底下就讓我們來聊聊怎麼做。

10.2.1、sshd 服務的簡易安全防護:防火牆、root登入權限

一般來說,如果你沒有在安裝的時候額外動手腳 (特別有勾選讓 root 登入的功能),你的 root 是無法直接透過『輸入密碼』來 ssh 登入你的系統的。這個 跟 sshd 有關的設定值,就放在 /etc/ssh/sshd_config 裡面!當然啦,還有包含被引入 (include) 進來的 /etc/ssh/sshd_config.d/*.conf 檔案群。你可以使用 root 權限查看一下 /etc/ssh/sshd_config 檔案的內容,裡面大部分的註解都是預設值, 每個設定都講也頗無聊~鳥哥只列出你應該要知道的項目來說說看:

  • sshd 啟動的預設埠口 (可重複設定多個)
# 在 backup 備份伺服器上面,用 root 查看 sshd_config 內容
[root@backup ~]# vim /etc/ssh/sshd_config
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#Port 22

這個 Port 22 可以下達多次,如果你有其他額外要啟用的埠口,例如 3388 時,就可以將『 Port 3388 』同時寫上來! 這樣就可以同時啟用兩個 sshd 的埠口。但是不要這樣做!我們後面有更簡單的方法可以處理!

  • 是否允許 root 登入權限的設定
#PermitRootLogin prohibit-password

PermitRootLogin 意思是『是否允許 root 登入』的意思,主要設定值有 yes, no, prohibit-password 這幾種。 目前 RHEL 9 預設值是 prohibit-password (禁止輸入密碼)。你應該會覺得很奇怪~禁止密碼 (prohibit-password) 跟不准登入有什麼差別? 還是有差別的!雖然不能用輸入密碼登入,但是,你可以透過金鑰系統來登入喔!該情況就不是使用輸入密碼的方式 (後面會提到處理方式)! 因此,才預設會用這個 prohibit-password 當成預設值。不過,如果你擔心人家會猜測 root 密碼的話,那這邊可以將設定值改成 no ! 一般非工作站的正常伺服器 (web server, dns server...) 建議就改成 no 吧!畢竟該類伺服器並沒有需要隨時使用 ssh 登入的需要。

  • 伺服器端的使用者檢查用戶端公鑰 (public key) 紀錄的檔名設計
#PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

所謂的金鑰認證檔案,放置用戶端公鑰 (public key) 的預設檔名!這個檔案不要改比較好喔!就保持原有設定值! 從這邊我們也知道,公鑰檔案要上傳到哪裡去啦!這個檔案與 .ssh/ 目錄的權限也需要特別注意!權限設定錯誤時, 金鑰資料就不會檢查!

  • 圖形界面 (X11) 轉遞、主機名稱反查、持續連線設定
#X11Forwarding no

是否啟用圖形界面轉遞?一般預設都是 no,不過,我們可以在用戶端強迫放行~所以這裡就保留預設值即可!

#UseDNS no
#TCPKeepAlive yes

以前 sshd 會反查用戶端是否具有合法的 DNS 主機名稱,或者是寫入 /etd/hosts 的主機暱稱。不過,這樣會導致連線階段有些時間延遲。 目前的預設值都是 no,不進行反查,連線效率會比較好。至於 TCPKeepAlive 的意思是,當達成連線後,伺服器會一直傳送 TCP 封包給用戶端藉以判斷對方式否一直存在連線。不過,如果連線時中間的路由器暫時停止服務幾秒鐘,也會讓連線中斷喔! 在這個情況下,任何一端死掉後,SSH可以立刻知道!而不會有僵屍程序的發生!但如果你的網路或路由器常常不穩定,那麼可以設定為 no 的啦!

  • 最大同時發起 ssh 連線數 (unauthenticated connection)
#MaxStartups 10:30:100

這個設定值相當有趣喔~當你的工作站放行給太多人使用時,很多用戶可能會同時連上系統,那麼當系統同時有 10 個正在等待輸入密碼的連線時, 後續 (例如第 11, 12 個連線等) 的連線,將有 30% 的機率被丟棄~一直到最多 100 個登入連線後,後續的登入連線將會被直接丟棄。 也就是在後續第 101 個連線,就無法達成連線。不過這裡要注意的是,這指的是『正在登入的連線行為,例如等待輸入密碼, 或者是正在查詢金鑰系統的流程,就是尚未連線成功的階段』情況下 (unauthenticated connection)!並不是指最多只能有 100 條連線喔!

在鳥哥曾經開發過的系統中,有一個很有趣的經驗,我有 A 機器會瘋狂的對 B 機器進行 ssh 的連線,主要是進行一堆測試! 所以在一個程序裡面,會瘋狂的重新發起 ssh 登入~而且是不需要密碼的那種連線。但是...當有多個連線同時發起時, 竟然有好多個 ssh 連線會被報錯誤!後來才查到這個設定值~解決方法是,將設定值放大個 10 倍,就沒問題了!例如『 100:30:500 』這樣!

  • SFTP 伺服器
Subsystem       sftp    /usr/libexec/openssh/sftp-server

這就是 sftp 伺服器囉!保持存在比較好!基本上, RHEL 9 的這個設定值已經很 OK 了,我們暫時不需要更動它~ 不過...你就是有需要進行不同埠口的設定啊!那怎辦?沒關係,我們來使用防火牆玩一玩~

  • sshd 伺服器本身防火牆設定

無論在哪個系統,sshd 的服務就不要對所有的來源放行!除非你知道你在幹麻~否則千萬不要啊!所以,針對 works 工作站來說, 我們應該要限制可登入的來源,畢竟工作站很可能讓外部的人員連線使用的。假設目前我們僅針對數個區網以及一部份外網做放行, 使用 firewalld 的預設防火牆機制下,應該這樣做比較妥當:

# 1. 確認預設的防火牆是 firewalld,並查詢活動中的 zone
[root@works ~]# systemctl is-active firewalld.service
active
[root@works ~]# firewall-cmd --get-active-zones
public
  interfaces: enp1s0
[root@works ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources:
  services: cockpit dhcpv6-client ftp http https ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# 2. 取消上面看到的 ftp, http, https, ssh 等服務的連線,加入限制區網的來源
[root@works ~]# firewall-cmd --permanent --remove-service={ftp,http,https,ssh}
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" \
> service name="ssh" accept'
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.20.0/24" \
> service name="ssh" accept'
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.30.0/24" \
> service name="ssh" accept'
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.31.0.0/16" \
> service name="ssh" accept'
[root@works ~]# firewall-cmd --reload
[root@works ~]# firewall-cmd --list-services ; firewall-cmd --list-rich-rules
cockpit dhcpv6-client
rule family="ipv4" source address="192.168.20.0/24" service name="ssh" accept
rule family="ipv4" source address="192.168.30.0/24" service name="ssh" accept
rule family="ipv4" source address="172.31.0.0/16" service name="ssh" accept
rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept

這樣就做好了我們所需要的 ssh 登入環境啦!如果還有需要其他的來源,就使用上述的 rich rule 的方法增加即可。 那如果需要動態的方式來變更防火牆規則呢?那就需要 knock-server 的服務~等等我們再來聊一下這個東西~這邊先用靜態、固定 IP 位址的方法來處理喔!

  • sshd 伺服器多埠口轉遞設定

現在,假設外部系統不允許使用我們 works 的 port 22 進行連線,又或者我們需要將 works 的埠口放行在其他號碼上,這樣怎麼做? 很簡單啊~就防火牆章節談到的 REDIRECTION 功能即可!但是,不建議使用 --add-forward-port 功能,建議還是使用 rich rule 來規範 firewalld 比較好!我們使用底下的方式來處理喔:

[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" \
> forward-port port="3388" protocol="tcp" to-port="22"'
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.20.0/24" \
> forward-port port="3388" protocol="tcp" to-port="22"'
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.30.0/24" \
> forward-port port="3388" protocol="tcp" to-port="22"'
[root@works ~]# firewall-cmd --reload
[root@works ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.30.0/24" service name="ssh" accept
rule family="ipv4" source address="192.168.20.0/24" service name="ssh" accept
rule family="ipv4" source address="192.168.10.0/24" forward-port port="3388" protocol="tcp" to-port="22"
rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept
rule family="ipv4" source address="192.168.20.0/24" forward-port port="3388" protocol="tcp" to-port="22"
rule family="ipv4" source address="192.168.30.0/24" forward-port port="3388" protocol="tcp" to-port="22"
rule family="ipv4" source address="172.31.0.0/16" service name="ssh" accept

[root@works ~]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address State    PID/Program name
tcp        0      0 0.0.0.0:22      0.0.0.0:*       LISTEN   21897/sshd: /usr/sb
tcp6       0      0 :::22           :::*            LISTEN   21897/sshd: /usr/sb
udp        0      0 127.0.0.1:323   0.0.0.0:*                630/chronyd
udp6       0      0 ::1:323         :::*                     630/chronyd
# 系統還是僅開 port 22 的埠口,沒有多餘的 sshd 埠口,因此也不需要改到 SELinux 規則

如此一來,我們就可以透過 3388 這個埠口來連線到 works 的 ssh 服務了!現在,你可以在 master 這樣做測試:

[vbird@master ~]# ssh -p 3388 works

如果一切順利,你會發現可以登入 works 工作站,且透過的是 port 3388 喔!如果確認以後都要使用 port 3388 的話, 將這個設定寫入 ~/.ssh/config 當中吧!

  • master 骨幹伺服器轉埠口的設定

如果這部 works 工作站是需要提供給企業外部的用戶使用的話,你不會希望用戶登入你的 master 骨幹之後,再轉進來 works 工作站吧? 所以,你當然就會想要讓用戶直接從外部透過某個埠口直接轉到 works 工作站才對啊~再假設你會將所有連線到 master 為 3388 埠口的封包, 全部轉向到 works 去,讓 works 自己管理自己的 sshd 使用時,並且又假設你使用的是鳥哥在前面章節提供的 /root/nftables.sh 檔案內容, 此時,你只需要修改該檔案內 part 2.4 的部份,在 mynat 的鏈裡面增加這條規則:

# 注意!是在 master 骨幹系統上面設定的 nftables 喔!
[root@master ~]# vim /root/nftables.sh
# part 2.4: 建立 DNAT 功能
....
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 80 dnat ip to 192.168.30.1
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 3388 dnat ip to 192.168.30.214
....

[root@master ~]# sh /root/nftables.sh
[root@master ~]# nft list chain inet mynat mydnat
table inet mynat {
        chain mydnat {
                type nat hook prerouting priority dstnat; policy accept;
                ....
                iifname "enp1s0" tcp dport 80 dnat ip to 192.168.30.1
                iifname "enp1s0" tcp dport 3388 dnat ip to 192.168.30.214
        }
}

怎麼測試呢?只要在企業外部,使用 port 3388 連線到 master 的對外 IP 位址 (我們的範例為 192.168.201.245),應該就能直接跳轉到 works 工作站了!實際來測試一下:

# 在企業外部的連線測試方式:
[vbird@outside ~]# ssh -p 3388 vbird@192.168.201.245
ssh: connect to host 192.168.201.245 port 3388: No route to host

見鬼了!怎麼會無法連線呢?這是因為 works 工作站系統並沒有放行你外部主機的連線啊!那怎麼確定 master 骨幹設定是否正確? 沒關係,我們在 works 系統先暫時將 port 3388 的來源導向 port 22,等等記得要拿掉這條設定!

# 1.1 在 works 工作站將 port 3388 完整導向 port 22
[root@works ~]$ firewall-cmd --add-forward-port=port=3388:proto=tcp:toport=22
# 這個動作會導致可以連到 works:3388 的連線通通被放行!所以要注意別亂做!

# 2.1 在企業外部的連線測試方式:
[vbird@outside ~]# ssh -p 3388 vbird@192.168.201.245
The authenticity of host '[192.168.201.245]:3388 ([192.168.201.245]:3388)' can't be established.
ECDSA key fingerprint is SHA256:Rk7dT54Gh2NBx5wBoaYQ5Qr1BSR4ArtPCSxHqG2uyEk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.201.245]:3388' (ECDSA) to the list of known hosts.
vbird@192.168.201.245's password:
Last login: Wed Apr 10 10:52:33 2024 from 192.168.30.254
[vbird@works ~]$ 
# 注意看!結果登入的不是 master 而是 works 喔!這就是外部跳轉的功能!

# 1.2 在 works 工作站,復原 firewalld 設定
[root@works ~]$ firewall-cmd --reload

這樣就可以確認 master 的轉遞是沒問題的囉!只是能不能放行最後的連線,就得要由 works 工作站自己決定!

10.2.2、knock-server 的應用

如上個小節談到的,我們的 works 工作站預計可能會對外提供服務,那重點來了,我們目前在 master 的轉遞已經是固定的沒問題, 但是 works 的防火牆支援,則需要有固定的 IP 位址才能加以設定耶~那如果沒有固定來源的 IP 位址可用時,該如何連線呢? 例如一些商務人士,需要拿著筆電或平板電腦到處跑的,這些人沒辦法使用固定的 IP 位址啊~那該如何是好?沒關係, 我們可以使用 knock-server 來協助。

  • knock server

一般網路上面的掃描軟體 (port scanner) 通常是一串連續的埠口號碼做掃描,隨便找到有問題的伺服器,就嘗試測試埠口內容, 找到有問題的軟體,就予以攻擊測試!攻擊成功就抓到殭屍電腦了~那換個角度來說,如果我是有『特定的非連續埠口掃描』, 只要同一個 IP 位址來源在短時間 (數秒內) 進行的三個非連續埠口的掃描,那就假裝這個 IP 來源其實就是我的客戶, 那這個 IP 位址來源就動態的加入防火牆放行列表中~那不就可以用來放行我家客戶的使用權!這就是 knock server 的功能! 基本流程是這樣的:

  1. 伺服器端架設 knock 服務,knock 的設定值會偵測三個指定的埠口 (指定於 /etc/knockd.conf 中)
  2. 用戶端若依照指定埠口的順序依序的敲擊到這三個埠口時, knock 將進行動態防火牆規則的放行
  3. 防火牆規則被修改,且 knock 持續進行偵測;
  4. 當用戶端讓 knock 等候逾時,或者是用戶端離線後,剛剛步驟三的防火牆規則將會被移除。

就很好懂啊~只是,我們得要設定三個非連續的埠口來放行才好!現在,就讓我們在 works 上頭架設好需要的 knock 伺服器吧!

  • 在 works 工作站架設 knock server

這個 knock 伺服器在 EPEL 裡面有提供喔!所以,直接安裝即可!

# 1. 在 works 工作佔上面安裝好 knock server 軟體
[root@works ~]# yum install epel-release
[root@works ~]# yum install knock-server

# 2. 修改 /etc/knockd.conf 內容,放行三個埠口,且搭配 firewalld 的防火牆
[root@works ~]# vim /etc/knockd.conf
[options]
        LogFile       = /var/log/knockd.log
        Interface     = enp1s0

[opencloseSSH]
        sequence      = 7788:tcp,8877:tcp,8787:tcp
        seq_timeout   = 15
        tcpflags      = syn
        start_command = /usr/bin/firewall-cmd --add-rich-rule="rule family='ipv4' source address='%IP%' forward-port port='3388' protocol='tcp' to-port='22'"
        cmd_timeout   = 60
        stop_command  = /usr/bin/firewall-cmd --remove-rich-rule="rule family='ipv4' source address='%IP%' forward-port port='3388' protocol='tcp' to-port='22'"

[root@works ~]# systemctl enable --now knockd

上面的意思是,要在 15 秒鐘之內『依序且連續的敲擊三個固定埠口』,若順利敲擊這三個埠口,那麼防火牆規則就會自動建立好! 而建立防火牆之後,在 60 秒鐘之後,就會將防火牆的放行規則刪除!所以你得要在 60 秒之內使用 ssh 建立好連線!否則就得要重新敲擊! 如果你覺得時間太短,可以拉長到 120 !不過,等待時間不要太長!怕被其他人攻擊...

  • 在 master 上面轉傳三個埠口

我們上面規範了 port 7788, 8877, 8787 這三埠口,這三個埠口就得從 master 骨幹上面轉傳到 works 才行! 所以,請到 master 上面去編輯 nftables 腳本檔案,同樣在 part 2.4 的部份這樣做:

# 1. 在 /root/nftables.sh 增加這幾條規則的放行
# part 2.4: 建立 DNAT 功能
....
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 3388 dnat ip to 192.168.30.214
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 7788 dnat ip to 192.168.30.214
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 8877 dnat ip to 192.168.30.214
nft add rule inet mynat mydnat iifname ${wanif} tcp dport 8787 dnat ip to 192.168.30.214

[root@master ~]# sh nftables.sh

此時,僅有四個埠口會導向 works 工作站~接下來,請前往外部主機,我們準備來測試看看設定值對不對!

  • 在外部系統敲擊與連線

你可以在外部系統安裝使用 knock 用戶端軟體,不過,其實我們可以單純的使用 nmap 來進行敲擊喔!方式很簡單!

# 1. 先在外部系統連續敲擊三個埠口,一定要在 15 秒內完成!
[vbird@outside ~]# nmap -Pn -p 7788 192.168.201.245
[vbird@outside ~]# nmap -Pn -p 8877 192.168.201.245
[vbird@outside ~]# nmap -Pn -p 8787 192.168.201.245

# 2. 再接下來的 60 秒之內,一定要連上 works 工作站,否則放行規則會被取消!
[vbird@outside ~]# ssh -p 3388 192.168.201.245

一切順利的話,你就已經連上工作站了!如果這時你回去工作站上面看一下 /var/log/knockd.log 的話,就會看到類似如下的畫面:

[root@works ~]# tail /var/log/knockd.log
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 1
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 2
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 3
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: OPEN SESAME
[2024-04-10 14:44] opencloseSSH: running command: /usr/bin/firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.201.249' forward-port port='3388' protocol='tcp' to-port='22'"

[2024-04-10 14:45] 192.168.201.254: opencloseSSH: command timeout
[2024-04-10 14:45] opencloseSSH: running command: /usr/bin/firewall-cmd --remove-rich-rule="rule family='ipv4' source address='192.168.201.249' forward-port port='3388' protocol='tcp' to-port='22'"

你可能會問,鳥哥啊~你用的是 Linux client 端耶~我用的是 windows client 端耶~那怎辦?沒關係,你可以到 nmap 官網去下載預編軟體:

裡面有 Linux/Windows/MAC 版本的軟體可供下載~下載完畢啟動 cmd 或相關的終端機之後,使用與上面相同的方式,就可以敲擊到正確的工作站系統, 立刻快樂的使用你的資源!不過要注意的是,windows 版本的安裝,可能會被自動重新開機!所以,最好將重要的工作全部結束掉之後再安裝! 不然挺麻煩~要多多注意!

10.2.3、用戶管理:免密碼登入的用戶

想想看,我們在進行 rsync 備份時,還得要輸入密碼才能動作~那就不能做成『自動備份』的工具啦!我想要達成自動備份, 該如何處理?很簡單!就讓用戶把金鑰系統的公鑰 (public key) 傳輸到伺服器端即可!所以,首先就得要建立成對的金鑰才行! 而且,一經建立成對金鑰之後,就不要隨便更改金鑰~否則會影響到以後很多運作的環境。

先不要管 rsync 好了,我們先做個簡單的範例。假如未來我們在 master 連線到 works 工作站,使用 vbird 這個一般帳號時, 希望不要輸入密碼就可以直接登入~那該如何處理?

  • 在連線發起端 (client) 建立非對稱金鑰

在上面的案例中,我們想要從 master 系統的 vbird 用戶,連線到 works 系統的 vbird 用戶!剛剛好帳號是相同的! 這時,得要從連線發起端 (這個案例當中就是在 master 系統上) 建立金鑰!所以,先在 master 系統以 vbird 的帳號進行如下的動作:

# 1. 在 master 骨幹系統上面,以 vbird 帳號建立金鑰!
[vbird@master ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vbird/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/vbird/.ssh/id_rsa
Your public key has been saved in /home/vbird/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/jo+cKgRD/VWsrS3QKH7imgvDEvp/jB06c/JnPc9E54 vbird@master.vbird
The key's randomart image is:
+---[RSA 3072]----+
|        ..       |
|      ..+ .      |
|     ..+ =       |
|    +  .* .      |
| ..o +.oSo .     |
|ooo . +o. ..     |
|o* . o oo . o    |
|..*.*.ooo..E     |
|.oo+oBo.+=..o    |
+----[SHA256]-----+

[vbird@master ~]# ll ~/.ssh
-rw-r--r--. 1 vbird vbird  475 Apr  5 22:19 config
-rw-------. 1 vbird vbird 2602 Apr 10 22:14 id_rsa
-rw-r--r--. 1 vbird vbird  572 Apr 10 22:14 id_rsa.pub
-rw-------. 1 vbird vbird 3023 Apr  9 17:08 known_hosts

上面的 id_rsa 就是私鑰,這把鑰匙不可以外流~而 id_rsa.pub 就是公鑰~要傳給 sshd 伺服器端的金鑰檔案! 那要如何上傳呢?很簡單,使用 ssh-copy-id 即可!

  • 在 client 端傳送公鑰給伺服器 (server) 端的用戶

使用底下的方式,將公鑰上傳到 works 工作站上面去!

# 2. 在 master 上面,將公鑰傳送到 works 上!
[vbird@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub vbird@works
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vbird/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vbird@192.168.30.214's password: <==這裡還是需要密碼的!

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'vbird@works'"
and check to make sure that only the key(s) you wanted were added.

# 3. 登入 works 工作站,此時應該無須密碼!然後查看家目錄下的 .ssh 目錄!
[vbird@master ~]# ssh vbird@works
[vbird@works ~]# ll .ssh
-rw-------. 1 vbird vbird 572 Apr 10 22:19 authorized_keys
[vbird@works ~]# exit

在 sshd 伺服器端的用戶家目錄 .ssh 內,就會看到 authorized_keys 這個檔案!內容就是公鑰的資訊囉! 就這麼簡單!未來從 master 連接到 works,就無須密碼囉!

  • 讓 root 也可以自動登入

現在,讓我們來處理一個比較麻煩的東西~既然 master 需要以 root 身份做備份,而且希望備份到 backup 伺服器時, 也能用 root 的身份做紀錄,這樣檔案的權限才會保持的比較正常~但是,如上所示,使用 ssh-copy-id 時, 第一次還是需要輸入密碼的!那該怎辦?

要注意喔~現在我們需要的是,在 master 上,使用 root 登入 backup 系統時,可以登入 vbird 或 root, 兩者都無須密碼!那我們也知道其實上傳的金鑰系統在 ~/.ssh/authorized_keys 內啊~所以簡單的處理方案來說, 我們能這樣做:

# 1. 先在 master 系統上,以 root 的身份,建立金鑰
[root@master ~]# ssh-keygen
[root@master ~]# ll ~/.ssh
-rw-------. 1 root root 2602 Apr 10 22:26 id_rsa
-rw-r--r--. 1 root root  571 Apr 10 22:26 id_rsa.pub
-rw-------. 1 root root 1107 Apr 10 11:28 known_hosts
# 稍微確認一下檔案確實是存在的比較妥當

# 2. 將金鑰上傳到 backup 系統的 vbird 用戶上!
[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub vbird@backup
[root@master ~]# ssh vbird@backup
[vbird@backup ~]$ 
# 上傳金鑰之後,立刻測試一下連到 backup 系統是否能順利登入!

# 3. 在 backup 系統中,把 vbird 的金鑰檔案轉一份到 root 下,且改成正確的權限
[vbird@backup ~]$ sudo su -
[root@backup ~]# cd .ssh
[root@backup .ssh]# cat ~vbird/.ssh/authorized_keys > authorized_keys
[root@backup .ssh]# chmod 600 authorized_keys
[root@backup .ssh]# restorecon -Rv .
[root@backup .ssh]# ll
-rw-------. 1 root root 571 Apr 10 22:30 authorized_keys
[root@backup .ssh]# exit
[vbird@backup ~]$ exit
[root@master ~]# 

# 4. 回到 master 環境下,用 root 登入 backup 的 root 看看!
[root@master ~]# ssh root@backup
[root@backup ~]# exit

簡單到爆炸喔!這樣未來就可以進行 rsync 的自動備份了!

  • 將 master 的重要資料,每日備份到 backup 系統上

現在,我們可以將 master 的重要資訊,複製一份到 backup 上了!就直接使用 crontab 吧!

[root@master ~]# vim backup.sh
#!/bin/bash

rsync -avz -e ssh --del /etc /root /home root@backup:/data/master
rsync -avz -e ssh --del --mkpath /var/log /var/lib /var/spool root@backup:/data/master/var/

[root@master ~]# chmod 755 backup.sh
[root@master ~]# /root/backup.sh
[root@master ~]# crontab -e
0 3 * * * /root/backup.sh

這樣就可以自動備份,而且也沒有放行 backup 的 root 密碼登入權!喔耶!

10.2.4、用戶管理:不可登入的用戶

鳥哥在大學端也有教網頁製作耶~雖然是非常生硬的課程~不過,有興趣也可以瞧一瞧~

既然要網頁設計,自然就得要提供學生們一個可以上傳網頁的免費空間啊~而且,讓每個學生都有自己的帳號, 然後透過 ftps (注意,鳥哥不想提供 sftp,所以僅提供 ftps 喔!) 來傳輸他們的網頁~甚至可以透過類似 notepad++ 或 vs code 等軟體來連線登入系統~不過,總是有可能會防火牆設計出問題~也很擔心有同學太厲害,隨意登入網頁伺服器來惡搞~ 所以,鳥哥會讓學生們的帳號,只能使用 ftps 而無法使用 ssh 喔!這時,就得要 sshd_config 的支援了!

其實主要的想法是,建立一個名為 dropssh 的群組,然後將使用者加入這個群組,加到這群組的用戶不能使用 ssh, 但是沒有加入這個群組的,就可以使用!我們假設 works 工作站上面就有這些學生帳號~那該如何設計呢?

  • 在 sshd 伺服器端,增加 DenyGroups 的設定

在 works 系統上,修改設定檔,在最後的位置上面增加這個設定值:

# 1. 在 works 系統上面修改 sshd 的設定
[root@works ~]# vim /etc/ssh/sshd_config.d/vbird.conf
DenyGroups dropssh

[root@works ~]# systemctl restart sshd

# 2. 建立名為 dropssh 的群組
[root@works ~]# groupadd -r dropssh
[root@works ~]# getent group dropssh
dropssh:x:985:

# 3. 建立名為 student01 ~ student03 的帳號,且加入 dropssh
[root@works ~]# useradd -G dropssh student01
[root@works ~]# useradd -G dropssh student02
[root@works ~]# useradd -G dropssh student03
[root@works ~]# id student01 student02 student03
uid=1001(student01) gid=1001(student01) groups=1001(student01),985(dropssh)
uid=1002(student02) gid=1002(student02) groups=1002(student02),985(dropssh)
uid=1003(student03) gid=1003(student03) groups=1003(student03),985(dropssh)
[root@works ~]# echo 'myPossW0rd' | passwd --stdin student01
[root@works ~]# echo 'myPossW0rd' | passwd --stdin student02
[root@works ~]# echo 'myPossW0rd' | passwd --stdin student03

# 4. 在 master 系統上面嘗試登入看看!
[vbird@master ~]$ ssh student01@works
student01@192.168.30.214's password:
Permission denied, please try again.
# 輸入正確的密碼也不能登入!

# 5. 回到 works 系統上,使用 root 的身份觀察看看
[root@works ~]# journalctl -xeu sshd
.....
Apr 10 23:17:26 works sshd[31635]: User student01 from 192.168.30.254 not allowed because a group is listed in DenyGroups
Apr 10 23:17:45 works sshd[31635]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.30.254  user=student01
Apr 10 23:17:47 works sshd[31635]: Failed password for invalid user student01 from 192.168.30.254 port 54822 ssh2

透過這個簡單的方式,我們輕鬆的就完成學生帳號的建立!

10.2.5、透過 ssh 通道加密原本無加密的服務

我們的雲端系統主要是使用 VNC 的圖形化界面,為了讓我們可以登入到虛擬機器,很多時候我們都得要利用 remove-viewer 或相關軟體, 來連線到 cloud 系統,並取得虛擬機的終端畫面。而過去為了讓我們可以從外面的環境連線到 cloud 系統 (192.168.201.249), 因此我們需要將虛擬機器的終端機放置到 0.0.0.0 上面!而不是預設的 127.0.0.1!要知道,讓虛擬機器放置到 0.0.0.0 上面, 如果沒有管理好防火牆,等於是讓你的實體機器暴露到網際網路上耶!想想就覺得可怕!那怎辦?

目前的想法是,我們還是希望虛擬機器終端機可以開放到 cloud 系統的 127.0.0.1 上面,然後透過 ssh 的轉址服務,將連線透過 ssh 通道, 轉到 cloud 系統上!講到這邊,鳥哥相信你是看不懂的...沒關係,畫張圖來看看!

圖 10.2.5-1、ssh tunnel 示意圖
圖 10.2.5-1、ssh tunnel 示意圖

如上圖所示,在右邊的雲端系統 (本案例中,就是我們的 cloud 系統) 裡面開啟一個監聽於 lo 界面 (127.0.0.1) 的 port 5934 之虛擬機器, 就像我們的 works 工作站這樣,然後在雲端系統啟動 sshd 這個服務 (其實原本就有啟動了!)。接下來,在用戶端 (等等我們會以 windows 為例), 我們透過 ssh 指令,在 client 與 server 中間搭建一條隧道 (ssh tunnel),並且在用戶端本機啟用一個監聽的埠口,同時在伺服器端則間聽到 127.0.0.1 的 port 5934 埠口!兩個埠口號碼是可變的!如此一來,當我們在用戶端連線到本機的 port 5934 時,其實就是連接到雲端系統它本機的 127.0.0.1 了! 想當然爾,你無法直接連到 cloud 系統的 127.0.0.1 啊!但透過這條隧道,我們就可以順利連上了!

  • 1. 修改 cloud 系統的 works 工作站虛擬機器設定

現在,請先關閉 works 工作站系統,我們這裡直接在 cloud 母系統上面進行正常關機流程~之後就開始重新編輯工作站 XML 配置檔, 然後重新啟動 works 在不給任何人接觸的 lo (127.0.0.1) 環境中!整體流程大概是這樣:

# 1. 在 cloud 母系統上面,先關閉 works 工作站!
[root@cloud ~]# virsh list
 Id   Name                 State
------------------------------------
 18   server_workstation   running
....
[root@cloud ~]# virsh shutdown server_workstation

# 2. 修改配置後再次啟動 works 系統
[root@cloud ~]# cd /kvm/xml/
[root@cloud ~]# vim server_workstation.xml
    <graphics type="vnc" port="5934" listen="127.0.0.1" passwd="rocky9">

[root@cloud ~]# virsh create server_workstation.xml
[root@cloud ~]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address    Foreign Address   State    PID/Program name
tcp        0      0 127.0.0.1:5934   0.0.0.0:*         LISTEN   2542960/qemu-kvm

這樣就確定這個 port 5934 僅開放在雲端系統的本機了!誰也接觸不到喔!除非是 cloud 雲端系統自己!

  • 2. 從用戶端發起 ssh 隧道的功能

現在,在你的 windows 系統上面使用如下的指令來進行隧道的建立:

# 
C:\Users\vbird> ssh -L 本地埠口:127.0.0.1:遠端埠口 [-N] 遠端主機
選項與參數:
-N :僅啟動連線通道,不登入遠端 sshd 伺服器
本地埠口:就是開啟 127.0.0.1 上面一個監聽的埠口
遠端埠口:指定連線到後面遠端主機的 sshd 後,sshd 該連到哪個埠口進行傳輸

C:\Users\vbird> ssh -L 5934:127.0.0.1:5934 vbird@192.168.201.249
vbird@192.168.201.249's password: 
[vbird@cloud ~]# 

這樣就啟動好你的隧道了!要注意的是,Windows 的 cmd 視窗不能關掉!就是上頭已經出現 [vbird@cloud ~] 的畫面不能關掉喔! 因為那就是隧道本身!接下來,使用 vnc viewer 或 remote-viewer 等軟體,鳥哥在這邊使用 tigervnc viewer,下載網址如下所示:

請下載安裝 tigervnc64-1.13.1.exe 或 Win x64 MSI 檔案,安裝妥當之後,啟動 tigervnc viewer 或 remote-viewer 軟體,就會得到如下的畫面, 然後輸入正確的 IP 與埠口,其實就是本機的 5934 埠口啦!此時,ssh 隧道就會發揮效用,直接連線到 cloud 系統囉!

圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖
圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖
圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖
  • 終端機滑鼠救星: gpm (General Purpose Mouse server)

如果你覺得這樣的終端機老是沒有滑鼠很討厭~包括鳥哥用來教學時,總是沒有滑鼠可以使用~這樣學生會看不到焦點.... 能不能在 tty 純文字模式底下還能使用滑鼠呢?可以的~這就得要使用古早古早以前的滑鼠伺服器啦!其實也沒有什麼了不起~ 就直接安裝一個 gpm 軟體,然後啟動這個服務即可!鳥哥認為,這個服務不用常駐 (enable),需要的時候在啟用就好!

# 在 works 系統的終端機上面,啟用 gpm 服務,並測試滑鼠
[root@works ~]# yum install gpm
[root@works ~]# systemctl start gpm

接下來,你的純文字終端機 (剛剛用 tigervnc / remote-viewer 抓到的畫面) 就可以使用滑鼠囉!!

基本上, ssh tunnel 的用途非常廣~也可以拿來作為兩部主機之間的加密通道~非常有趣!大家可以自行測試看看其他功能喔!

10.2.6、使用 nc (netcat) 軟體

其實不知道應該把 nc 放在哪裡,所以只好在這個小節拿出來討論討論。是這樣的,鳥哥的一個朋友,有一次被叫去救援一部出問題的 Linux 系統, 該系統可以用很陽春的方法啟動網路,但是...很麻煩的是,該系統的某些函式庫失敗,因此怎麼也不能啟動 sshd 這隻服務!同時, 連 ssh 用戶端指令也失敗...當時急著要將這部 Linux 系統的重要資料複製出來,不過只有網路 IP 位址還活著,其他的網路指令通通失效了... 那怎麼辦呢?能不能用快速的 tar 來進行備份呢?要注意喔,此時我們無法使用 ftp, sftp, scp 等指令喔~

要使用 nc 這個指令,我們得要先安裝 nmap-ncat 這個軟體才行!而且 server/client 都要安裝!所以,請先在 master 與預計測試的 works 兩部系統上面安裝好上述軟體喔!

[root@master ~]# yum install nmap-ncat tar
[root@works ~]# yum install nmap-ncat

既然要使用,就得要有個範本~我們假設要將 master 系統的 /root 目錄複製到 works 系統的 /dev/shm 上面~ 那麼該如何處理呢?很簡單喔~我們先在接收端,也就是 works 系統上面,使用 nc 去監聽 8888 這個埠口,然後將該埠口傳來的訊息, 全部丟給 tar 進行解壓縮~方式如下:

# 1. 在 works 系統上面,先放行防火牆,然後進行 nc 的監聽行為
[root@works ~]# firewall-cmd --add-port=8888/tcp
[root@works ~]# cd /dev/shm
[root@works shm]# nc -l 8888 | tar -zxvf -

此時游標就會卡住~因為 tar 監聽的目標是 standard input 資料~但是我們尚未傳送資料過來!現在,跑到 master 系統上面, 我們將 /root 的資料完整的丟給 nc 傳送出去!

# 2. 在 master 系統上面,將 /root 資料傳送給 works 喔!
[root@master ~]# tar -zcvf - /root | nc works 8888

接下來,你會發現到兩端同時會有檔案資料丟出來!喔耶!這樣就達到快速複製的目的了!當初鳥哥的朋友用這方式解決出問題的系統時, 真心覺得好厲害~而且,這種傳送方式完全沒有壓縮或加密的問題,傳送速度超級快!雖然中間資料是明碼....所以不要在 interner 上面使用!

  • 用 nc 開後門連線

你可能有聽說過,你的系統被開個後門~網路怪客可以透過這個後門登入到你的系統惡搞!那你可能會覺得奇怪~怎麼開這個後門? 現在就讓我們來開個後門測試看看。你可以在 works 工作站上面啟動一個 port 8888 (剛剛的防火牆還沒有復原!所以還能用這個埠口), 然後在這個埠口上面丟一隻名為 /bin/bash 的程式。

# 1. 假設你在 works 系統上面,使用 root 權限,開了一個後門,提供 bash
[root@works ~]# nc --exec '/bin/bash' -l 8888

這個時候,你的 works 就開了一個 port 8888 的後門了!那,如果你在 master 連線到這個 works 的後門,會發生什麼事?

# 2. 在 master 骨幹系統,你用一般帳號隨意連線到 works 的 port 8888 看看:
[vbird@master ~]$ nc works 8888
ls -l /root
-rw-------. 1 root root 1204 Aug  4  2023 anaconda-ks.cfg
getent shadow sshd
sshd:!!:19573::::::
whoami
root
exit
Ncat: Broken pipe.
[vbird@master ~]$ 

雖然用戶端發起連線後,沒有提示字元 ($或#),但是輸入指令讓系統的 bash 去執行其他互動軟體,還是可行的! 所以,這就是後門程式的雛型...你或許會說,鳥哥啊!你是用 root 的身份去執行的啊!沒這麼容易讓怪客們取得我 root 的權限吧? 不過,這也是盲點~是『你』自己轉成 root 的,也可能是『你』自己去下載一些軟體並且是『你』自己執行的! 那如果這些軟體不是官網提供的,而是亂下載的,那麼『你自己這個 root』有沒有可能就啟動了某些後門程式呢? 大家自己想想看囉!

10.3、 X server / client 架構應用

在基礎篇我們講到過 X window system 這個 X 視窗系統,也被稱為 X11。X11 達成的軟體目前主要有兩個, 一個是 Xorg 一個則是近來比較熱門的 XWayland。無論是哪個啦,我們還是得要知道一下,X 到底是什麼?

10.3.1、X Window 的 Server/Client 架構與各元件

基本上,X 架構分為兩部份,一個是可以讓我們畫圖的 X server (相當於畫布),一個是可以繪畫的元件 X client (就是實際的圖示資料)。 也就是說,其實 X 系統也是可以跨平台喔~基本任務是這樣:

  • X Server: 這組程序主要負責的是螢幕畫面的繪製與顯示。 X Server 可以接收來自 X client 的數據,將這些數據繪製呈現為圖面在螢幕上。 此外,我們移動滑鼠、點擊資料、由鍵盤輸入資料等等,也會透過 X Server 來傳達到 X Client 端,而由 X Client 來加以運算出應繪製的資料;
  • X Client: 這組程序主要負責的是資料的運算。 X Client 在接受到 X Server 傳來的資料後 (例如移動滑鼠、點擊 icon 等動作),會經由本身的運算而得到滑鼠應該要如何移動、 點擊的結果應該要出現什麼樣的資料、鍵盤輸入的結果應該要如何呈現等等,然後將這些結果告知 X Server ,讓他自行去繪製到螢幕上。
鳥哥常常開玩笑的說, X server 就是畫布,而 X client 就是手拿畫筆的畫家。你得要先有畫布 (管理好所有可顯示的硬體後) 之後畫家的想法 (計算出來的繪圖數據) 才能夠繪製到畫布上!

由於每一支 X client 都是獨立存在的程序,因此在圖形顯示會發生一些疊圖的問題 (想像一下每一個 X client 都是一個很自我的畫家, 每個畫家都不承認對方的存在,都自顧自的在畫布上面作畫,最後的結果會是如何?)。因此,後來就有一組特殊的 X client 在進行管理所有的其他 X client 程式,這個總管的咚咚就是 Window Manager!

  • Window Manager (WM):是一組控制所有 X client 的管理程式,並同時提供例如工作列、背景桌面、虛擬桌面、視窗大小、 視窗移動與重疊顯示等任務。Window manager 主要由一些大型的計劃案所開發而來,常見的有 GNOME, KDE, XFCE 等

既然 X Window System 是 Linux 上面的一組程式,那麼它如何啟動的呢?早期的使用者在登入系統後,必須要自己先啟動 X server 程式,然後再啟動個別的 Window manager ,若有其他需求,再啟動其他額外的 X client 就是了。這麼麻煩! 所以為了簡化啟動個人圖形介面的步驟,後來還有所謂的 Display Manager (DM) 這玩意喔!

  • Display Manager (DM):提供使用者登入的畫面以讓使用者可以藉由圖形介面登入。在使用者登入後,可透過 display manager 的功能去呼叫其他的 Window manager ,讓使用者在圖形介面的登入過程變得更簡單。由於 DM 也是啟動一個等待輸入帳號密碼的圖形資料,因此 DM 會主動去喚醒一個 X Server 然後在上頭載入等待輸入的畫面就是了。

以目前的 RHEL 9 衍生作品當中,如果預設啟用圖形界面的話,那麼 tty1 通常就是 gdm 這個 display manager 啟動一個 X server 之後, 讓用戶進行帳號密碼登入的位置。若用戶輸入帳密為正確,那麼預設 tty2 就會是這個用戶所需要的 X server 並搭配適當的 windows manager, 讓使用者可以執行多個 X 軟體的終端界面囉。

  • 一個小小的 X 應用範例

我們來玩一下實際的 X 應用好了!請使用 10.2.5 章節提到的 remote-viewer 所提供的軟體,然後透過 ssh tunnel 的功能, 取得 works 的終端界面!在這個界面中,我們使用的是最小安裝,因此目前沒有 X server!而且是純文字界面喔! 現在,讓我們來測試一下,試圖讓大家了解一下 X server, X client, Window manager 分別是什麼吧!

tigervnc 取得終端畫面較簡單,但是 function keys 的組合按鍵處理比較麻煩~所以,底下的案例我們轉用 remote-viewer 來處理!組合按鍵的處理會比較單純!

首先,我們來安裝 X server,請透過如下的方式來安裝好並啟動它:

# 1. 在 works 系統中,安裝好需要的 X
[root@works ~]# yum install xorg-x11-server-Xorg mesa-dri-drivers xterm
[root@works ~]# which Xorg
/usr/bin/Xorg

# 2. 假設你目前的終端界面為 tty1,則底下輸入動作後,你的 tty2~tty3 可能成為圖形界面的畫面
[root@works ~]# Xorg :1 &
# 此時,你會被丟到某個終端畫面,而且畫面黑壓壓!不要害怕!請轉回 tty1!

# 3. 加上第一個 X application,使用 xterm 處理看看!
[root@works ~]# xterm -display :1 &

請自行使用組合按鍵回到 tty2 或 tty3,應該就可以看到如下的畫面囉!

圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖

接下來,我們先來安裝一個 Xorg 的工具軟體~不過,這個軟體目前僅有 RHEL 8 的版本,所以我們可能得要去下載 RHEL 8 的版本來安裝! 台灣可以在底下的網址來下載安裝:

下載的軟體名稱為 xorg-x11-apps !請下載到 works 系統,然後這樣安裝!

[root@works ~]# yum install ./xorg-x11-apps-7.7-21.el8.x86_64.rpm
[root@works ~]# xeyes -display :1 &
[root@works ~]# xclock -display :1 &

再次轉到 X 所在的終端機,你會發現類似下面的圖示!

圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖

這下傷腦筋了!因為上面講到,各個 X applications 都不知道對方的存在,所以上面就可以發現,最後執行的 xclock 將大家都蓋住了...那怎辦?接下來,我們安裝一套比較輕量的 window manager,這個挺有趣的 window manager 稱為 motif, 安裝之後的軟體會是 mwm 這個名稱喔!來跑跑看!

# 
[root@works ~]# yum install motif xorg-x11-xinit
[root@works ~]# mwm -display :1 &

再次回到 X 畫面,就可以看到底下的圖示了!相當有趣啊!

圖 10.2.5-2、tigervnc viewer / remote-viewer 的示意圖

等到你都測試完成之後,請回到 tty1 ,使用 kill 將所有剛剛啟動的圖形軟體,通通關掉吧!

[root@works ~]# kill %1

其實,關掉 Xorg 這個 X server 之後,其他的 X application 就會通通消失了!這就是最簡單陽春的 X 系統測試介紹!

10.3.2、ssh 的 X11 forwarding 功能

我們在之前談到 ssh 的加密隧道時,說在本機可以建立一個連線通道,連到 server 去取得某個服務對吧~那,這個架構, 能不能用在 X 系統上呢?喔!你猜到了~當然是可以的!你唯一需要處理的,就只是用戶端 (不管是 Linux/Windows/MAC) 的系統上面加裝 X server 即可!Linux 是當中最不用擔心的!因為 Linux 的 X 系統,本身就得要啟用 X server~那 Windows 跟 MAC 系統呢? 呵呵!很簡單啊~就用前面講到的 windterm 軟體即可!將 windterm 軟體的 X server 打開~我們在前面 10.1.5 最後有提到喔! 自己回去查一查~之後,你的用戶端只要 ssh 用戶軟體啟用 X11 forward 功能,然後在 sshd 伺服器端,安裝 xauth 軟體即可!

# 1. 在 works 工作站系統,安裝好需要的圖形界面驗證軟體
[root@works ~]# yum install xorg-x11-xauth

# 1.2 接下來,請再開一個 putty 的視窗,並且使用 X11 forward 連線到 works
[vbird@outsied ~]$ ssh -X -p 3388 192.168.201.245
[vbird@works ~]$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      -
tcp6       0      0 ::1:6010                :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

接下來就有趣囉~我們想要讓 works 工作站去繪製風花圖,透過風花圖製圖之後,將風花圖顯示到圖示中!一般來說,除非直接在工作站前用 X 視窗工作, 或者是透過類似 VNC 的圖形界面處理,否則很難達成這個目標。我們的目標卻又是:在 works 工作站上面不要啟用圖形界面, 只用純文字界面,但是卻可以在某些地方顯示正確的圖形環境!這就是我們的目標!

  • 在 works 工作站 (sshd 伺服器) 上面建置好需要的圖形資料

我們這次想要測試的,是將 aermod 氣象場資料轉化成為風花圖~鳥哥這邊使用的風花圖為透過 python 去繪圖~因此需要一些額外的軟體! 請先設定好安裝的環境!

# 2. 在 works 工作站系統,安裝 pip 軟體,然後用 vbird 身份安裝繪圖環境
[root@works ~]# yum install python3-pip eog

# 3. 用剛剛登入且具有 X 的用一般身份,建立好自己的環境
[vbird@works ~]$ pip install matplotlib windrose
... (會花費一些時間從網路上下載需要的軟體並編譯安裝)

# 4. 建立可供繪圖的腳本檔
[vbird@works ~]$ mkdir bin
[vbird@works ~]$ vim ~/bin/mywindrose.py
#!/bin/python
import os.path
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from windrose import WindroseAxes

sfc_file = input("input aermod met filename: ")

def load_aermet_sfc_file(ff):

    myfile = open(ff,"r",newline="\n")
    lines = myfile.readlines()
    # Header record
    (latitude,longitude,ua_identifier, sf_identifier, os_identifier, version_date) = [lines[0].split()[i] for i in (0,1,3,5,7,8)]

    wind = []
    for line in lines[1:]:
        (year,month,day,j_day,hour,h_sens,u_star,w_star,vptg,zic,zim,lmo,z_zero,bowen,albedo,ws,wd,zref,temp,ztemp,ipcode,pamt,rh,pres,ccvr,wsadj) = line.split()
        if (float(wd) >= 0 and float(ws) >=0):
            wind.append([float(wd),float(ws)])

    myfile.close()

    d = {}
    d['wind'] = wind
    d['latitude'] = latitude
    d['longitude'] = longitude

    return d

d = load_aermet_sfc_file(sfc_file)
wd = []
ws = []

for pair in d['wind']:
    wd.append(pair[0])
    ws.append(pair[1])

ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white',cmap=cm.hot)
ax.set_legend()
plt.suptitle(sfc_file+"\n LAT:"+d['latitude']+ " / LON: "+d['longitude'])
plt.savefig(sfc_file+".png")
print("Windrose plot saved as "+sfc_file+".png")

[vbird@works ~]$ chmod a+x ~/bin/mywindrose.py

# 4. 開始繪製圖示!
[vbird@works ~]$ cd ~/aermod_example
[vbird@works aermod_example]$ ll
-rw-r--r--. 1 vbird vbird    1780 Apr  9 15:54 aermod.inp
-rw-r--r--. 1 vbird vbird   86897 Apr  9 15:57 aermod.out
-rw-r--r--. 1 vbird vbird  588528 Jun  8  2022 aermod.pfl
-rw-r--r--. 1 vbird vbird 1563673 Jun  8  2022 aermod.sfc
-rw-r--r--. 1 vbird vbird   24255 Sep  1  2022 grid.dat
-rw-r--r--. 1 vbird vbird   48452 Apr  9 15:57 plot.plt

[vbird@works aermod_example]$ mywindrose.py
input aermod met filename: aermod.sfc
Windrose plot saved as aermod.sfc.png

[vbird@works aermod_example]$ ll *.png
-rw-r--r--. 1 vbird vbird   86664 Apr 15 15:03 aermod.sfc.png

[vbird@works aermod_example]$ eog aermod.sfc.png

如果一切順利的話,在你的 Windows 系統上面,就會出現如下的圖示:

圖 10.3.2、
圖 10.3.2、

很愉快的是!你只要在 windows / MAC 等系統上面啟動 windterm 並且在 windterm 裡面啟用 X server,之後再透過命令提示字元, 或者是 putty (建議用這個),有啟用 X11 forward 的功能喔!然後在 works 工作站 (或其他任何支援 sshd 的地方), 直接執行圖形界面,連 firefox 也可以喔!就能從 windows 裡面抓到你的圖示了!相當方便!

其實鳥哥現在都用上面的方式,直接透過 ssh 的 X11 forward 的功能,在需要圖形界面時,連線到工作站,並在本機啟用 X server, 如此一來,我所需要的所有圖形軟體,通通可以在本機電腦上面取用!雖然這種方法在輸入中文時可能會有點怪怪的,不過, 整體來說,使用上相當令人滿意!
在你的雲端系統上面,安裝好 tigervnc 以及 remote-view 等軟體,然後在你的工作機上面,使用『 ssh -X 192.168.201.249 』。 連線成功之後,查看你的本機埠口,最後,嘗試使用 tigervnc 取得你的 works 終端機!未來,你就可以在這一條 ssh 連線通道上面, 連接任何一個你想要取得的終端畫面囉!

10.3.3、 VNC 伺服器

基本上,使用 X11 forward 的功能,你想要什麼通通都可以了!不過,某些時刻,你可能還是想要直接連線到 Linux 的圖形界面! 雖然機會不大,但總是可能...這時怎辦?那就用 VNC 好了!簡單!愉快!又方便使用~但是,VNC 的畫面就真的是在工作站端 (伺服器端), 所以,所有的圖形界面全部要從遠端系統去運作喔~你就不能保持簡單乾爽的工作站環境了...所以,各有利弊!請自己選擇!

  • 簡單輕量的 Xfce 圖形環境

目前比較知名的大型圖形界面軟體,大概有 GNOME, KDE 與 XFCE 等,其中大概又以 XFCE 最輕量~安裝與使用上面, 會比較不會佔用太多系統硬體資源~而 RHEL 衍生產品中,XFCE 的圖形界面環境,是放置於 EPEL 的軟體倉儲下! 所以,我們得要從 epel 裡面下載這軟體才行!如果你是從前面就跟到現在,那麼你的 works 裡面應該有 epel 倉儲了! 只要安裝 XFCE 即可!

# 1. 在 works 工作站上面,確認有支援 epel 之後,看看有沒有 xfce 關鍵字的軟體群組
[root@works ~]# yum repolist
repo id                 repo name
appstream               Rocky Linux 9 - AppStream
baseos                  Rocky Linux 9 - BaseOS
epel                    Extra Packages for Enterprise Linux 9 - x86_64
epel-cisco-openh264     Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64
extras                  Rocky Linux 9 - Extras

[root@works ~]# yum grouplist | grep -i xfce
   Xfce
[root@works ~]# yum groupinstall Xfce
# 因為軟體挺多~會安裝比較久~

# 2. 安裝 VNC 伺服器軟體
[root@works ~]# yum install tigervnc-server

這樣就安裝好了 XFCE 了!現在,我們想要測試一下 VNC server 的建立,最簡單的方式,可以透過 vncserver 來達成!

# 在 works 工作站系統,請務必使用一般帳號身份來操作!不要用 root 喔!
[vbird@works ~]$ vncserver [:號碼] [-geometry 解析度] [options]
[vbird@works ~]$ vncserver [-kill :號碼]
選項與參數:
:號碼     :就是將 VNC server 開在哪個埠口,如果是 :1 則代表 VNC 5901 埠口
-geometry :就是解析度,例如 1024x768 或 800x600 之類的
options   :其他 X 相關的選項,例如 -query localhost 之類的
-kill     :將已經啟動的 VNC 埠口刪除!依據身份控制喔。

[vbird@works ~]$ vncserver :1
You will require a password to access your desktops.

Password: <==這裡輸入你要的 VNC 連線密碼
Verify:   <==再一次
Would you like to enter a view-only password (y/n)? y
Password: <==這裡輸入能看到同步畫面但不能操作的密碼
Verify:   <==再一次

New 'works.server.vbird:1 (vbird)' desktop is works.server.vbird:1

Creating default startup script /home/vbird/.vnc/xstartup
Creating default config /home/vbird/.vnc/config
Starting applications specified in /home/vbird/.vnc/xstartup
Log file is /home/vbird/.vnc/works.server.vbird:1.log

[vbird@works ~]$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      9056/Xvnc
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      -
tcp6       0      0 ::1:6010                :::*                    LISTEN      -
tcp6       0      0 :::5901                 :::*                    LISTEN      9056/Xvnc
tcp6       0      0 :::22                   :::*                    LISTEN      -

第一次使用 VNC 時,系統會要求你輸入 VNC 連線的密碼,這個密碼是連線密碼,跟妳自己的帳號無關~ 至於第二個密碼則很有趣!有時候,你或許會需要提供『畫面同步』的教學之類的功能,但是又不想讓你的同伴取得 VNC 的鍵盤、滑鼠操控權, 那你就可以告知你同伴第二組密碼,當他輸入第二組密碼後,就能看到畫面,但就是沒有操控權!有點類似廣播螢幕的感覺。 最後,那個 :1 代表的是 VNC 的第一個畫面,使用的埠口其實是 5901 喔!所以,如果是 :10 的話,那就代表 port 5910 囉! 既然放行埠口了,請處理一下防火牆囉!

# 在 works 工作站系統,用 root 調整一下防火牆~
[root@works ~]# firewall-cmd --permanent --add-port=5900-5910/tcp
[root@works ~]# firewall-cmd --reload

這個是開放對外的連線,但如果我們想要使用 ssh 隧道呢?在你外部的電腦這樣做也可以的!

C:\Users\vbird> ssh -p 3388 -L 5901:127.0.0.1:5901 vbird@192.168.201.245

然後啟動 windows 的 tigervnc viewer,並在畫面中輸入 127.0.0.1:5901 之後,並輸入你剛剛啟動 VNC server 的密碼, 就可以看到如下的畫面了!快快樂樂玩圖形!

圖 10.3.3-1、連線到 VNC 的示意圖
圖 10.3.3-1、連線到 VNC 的示意圖
  • 採用 XFCE 為主畫面

等等~不對吧!我們應該是要使用 XFCE 的吧!為啥畫面會是 GNOME 呢?這是因為預設的 VNC 就是找系統預設圖形畫面, 所以預設會找 GNOME 啦!那怎辦?沒關係,關閉 VNC 之後,修改一下 ~/.vnc/xstartup 內容即可!

# 關閉 port 5901,並且設計使用 startxfce4 作為圖形界面的啟動!
[vbird@works ~]$ vncserver -kill :1
[vbird@works ~]$ vim ~/.vnc/xstartup
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
startxfce4 &

[vbird@works ~]$ vncserver :1

再次以 vncviewer 連線,就會看到如下的畫面!真的很有趣喔!

圖 10.3.3-2、連線到 VNC 的示意圖
圖 10.3.3-2、連線到 VNC 的示意圖

如果還想要修改 VNC 密碼的話,就使用 vncpasswd 吧!其他跟個人有關的 VNC 資料,請自行參考 ~/.vnc/ 囉!

10.3.4、 tmux 多路終端機

操作 VNC 的情境下,你會發現,當斷開 vncviewer 之後,再次連線,只要不關閉 :1 的情境,那麼在畫面上的資料都會持續存在! 這個在你需要將某些長時間執行的軟體放置到工作站,讓工作站自己跑的時候,就很有幫助!因為,你無論何時回來,都能看到上次的工作情況! 你也不用擔心因為網路問題,讓你的某些長時間運作的連線因此而需要重跑...這其實對鳥哥來說很重要!我跑的數值模式, 通常按下 enter 之後,等到結果生出來,大概都得要 12 小時以上...如果一直透過 ssh 連線,那當連線中斷時,我的這隻程式可能就掛了! 得要重跑耶!時間成本很可怕!此時,VNC 連線的功能,對我來說就很重要了!

但是,使用圖形界面就是有個問題,即使穩定如 Linux,圖形界面耗用的資源還是太大!而且,架構太龐大!如果一個小細節沒有搞定, 還是可能會讓我的模式平白無故的受到影響~所以,有沒有可以丟在工作站自己跑的終端機?如果數值模式可以自己在系統跑, 而且是純文字界面,當我回來時,查看一下進度就好了!不用搞一個大大的 VNC 連線啊!有沒有這玩意兒?有啦!有兩個! 一個是老牌的 screen 軟體,另一個則是 tmux !screen 只存在 epel 倉儲,RHEL 預設有提供的則是 tmux !所以, 底下我們就單純介紹 tmux 囉!

什麼是 tmux 呢?你可以簡單的這樣想,tmux 就是丟在伺服器端的一個雲裡面的終端機,你隨時可以取得該終端界面, 也可以卸載該終端界面,讓該終端界面可以自己在系統內部跑~跟你登入的 ssh 或什麼其他的連線無關~而我們的終端機, 最重要的當然就是 shell 囉!所以你也可以簡單的想,就是將 bash 丟到背景去,讓 bash 自己運作~有需要的時候再拿到前景來看看! 沒事就丟到背景去~有點類似那樣的感覺囉~

所以 tmux 全名應該是 terminal multiplexer,當中 multiplexer 簡寫為 MUX ,中文簡稱為多路復用器或多工器等,所以 Tmux 名稱就這樣來的! 可以同時操作多個終端機的意思~應用上相當方便喔!

  • 最簡單 tmux 的操作:單一 session 的應用

多說無益,先裝好之後,操作看看你就知道是什麼東西了!

# 1. 在 works 工作站,安裝好 tmux
[root@works ~]# yum install tmux

# 2. 直接啟用一個 tmux 的會議 (session)
[vbird@works ~]$ tmux

輸入了 tmux 之後,你的原本畫面應該會變成這樣喔!

圖 10.3.4-1、tmux 啟動的畫面
圖 10.3.4-1、tmux 啟動的畫面

如果你想要關閉 tmux 了,那就直接輸入 exit !畫面就會回到原本的 putty 的 bash 界面了!那,如果你想要啟動一個有名字的會議, 可以這樣做:

# 3. 離開剛剛的 tmux 環境後,啟動一個名為 myenv 的會議名稱
[vbird@works ~]$ exit               <==這是在剛剛的 tmux 環境下登出!
[vbird@works ~]$ tmux new -s myenv  <==這則是在原生的 ssh 環境下使用

你就會發現到左下角的名字變成 myenv 了!這就是一個有名稱的 session 囉!你可以在這個 session 當中操作你需要的指令, 要執行多久也沒關係~就讓系統自己跑~那如何離開這個 tmux 的 session 呢?這就得要講到 session 的功能鍵了! 在 tmux 環境下,功能鍵為 [ctrl]+b,之後放開這兩個按鍵,再加其他的按鍵,就可以達成需要的功能!先來測試一下怎麼離開目前的 session! 請使用 [ctrl]+b,然後按下 d,你會發現變這樣:

[vbird@works ~]$ tmux new -s myenv
[detached (from session myenv)]

# 4. 查看有多少個 tmux 之後,將 myenv 會議取回!
[vbird@works ~]$ tmux ls
myenv: 1 windows (created Mon Apr 15 22:57:29 2024)

[vbird@works ~]$ tmux attach [-t myenv]

因為目前我們僅有一個會議 (session),所以沒有加上 -t myenv 也沒關係~好了!那麼在 tmux 的環境下,如果你想要滾回之前的畫面, 就是在 putty 裡面用滾輪往前滾,就會看到之前的畫面啦!但是...在 tmux 的環境下,你滑鼠往前滾...沒效果啊~出現的是原生的 ssh 取得的 bash 畫面,並不是 tmux 內的 bash 命令!哈哈!這時你就得要使用 tmux 內的緩衝記憶體了!可以按下『 [ctrl]+b, [ 』, 或者是按下『 [ctrl]+b, [pageup]/[pagedown] 』也可以進入緩衝記憶體的複製模式! 例如輸入 ll /etc 之後,使用上述按鍵,就可以出現這樣:

圖 10.3.4-2、tmux 在 session 內使用 buffer 功能
圖 10.3.4-2、tmux 在 session 內使用 buffer 功能

離開 buffer 的環境,只要按下 q 按鈕即可!這就是最簡單的 tmux 應用!如果你只需要使用單一一個會議, 那了解到這邊也就差不多了!已經可以幫助你做好多好多事情囉!

  • 滑鼠 (mouse) 的功能 (:set -g mouse [on|off])

正常情況下,在 putty 與 tmux 的使用情境中,滑鼠滾輪可以推回之前的畫面 (tmux 環境下,推回的畫面也會是之前 putty 的內容, 而不是 tmux 會議中的畫面),滑鼠左鍵可以圈選資料並且達成直接複製的功能,滑鼠右鍵則是直接貼上的功能!如果你想在在 tmux 的會議中, 啟動滑鼠滾輪往回推畫面的功能,同時滑鼠右鍵變成『開啟選單』的功能時,可以使用『 [ctrl]+b, : 』然後輸入『 set -g mouse on 』, 即可開始使用滑鼠!相當有趣喔!

圖 10.3.4-3、tmux 在 session 內使用 mouse 功能
圖 10.3.4-3、tmux 在 session 內使用 mouse 功能
圖 10.3.4-3、tmux 在 session 內使用 mouse 功能

鳥哥覺得這個滑鼠滾輪往回推是相當有幫助的功能哩!而選單則是見仁見智!看你有沒有需要就是了!至於離開選單的方式,同樣按下『 q 』即可。 如果需要關閉這個功能,讓滑鼠回歸原本的複製貼上,同樣的『 [ctrl]+b, :』然後輸入『 set -g mouse off 』即可關閉滑鼠功能!簡單好用!要紀錄一下!

  • 修改狀態列顯示效果與寫入 ~/.tmux.conf 設定檔

等等我們會介紹一下 tmux 在一個會議內建立多個視窗 (window) 與多個面板 (panel) 的功能~那麼如此一來,狀態列單純一個顏色, 就顯的有點不好判斷~假設,我們要讓狀態列在目前會議畫面中的項目顯示變化為紅底白字,我們可以輸入命令『 [ctrl]+b, :』, 命令內容『:set -g window-status-current-style bg=red,fg=white』,輸入項目正確之後,你的 tmux 畫面會變成這樣喔:

圖 10.3.4-4、tmux 在 session 內修改狀態列顯示效果
圖 10.3.4-4、tmux 在 session 內修改狀態列顯示效果

如果你想要這個效果持續的話,那就將這個資料寫入家目錄下的 .tmux.conf 檔案即可!

[vbird@works ~]$ vim ~/.tmux.conf
set -g window-status-current-style bg=red,fg=white

這樣,未來新的 session 都會有狀態列變色的效果了!好!現在來總和一下 tmux 的 session 功能!

tmux 的會議 (session) 功能
組合按鍵/指令達成功能與離開按鍵
tmux new -s s_name建立名為 _name 的新會議
tmux ls列出目前系統上面的所有 tmux 會議名稱
tmux attach [-t s_name]取回上一個,或名為 s_name 的會議
[ctrl]+b +d離開目前的 tmux 回到原本的 bash 畫面 (detache)
[ctrl]+b +[進入 copy 模式,可以按下方向鍵, [pageup] 等顯示出上方的畫面內容
[ctrl]+b +[pageup]/[pagedown]同樣也能進入 copy 模式喔!
[ctrl]+b +s顯示出所有的 session 名稱,可以用方向鍵進入某個 session
[ctrl]+b +$可以修改目前這個 session 的會議名稱
[ctrl]+b +:可進行環境設定或查閱,如『 :set -g mouse on 』等設定值
  • 開啟多個視窗 (window) 在一個會議內

有時候,你可能不想要開啟多個 session,而是在一個 session 裡面開啟多個 window 的狀態!這時候, 不需要使用 tmux 指令,而是在 tmux 的環境下,使用『 [ctrl]+b, c 』來啟用另一個新視窗,現在, 鳥哥按下兩次上面的組合按鍵,我的 myenv 會議內容會變這樣:

圖 10.3.4-5、tmux 啟用多個 window 的效果示意
圖 10.3.4-5、tmux 啟用多個 window 的效果示意

那怎麼切換視窗呢?最簡單的方法,就是 [ctrl]+b, +號碼,例如要回到 0 號,那就直接『 [ctrl]+b, +0 』就可以回到 0 號了! 那如果想要使用視覺化挑選,可以使用 [ctrl]+b, +w 的方式取得條列式預覽畫面喔~挺有趣的!按下『 [ctrl]+b, +w 』畫面會變這樣:

圖 10.3.4-6、tmux 選擇 window 預覽效果示意
圖 10.3.4-6、tmux 選擇 window 預覽效果示意

如果要離開視窗,建議使用『 exit 』關閉最好!如果因為某些原因讓你無法輸入 exit 時,可以使用『 [ctrl]+b, +& 』去刪除掉目前的視窗, 這樣也是 OK 的!那麼同樣的,就來總結一下 tmux 在 session 內的 window 指令彙整:

tmux 的視窗 (window) 功能
組合按鍵達成功能與離開按鍵
[ctrl]+b, +c開啟新的視窗 (window)
[ctrl]+b, +數字切換取得第『數字』號的視窗
[ctrl]+b, +w可供預覽的視窗條列式選擇畫面
[ctrl]+b, +&嘗試離開關閉視窗 (會有提示是否真要登出)
  • 在一個視窗內使用多個面板 (panel) 同步進行多個動作

無論是多個會議還是多個視窗,我們都得要在不同的視窗中切換。那麼有沒有辦法讓好多個動作中在某個視窗呢? 有的,那就是將視窗分割出多個面板的功能!這功能挺有趣的喔!如果你剛剛有加入滑鼠的功能,那麼按下右鍵的選單後, 就可以看到 (v) 及 (h) 的分割行為~如果沒有滑鼠支援,可以按下『 [ctrl]+b, +[%|"] 』% 可以做垂直左右兩個分割, " 則可以做水平上下兩個分割~如果你有啟用滑鼠功能,則在每個面板的邊框按下滑鼠左鍵後,就可以調整面板的大小! 底下的圖示則是鳥哥做了三個切割之後的結果~在不同的 panel 之間切換,可以使用『 [ctrl]+b, +方向鍵 』來處理! 相當簡易~

圖 10.3.4-7、tmux 切出多個面板示意圖
圖 10.3.4-7、tmux 切出多個面板示意圖

快速總結一下 tmux 的面板功能:

tmux 的面板 (pane, panel) 功能
組合按鍵達成功能與離開按鍵
[ctrl]+b, +%分開左右兩邊,產生兩個左右面板
[ctrl]+b, +"分開上下兩邊,產生兩上下右面板
[ctrl]+b, +空白可以切換布局,以上面案例共 3 個面板,會將這三個面板方位!很有趣!
[ctrl]+b, +方向鍵在不同的面板之間切換
[ctrl]+b, +x關閉此面板。建議使用 exit 停掉 bash 即可!

想要關閉面板,同樣建議使用 exit 會比用功能鍵好喔!以上就是簡易的 tmux 介紹!如果你經常連線到遠端系統去工作, 且工作通常是長期的運作,確實建議使用 tmux 來操作你的 bash 行為!未來個畫面接管會比較容易喔!底下列出參考資料, 大家有空也可以到其他網站瞧瞧不同的使用方法!

修改歷史:
  • 2024/04/16:原本的 CentOS6 的版本內容太舊了,很多資料以及應用方式都不同了!並加上 tmux 的使用!我覺得很好玩!
2024/04/16以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計