小型雲系統我們在第零章談過他的重要性!這一章我們真的就來建置它吧!
要模擬出整個機房的環境,最省錢的作法當然就是在雲裡面透過虛擬環境來架設一番。不過,若真的要去公有雲申請帳號, 我們的情況是沒有辦法處理好想要的橋接與子網的切割,這就傷腦筋了!因此,這一章,我們使用簡易的電腦主機配備搭配一些設定, 讓我們的母機器未來可以生出好多個虛擬機器來使用。
如同 Linux 基礎學習訓練教材最後一章的內容,不是只要將系統安裝好就算了,還得要手動調整一些額外的設定, 讓我們的系統成夠越安全越好!既然我們的實體機器只是作為虛擬機器以及網路橋接的設定,因此不需要啟用其他的服務才對! 所以,沒用到的服務,當然就關閉、關閉、再關閉!
其實...用一台具有較大容量記憶體的 PC 將它安裝好 Linux,就是一個簡易的雲系統囉!沒什麼特別的。只是你最好了解一下實體機器、 虛擬機器、虛擬機器內的作業系統的代稱等等的,這樣未來若出問題,在 google 查詢問題的所在時,比較不會莫名其妙!
雖然我們在第 0 章稍微談過雲程序與虛擬機器,不過,相對於沒碰過虛擬機器朋友來說,可能還是覺得很模糊!所以,這裡我們先將許多 Internet 上面經常聽到的專有名詞做個簡單的解釋,讓大家未來要查資料時,比較好追蹤。查看底下的名詞時, 可以對照著圖 0.1.5 來查看!
上面是常見的虛擬化名詞。另外,如果你需要讓系統具有比較好的效能,則你的 CPU 最好能夠支援虛擬化指令集, 而且你的主機板 BIOS/UEFI 裡面得要將這些功能啟用才行。基本上,目前的桌上型電腦系統,應該預設都會啟動 CPU 虛擬化技術支援才對。 我們可以開機進入 UEFI 系統 (俗稱的 BIOS 環境) 查閱一下。在鳥哥這部 Asus 的系統下,(1)開機按下 [del] 進入設定畫面, 然後 (2)按下 [F7] 進入進階模式後,可以查詢得到底下的畫面:
你一定要啟用的項目是『Intel 虛擬化技術』這一個 (Enabled),至於底下還有個『 VT-d 』的項目,那個是非必備的! 除非你需要進行 PCI passthrough 的技術支援,否則該項目有沒有勾選都不會影響的。 另外,最好啟用 Intel AES-NI 這個項目,因為 AES 是使用度非常廣的加密機制,有 CPU 的硬體加速運算,效能會好很多。 下一小節會介紹 SATA 的設定,這裡先知道一下在這個項目裡面可以找到即可。
老實說,前一章就提到,想要搞雲端運算,沒有大量的金援是很難有好結果的。不過,我們畢竟只是一個小型內部測試環境, 所以,搞搞小系統就好,沒關係的!但是,配備也不能太爛,否則,當 VM 多起來,整體系統會很糟糕! I/O 負載較大,基本建議使用 SSD,但是鳥哥身邊臨時找不到 SSD 啊!就拿 4 顆傳統硬碟 (HDD) 組成容錯用的 RAID! 這樣對於資料來說,基本保障才會有!本次鳥哥用來介紹的實際硬體如下:
上面這部主機硬體,說實在話,不是很強大!而且那個磁碟陣列是內建的,對於真實運作的環境下, 效能真的不是太好。內建的 RAID 卡,最好做成 RAID0, RAID1 或 RAID10 就好,比較高階的 RAID5 千萬不要在這種卡片上面實做! 主機板內建 raid card 的 RAID5 效能真的很糟糕!
鳥哥手邊有比較多的傳統磁碟,所以打算使用 4 顆傳統磁碟組成一個 RAID10 的磁碟陣列,一方面磁碟容量會較大些, 一方面也能夠有容錯的效果。不同的系統有不同的磁碟陣列設定,鳥哥這邊主要是以 ASUS 的桌上型電腦系統為例, 這部系統要建立磁碟陣列:
接下來準備要安裝 host 母系統了。這次我們使用的是 RockyLinux 9.0 版為例,這個版本提供了好幾個不同的 ISO 檔案, 目前這種 ISO 檔案的容量越來越可怕!預設的 dvd1 檔案竟然高達 10G 左右!光是下載就嚇死人... 鳥哥建議下載 minimal 版本即可!安裝好之後,再透過網路安裝其他所需軟體即可!下載點可以到底下查閱看看:
鳥哥下載的是『Rocky-9.0-x86_64-minimal.iso』這個檔案。下載完畢後,如果你的工作環境是 Linux 系統, 請透過 dd 這個指令搭配 USB 隨身碟來進行開機片的製作。最簡單的指令方式有點像這樣 (我這裡假設你的 USB 隨身碟為 /dev/sdc !請使用 lsblk 去找出你的隨身碟檔名來取代掉即可。)
[root@cloudandvm ~]# dd if=Rocky-9.0-x86_64-minimal.iso of=/dev/sdc
如果你的工作環境是 windows 的話,那麼建議使用 rufus 這套開源軟體 (http://rufus.akeo.ie/)。這套軟體無須安裝,下載後就可以使用。啟動軟體畫面會像這樣:
在『裝置』的部份,請確定你的 USB 所在磁碟代號,以上圖為例,鳥哥用的 USB 是 32GB 容量!要確認喔!之後在 2 號箭頭處, 選擇好正確的 RockyLinux 映像檔,檔名會顯示到箭頭 3 的地方,之後在 4 號箭頭選擇 MBR 較佳!你也可以使用純粹的 UEFI 模式。 確認上述選擇都沒問題,就可以按下『執行』按鈕,就可以開始準備寫入 USB 開機片了。由於寫入的方式有兩種, 一種是可以繼續使用 USB 其他容量,一種則是假定為光碟片。鳥哥建議使用『 DD 模式』,似乎比較不容易出問題。 接下來稍微等待一小段時間,你的 RockyLinux 9.0 就可以燒錄妥當了。
現在,請將這個可開機 USB 放在等待被安裝的 PC 上,然後開機,然後調整 BIOS 讓它可以使用 USB 開機!之後就準備進入安裝程序了。
鳥哥假設大家都已經知道如何安裝 Linux 作業系統,所以僅提供一個簡易的示意圖!同時,我們使用的是 RockyLinux 9.0 的精簡映像檔, 安裝時並沒有虛擬機器的選項可以選擇~因此,直接選擇 Server 項目即可!安裝妥當後,不會出現圖形界面喔! 另外,鳥哥預計將虛擬環境需要的所有資料通通丟到 /kvm 底下,此,分割也需要留意一下的好。
在選擇磁碟與分割階段的畫面,會有點像底下這樣:
另外,RockyLinux 9 在系統管理員 (root) 管理上面有點不太一樣,預設的情況下,root 就無法使用 ssh 登入系統了!這是預設值。 如果你想要讓 root 在一開始的短時間內,還是可以使用 ssh 的話 (例如,你忘記建立一般帳號了!),那在『Root 密碼』的項目, 得要勾選底下的設定值才行!不然,你就得要手動修改 sshd 的設定檔了 (/etc/ssh/sshd_config)!
至於在全部的設定都處理妥當後,整體圖示會像底下這樣。如果一切準備妥當,直接按下『開始安裝』就好了!
因為虛擬主機伺服器安裝的軟體不會太多,因此差不多 10 分鐘內系統就可以安裝完畢~此時,請按下重新開機,然後拔除 USB 隨身碟吧! 在 RockyLinux 9 的環境下,安裝完畢第一次重新開機時,很有趣的是, RockyLinux 要你重新設定 UEFI 的開機選單項目耶! 鳥哥第一次遇到這個情況!相當有趣!儲存 UEFI 設定後,重新開機,就可以出現如下的畫面了:
上圖中,第一個選單是正常的開機,第二個選單是進入救援模式 (rescue),第三個選單就是進入 UEFI 去修改設定喔! 而安裝完畢第一次重新開機,就只有 UEFI Firmware Settins 項目而已!相當有趣!
為了一些高階的用戶著想,安裝過程中, RockyLinux 有提供一個 shell 環境讓大家操作! 基本上,你可以有兩個比較重要的終端機,分別是 tty2 與 tty6,tty6 就是圖形安裝環境, 至於 tty2 則是 USB 開機片提供的小型作業系統,你可以在安裝途中切換到 tty2 看看!
鳥哥第一次使用內建主機板搭建成 RAID5 進行系統安裝時,安裝的速度慢到很想哭泣啊~ 因為之前鳥哥就有使用 software RAID 的經驗,知道 software RAID5 剛建立完成時,Linux 系統會主動進行 resync 的程序, 這個程序的預設值會吃掉 200Mbytes/s 的磁碟讀寫頻寬~所以,安裝過程寫入到磁碟的資料, 當然就會...比較慢。整個找到問題的情境,有點像底下的圖示:
下次您在 BIOS 底下新建好內建主機板的 RAID 磁碟後,就立刻安裝 Linux 系統時,總是可能發現安裝過程特別慢! 那就可以透過這個 shell 環境來規範最高 resync 的速度,讓安裝流程可以變得順暢些。上面圖示鳥哥彙整一下, 進入 TTY2 之後,你可以這樣做:
# 先找到讀寫的最大頻寬限制檔案 [anaconda root@localhost /]# cd /proc/sys/dev/raid/ [anaconda root@localhost raid]# ls -l -rw-r--r--. 1 root root 0 5月 1 00:08 speed_limit_max <==最大讀寫限制 -rw-r--r--. 1 root root 0 5月 1 00:08 speed_limit_min # 透過 echo 的方式,將寫入限制到 20Mbytes/s 以內 [anaconda root@localhost ~]# echo 20000 > speed_limit_max [anaconda root@localhost ~]# cat /proc/mdstat # 這個時候,就可以看到讀寫速度的資料了!
除了軟體磁碟陣列的資料之外,您在安裝過程中缺少某些第三方驅動程式時,也可以在這裡載入! 只是需要注意的是,這個『作業系統』是安裝流程的 Linux,跟你未來安裝好的系統並不相同! 所以,如果是『驅動程式』方面的問題,就得要更加小心!這方面問題可以參考鳥哥之前寫的一篇短文:
反正,安裝過程中,如果你覺得很無聊,也可以切換到 tty2 去瞧一瞧,看看安裝過程中,到底是哪裡出現很忙碌的情況! 趁機多學幾招這樣!
在安裝完畢第一次開機進入 RockyLinux 之後,就是一片黑壓壓的畫面,你可以使用一般帳號登入, 也可以使用 root 直接登入,這都沒有太大的問題!畢竟是在本機!如果是從 internet 或者是內網的其他主機登入的話, 建議還是不要使用 root 喔!接下來,讓我們先來觀察一下目前這個系統的相關功能吧!
現階段雲伺服器的 CPU,最重要的兩個功能,可能就是虛擬化與 AES 加密機制指令集。我們可以從 /proc/cpuinfo 直接查詢, 這個是 Linux 原生紀錄的 CPU 指令集狀況,另外,如果不想要看太多的有的沒有的東西,也可以簡單的透過 lscpu 查看資訊即可!
[root@localhost ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 39 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 12 On-line CPU(s) list: 0-11 Vendor ID: GenuineIntel BIOS Vendor ID: Intel(R) Corporation Model name: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz BIOS Model name: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz CPU family: 6 Model: 165 Thread(s) per core: 2 Core(s) per socket: 6 Socket(s): 1 Stepping: 3 CPU max MHz: 4500.0000 CPU min MHz: 800.0000 BogoMIPS: 6199.99 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1 gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes .... Virtualization features: Virtualization: VT-x Caches (sum of all): L1d: 192 KiB (6 instances) L1i: 192 KiB (6 instances) L2: 1.5 MiB (6 instances) L3: 12 MiB (1 instance) NUMA: NUMA node(s): 1 NUMA node0 CPU(s): 0-11 Vulnerabilities: Itlb multihit: KVM: Mitigation: VMX disabled ....
重點在看出有沒有 vmx 以及 aes 的特殊旗標,同時也能夠觀察到 CPU 的超執行緒有沒有啟用! 如上表所示, CPU(s) 雖然有 12 顆,不過實際上的核心執行緒為 2 ,實際核心數僅有 6 顆就是了。 如果是 AMD 系列的 CPU 的話,在上面的 Virtualization 部份,應該就會出現 AMD-V 才對! 而 Flags 就不會有 vmx 而是出現 svm 喔!
我們在基礎篇裡面談到的軟體磁碟陣列中,一般大多使用 /dev/md0 開始編號。不過,主機板內建的磁碟陣列, 則是大多從 /dev/md126 開始編號~很特別!因此,一開始來觀察一下安裝好的軟體磁碟陣列狀態吧!
[root@localhost ~]# cat /proc/mdstat Personalities : [raid10] md126 : active raid10 sda[3] sdb[2] sdc[1] sdd[0] 1953519616 blocks super external:/md127/0 64K chunks 2 near-copies [4/4] [UUUU] .....
重點在磁碟陣列的組成等級為 RAID10,以及目前 4 顆磁碟的狀態情況!你會發現有四個 U 的存在! 這太棒了!代表系統沒問題!另外,我們也會知道其實磁碟陣列的檔名為 /dev/md126 喔!如果想要查看更詳細的資料, 也可以使用 mdadm 指令查詢:
[root@localhost ~]# mdadm --detail /dev/md126 /dev/md126: Container : /dev/md/imsm, member 0 Raid Level : raid10 Array Size : 1953519616 (1863.02 GiB 2000.40 GB) Used Dev Size : 976759808 (931.51 GiB 1000.20 GB) Raid Devices : 4 Total Devices : 4 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Layout : near=2 Chunk Size : 64K Consistency Policy : resync UUID : 585291ed:cc38a802:ff454b5e:0d950ee7 Number Major Minor RaidDevice State 3 8 0 0 active sync set-A /dev/sda 2 8 16 1 active sync set-B /dev/sdb 1 8 32 2 active sync set-A /dev/sdc 0 8 48 3 active sync set-B /dev/sdd
這包括整體磁碟陣列容量 (Array Size),組成磁碟陣列的每顆磁碟容量 (Used Dev Size), 最底下則是四顆磁碟陣列的組成!清楚明瞭!
每個人的網路參數都不一樣,請自行找到您的環境來設計!我這裡使用的網路參數如下所示,不要問我為啥, 因為鳥哥的既有環境就是這樣設定的!你可以依據你的現場環境來修改底下的參數即可!
# 先探索網卡的卡號: [root@localhost ~]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff inet 192.168.201.249/24 brd 192.168.201.255 scope global noprefixroute eno1 valid_lft forever preferred_lft forever inet6 fe80::fe34:97ff:fe3b:eb86/64 scope link noprefixroute valid_lft forever preferred_lft forever # 所以,可以知道網卡的卡號是 eno1 喔! # 查看一下網路管理員的設定項目 [root@localhost ~]# nmcli connection show NAME UUID TYPE DEVICE eno1 24199355-b3a4-3f4d-bd6e-65be1085a499 ethernet eno1 # 所以,可以知道有個網路管理員設定的連線名稱 (NAME) 為 eno1 # 最終,就設定好網路參數即可 [root@localhost ~]# nmcli connection modify eno1 connection.autoconnect yes \ > ipv4.method manual ipv4.addresses 192.168.201.249/24 \ > ipv4.gateway 192.168.201.254 ipv4.dns 120.114.100.1,168.95.1.1 [root@localhost ~]# nmcli connection up eno1 # 設定主機名稱 [root@localhost ~]# hostnamectl set-hostname cloud.vbird
網路設定完畢之後,記得要確認一下網路是否真的可以連到 internet 上!一般來說是沒啥大問題, 只需要使用 ping 以及 dig 確認 TCP/IP 以及 DNS 設定正常即可。
# 外部 internet 有個 IP 168.95.5.1,確認一下能否連線成功 [root@localhost ~]# ping -c 3 168.95.1.1 PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data. 64 bytes from 168.95.1.1: icmp_seq=1 ttl=245 time=2.06 ms 64 bytes from 168.95.1.1: icmp_seq=2 ttl=245 time=2.03 ms 64 bytes from 168.95.1.1: icmp_seq=3 ttl=245 time=1.98 ms --- 168.95.1.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.979/2.022/2.057/0.061 ms # 安裝 bind-utils 之後,確認 www.google.com 是否存在 IP [root@localhost ~]# yum -y install bind-utils [root@localhost ~]# dig www.google.com ; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42507 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 19 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 213 IN A 142.251.42.228
到最後有出現 IP 位址,那就是正確的了!更多詳細的網路觀念與設定,我們在後面章節再來介紹!
在台灣,剛剛安裝好你的 Linux 系統時,通常可能會發生日期與時間誤差超過 8 小時的情況發生!這是由於是否使用標準時間所導致的問題。 台灣本地時間會比國際標準時間快 8 小時啊!因此,更新時間是很重要的!甚至,很多服務,如果時間不一致, 還可能會發生一些莫名其妙的問題!所以需要更新時間較佳。
新版的 RockyLinux 提供的 NTP (Network Time Protocol, 網路時間協定) 為 chrony 服務,不再提供以前批次處理的 ntpdate 指令了! 所以我們得要安裝 chrony 才行!還好,這服務預設都是安裝妥當了!你只要設定好即可。 在鳥哥的這部雲系統,放置在校園內,因此必須要使用 ntp.ksu.edu.tw 這部 NTP server, 如果在台灣,你也可以選擇如下的 NTP server:
# 修改 chrony 主設定檔,註解一行,新增 3 行即可! [root@localhost ~]# vi /etc/chrony.conf # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). #pool 2.pool.ntp.org iburst server ntp.ksu.edu.tw iburst server tock.stdtime.gov.tw iburst server time.stdtime.gov.tw iburst ....(底下省略).... [root@localhost ~]# systemctl start chronyd [root@localhost ~]# systemctl enable chronyd [root@localhost ~]# chronyc sources MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^- dns3.ksu.edu.tw 3 6 17 10 -118us[ -118us] +/- 72ms ^+ 211-22-103-157.hinet-ip.> 2 6 17 11 -112us[ +69us] +/- 31ms ^* 118-163-81-61.hinet-ip.h> 2 6 17 10 +258us[ +439us] +/- 25ms
若是出現最終有秒數 (72ms) 之類的訊息,那應該就是設定妥當了!你這時應該與 internet 的時間同步囉! 最後,確認一下整體系統時間參數:
[root@localhost ~]# timedatectl Local time: Thu 2023-08-03 11:49:19 CST Universal time: Thu 2023-08-03 03:49:19 UTC RTC time: Thu 2023-08-03 03:49:19 Time zone: Asia/Taipei (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no
看起來時區 (CST) 以及網路時間同步 (synchronized: yes) 都是正確的!那應該沒啥大問題了!若有任何問題, 請自行使用 timedatectl --help 查詢處理方式囉!
調整系統效能有簡單的方式了!透過 tuned 服務來處理即可!一般預設的系統,大多使用 throughput-performance 設定值,不過,未來我們這部主機要使用的雲虛擬母機器 (virtual host),所以你可以選擇 virtual-host 設定。 而因為我們使用的是 intel 的 CPU 系統,老實說,似乎也能使用 intel-sst 設定。無論如何,都請自行參考你的使用來設計! 鳥哥將以預設的 virtual-host 作為優化設定項目:
[root@localhost ~]# yum -y install tuned [root@localhost ~]# tuned-adm profile virtual-host [root@localhost ~]# tuned-adm list Available profiles: - accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states - balanced - General non-specialized tuned profile - desktop - Optimize for the desktop use-case - hpc-compute - Optimize for HPC compute workloads - intel-sst - Configure for Intel Speed Select Base Frequency - latency-performance - Optimize for deterministic performance at the cost of increased power consumption - network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance - network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks - optimize-serial-console - Optimize for serial console use. - powersave - Optimize for low power consumption - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads - virtual-guest - Optimize for running inside a virtual guest - virtual-host - Optimize for running KVM guests Current active profile: virtual-host
一般 Linux 核心設定,許多參數都是針對單一主機與單一磁碟,在網路卡的許多設定值方面,這方面設定大多針對 internet 的環境來設計, 對於內網在 Gbps 或 10Gbps 的環境下,網卡參數或許調整一下會比較好。最常調整的就是 lro 與 gro 這兩個網卡參數! 不過,詳細的設定值,還是得要 case by case 的自己測試一下才好!
# 1. 確認一下網卡 (鳥哥的網卡是 eno1 喔) 相關 ring 參數 [root@localhost ~]# ethtool -g eno1 Ring parameters for eno1: Pre-set maximums: RX: 4096 RX Mini: n/a RX Jumbo: n/a TX: 4096 Current hardware settings: RX: 256 RX Mini: n/a RX Jumbo: n/a TX: 256
看起來硬體設定來到 4096 而現有的設定僅為 256,所以可以將它調大一點。至於 lro 與 gro 的判斷則是:
# 2. 查看網卡參數 [root@localhost ~]# ethtool -k eno1 | grep receive-offload generic-receive-offload: on large-receive-offload: off [fixed]
預設的 gro 都是 on 的,至於 lro 有可能已經設定鎖定為 off 了!那就不用重新設定!因此, 針對鳥哥的這張網卡,只需要設定 gro 為 off 就好!
至於 software RAID 的優化方面,雖然網路上很多朋友建議關閉 NCQ 這東西,不過,鳥哥自己的測試中, 關閉不見得比較好,全開也不見得比較好,反而設定為 31 似乎好一些!不過,說真的,都是 case by case 啦。 另外,放大預讀效果似乎也比較好。
同時,如果擔心每個週末自動 resync 會導致系統效能的問題的話,也可以調降 software RAID 的 resync 讀寫頻寬。不過,不管是提高或降低, 都可能會影響到你的系統性能!一般來說,software RAID 的磁碟容量不要太大啦!超過 10TB 以上的話, resync 就會耗去太多時間!這點需要考慮!
# 1. 先讓 rc.local 具有可用的功能 [root@localhost ~]# chmod +x /etc/rc.d/rc.local # 2. 寫入一個名為 /root/bin/performance.sh 的腳本 [root@localhost ~]# vi /etc/rc.d/rc.local ....(前面省略).... # VBird 2022/07/20 sh /root/bin/performance.sh # 3. 開始建立開機會執行的一些設定值 [root@localhost ~]# mkdir /root/bin [root@localhost ~]# cd /root/bin [root@localhost bin]# vi performance.sh #!/bin/bash # 1. 先針對網卡設定的部份 for nic in eno1 do ethtool -G ${nic} rx 4096 tx 4096 # 針對 ring 的設定 ethtool -K ${nic} gro off # 針對 gro 的設定 done # 2. 針對實體傳統磁碟設定部份 for hdd in sd{a,b,c,d} do echo 8192 > /sys/block/${hdd}/queue/max_sectors_kb echo 32768 > /sys/block/${hdd}/queue/read_ahead_kb echo 256 > /sys/block/${hdd}/queue/nr_requests echo 31 > /sys/block/${hdd}/device/queue_depth done # 3. 針對 software raid 的部份 for md in md126 do echo 32768 > /sys/block/${md}/queue/read_ahead_kb done sysctl -w dev.raid.speed_limit_max=100000 sysctl -w dev.raid.speed_limit_min=50000 [root@localhost bin]# sh performance.sh
懶的打字的話,鳥哥也寫文字檔給大家下載~直接 wget 下載到你的系統上就可以了!
wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/performance.sh
這樣大概就調整好了!不過,調整過後,系統能不能有更好的表現,你還是得要手動測試測試才行! 一切以數據資料的輸出為準!我們這裡僅是提供一個參考而已!
基本上,Rocky9 與以前的版本差異較大,包括 vim 的慣用環境,都有點不太一樣!所以, 回復一下你的慣用環境,應該是有其必要的!
# 1. 安裝常用的軟體 [root@localhost ~]# yum install vim-enhanced bash-completion net-tools bind-utils # 2. 將 vim 的環境做個簡單的處理 [root@localhost ~]# vim ~/.vimrc "將自動縮排、自動移動畫面的功能關閉!請自行處理! setl noai nocin nosi inde=
一般用戶最好設計一些慣用指令能夠『安全』一些!
# 讓 cp, rm, mv 比較安全一些 [vbird@localhost ~]$ vim ~/.bashrc ....(前面省略).... alias rm='rm -i' alias mv='mv -i' alias cp='cp -i' [vbird@localhost ~]$ source ~/.bashrc
你要保護你的伺服器,最重要的就是不要讓別人使用物理接觸的方式接近你的主機硬體!我們都知道,只要能接觸到你的物理實體主機, 再透過 USB 或其他方式來重新開機,就有很大的機率可以破解你的 root 密碼,進一步去竊取你的資料。因此,你的主機當然最好就是鎖在機房, 或者是鎖在機櫃當中啊!然後透過一條網路線來連線進去操作即可。那接下來呢?要做些什麼?
我們這個小型雲系統,主要的目的是在設計與了解一個機房環境,因此虛擬化是最重要的!問題是, 從剛剛作到現在,好像最重要的虛擬化 qemu, libvirtd 等等,都還沒有管理耶!原因是,我們下載的映像檔是 minimal 的版本, 所以預設沒有虛擬化軟體喔!因此,接下來讓我們先來安裝虛擬化環境!不過,安裝之前,還是先將所有軟體更新才對!
使用 yum -y update 就能全系統更新了!很簡單!只是,未來需要每天更新才可以!未來的更新,我們寫在一個維護腳本中, 暫時不要個別寫入 crontab 囉!
[root@localhost ~]# yum -y update
如果你不知道到底要不要重新開機?還有個簡單的小工具可以使用!透過 needs-restarting 來幫你自動判斷即可! 相當有趣喔!
# 先安裝所需要的工具 [root@localhost ~]# yum -y install yum-utils # needs-restarting 指令用法 [root@localhost ~]# needs-restarting [-urs] 選項與參數: -r : 提供是否需要重新開機的建議 -s : 提供哪些服務需要重新啟動的建議 -u : 提供操作此指令的用戶所需重新啟動的軟體 [root@localhost ~]# needs-restarting -r Core libraries or services have been updated since boot-up: * glibc * kernel * linux-firmware * systemd Reboot is required to fully utilize these updates. More information: https://access.redhat.com/solutions/27943 # RockyLinux 都到 9.2 版了,所以用 9.0 的系統升級之後,會出現上述資料! [root@localhost ~]# needs-restarting -s # 同樣的,有出現奇怪的軟體訊息才需要重新開機,不然就不用理會了!
鳥哥原本使用的 9.0 版本比較舊,目前 (2023) 推出了 9.2 的版本,因此就會出現 glibc, kernel 等核心函式庫已經升級, 所以最好重新開機的樣式!因此,請盡快進行 reboot 的動作吧!
虛擬化環境的安裝也不是太困難,使用 groupinstall 即可安裝妥當!
[root@localhost ~]# LANG=C yum grouplist Available Environment Groups: Server with GUI Server Workstation Custom Operating System Virtualization Host Installed Environment Groups: Minimal Install Available Groups: Legacy UNIX Compatibility Console Internet Tools .... [root@localhost ~]# yum -y groupinstall 'Virtualization Host' # 啟動虛擬化服務 [root@localhost ~]# systemctl start libvirtd [root@localhost ~]# systemctl enable libvirtd [root@localhost ~]# reboot
因為虛擬化環境帶入相當多的軟體,鳥哥個人建議,安裝虛擬化軟體之後,最好重新開機一下!讓所有的服務自動啟動。 接下來,才有辦法找到哪個服務需要調整處理一下囉。
在網際網路上,別人想要入侵你的系統,不外乎 (1)想要竊取你的有價的機密資料 (2)想要拿你的機器當作跳板去打別人。 在我們將物理實體機器鎖在某個不為人知的地點之後 (不為人知...當然是玩笑話),再來則是要考慮,別人怎麼取得你的系統存取權!
一般來說,網路怪客想要登入你的主機,有個大前提,那就是你的作業系統某個網路服務是有啟動的~ 如果你都沒有啟動網路服務,對方想要入侵你的系統,還真是挺有難度的。因此,請先檢查你的系統上面有沒有啟動對外公開的網路服務。 最簡單的作法就是使用 netstat 這個指令即可:
[root@cloud ~]# netstat [-atulp] [-c N] 選項與參數: -a :列出所有的連線狀態,包括 tcp/udp/unix socket 等; -t :僅列出 TCP 封包的連線; -u :僅列出 UDP 封包的連線; -l :僅列出有在 Listen (監聽) 的服務之網路狀態; -p :列出 PID 與 Program 的檔名; -c :可以設定幾秒鐘後自動更新一次,例如 -c 5 每五秒更新一次網路狀態的顯示; # 1. 列出目前系統上面正在監聽的網路埠口,僅 TCP 與 UDP 埠口 [root@cloud ~]# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1630/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1194/sshd: /usr/sbi tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 1194/sshd: /usr/sbi tcp6 0 0 :::111 :::* LISTEN 1/systemd udp 0 0 192.168.122.1:53 0.0.0.0:* 1630/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 1630/dnsmasq udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd udp 0 0 127.0.0.1:323 0.0.0.0:* 1115/chronyd udp6 0 0 :::111 :::* 1/systemd udp6 0 0 ::1:323 :::* 1115/chronyd
在 netstat 輸出資料當中,每一個欄位的主要意義如下:
未來我們會慢慢網路基礎,這裡你先記下來,那就是每部有網路功能的主機,幾乎都有個內部的網路卡界面稱為 lo,而這個網路界面的 IP 位址就是 127.0.0.1!這個位址原本的設計是給系統內部使用的,網際網路無法連結到這個界面。所以,如同上面的輸出結果 port 323/udp 你可以暫時不用理會它,因為外面的網際網路世界,原則上是無法連結到該埠口的。
一般來說,同一個服務針對 TCP 封包 (後續章節會談,現在你先知道有這種封包格式即可) 會有 IPv4 與 IPv6 兩種協定的相同埠口號碼同時都存在的。 所以,這裡我們先暫時看一下 IPv4 的封包格即可~亦即上述表格中的 tcp 與 udp 兩種,先不要看 tcp6 與 udp6 囉 (其實會與 IPv4 相同!)
本機放行的服務所搭配使用的界面中,只要是 0.0.0.0:XX 的,那個就是針對全部界面都放行的服務,針對 127.0.0.1 的是僅有針對本機內部的放行, 而 192.168.122.1 則是針對內部虛擬設備的服務,主要是由 dnsmasq 所提供。我們先針對網路服務來處理,等等再來搞定 dnsmasq。 不考慮 dnsmasq 服務產生的埠口情況下,目前啟動的埠口有這些:
[root@cloud ~]# netstat -tulnp | grep -v dnsmasq
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 1194/sshd: /usr/sbi
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1194/sshd: /usr/sbi
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp 0 0 127.0.0.1:323 0.0.0.0:* 1115/chronyd
udp6 0 0 :::111 :::* 1/systemd
udp6 0 0 ::1:323 :::* 1115/chronyd
基本上, port 22 是我們可以透過遠端系統登入的一個重要埠口,千萬不要亂動!至於 port 323 則是我們上面設定 chronyd 服務之後所啟用的,這兩個 (22, 323) 請保留不要動!那麼唯一需要處理的, 就變成是 port 111 了!但是這個 port 111 很可怕啊~竟然用到 systemd !我們不能關閉 systemd 的! 那怎辦?到底該關閉 systemd 所管理的那一個子元件?不要害怕,你可以透過 /etc/services 去找到該埠口對應的服務喔!
[root@cloud ~]# grep ' 111/' /etc/services
sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP
你可以看到 111 埠口的服務有 portmapper 與 rpcbind 這兩個!那到底我們的系統是使用那一個? 不用怕!使用 systemctl 來查詢即可!
[root@cloud ~]# systemctl list-unit-files --all | grep portmap [root@cloud ~]# systemctl list-unit-files --all | grep rpcbind rpcbind.service enabled enabled rpcbind.socket enabled enabled rpcbind.target static - [root@cloud ~]# systemctl status rpcbind.socket ● rpcbind.socket - RPCbind Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled) Active: active (running) since Thu 2022-07-21 09:39:24 CST; 1h 9min ago Until: Thu 2022-07-21 09:39:24 CST; 1h 9min ago Triggers: ● rpcbind.service Listen: /run/rpcbind.sock (Stream) 0.0.0.0:111 (Stream) 0.0.0.0:111 (Datagram) [::]:111 (Stream) [::]:111 (Datagram) Tasks: 0 (limit: 203628) Memory: 16.0K CPU: 1ms CGroup: /system.slice/rpcbind.socket
果真有找到名為 rpcbind.service 與 rpcbind.socket 的服務!然後查看一下 rpcbind.socket 服務後, 確定是啟動 port 111 的主要元件啊!現在,讓我們來關閉這傢伙吧!目前用不到!未來會用到再開即可!
[root@cloud ~]# systemctl stop rpcbind.service rpcbind.socket [root@cloud ~]# systemctl disable rpcbind.service rpcbind.socket [root@cloud ~]# netstat -tulnp | grep -v dnsmasq 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 1194/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1194/sshd: /usr/sbi udp 0 0 127.0.0.1:323 0.0.0.0:* 1115/chronyd udp6 0 0 ::1:323 :::* 1115/chronyd
這樣,網路啟動的埠口,就變得相當簡單啊!
dnsmasq 服務是經由 qemu 的網路界面設定所主動帶起的, 直接刪除 qemu 的網路界面後,該項目會自動刪除!處理方式也挺簡單,不過,你最好要先有 virsh 這個指令支援才好! 早期的 RockyLinux 8.x 並沒有主動安裝這個軟體,RockyLinux9 則主動安裝了!你不用重新安裝喔! 不過,查詢流程還是建議可以學一學!
# 查詢 virsh 指令來源,並且安裝對應的軟體 [root@localhost ~]# yum whatprovides '*virsh' ..... libvirt-client-8.0.0-8.el9_0.x86_64 : Client side utilities of the libvirt library Repo : appstream Matched from: Other : *virsh [root@localhost ~]# yum install libvirt-client # 列出目前 libvirtd 管理的網路界面: [root@localhost ~]# virsh net-list Name State Autostart Persistent -------------------------------------------- default active yes yes # 關閉此界面,並且下次重新開機也不會自動生成此界面 [root@localhost ~]# virsh net-destroy default Network default destroyed [root@localhost ~]# virsh net-undefine default Network default has been undefined
這樣就完整的將 libvirtd 管理的網路界面關閉,如此一來,透過 dnsmasq 管理的功能,也就直接關閉! 所以,當你再次下達 netstat -tlunp 時,就只會看到 port 22 與 port 323 囉!這樣就讓你的網路埠口比較乾淨啦!
使用 netstat 可以查閱到本身伺服器的網路服務。不過,如果想要知道區網內的其他主機服務,又或是想要偵測自己伺服器是否有其他的埠口時, 可以透過 nmap 這個指令來處理喔!
nmap 軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!在 RockyLinux 裡頭是有提供 nmap 的, 如果你沒有安裝,那麼就使用 yum 去安裝他吧!
[root@cloud ~]# yum install nmap [root@cloud ~]# nmap [掃瞄類型] [掃瞄參數] [hosts 位址與範圍] 選項與參數: [掃瞄類型]:主要的掃瞄類型有底下幾種: -sT:掃瞄 TCP 封包已建立的連線 connect() ! -sS:掃瞄 TCP 封包帶有 SYN 標籤的資料 -sP:以 ping 的方式進行掃瞄 -sU:以 UDP 的封包格式進行掃瞄 -sO:以 IP 的協定 (protocol) 進行主機的掃瞄 [掃瞄參數]:主要的掃瞄參數有幾種: -PT:使用 TCP 裡頭的 ping 的方式來進行掃瞄,可以獲知目前有幾部電腦存活(較常用) -PI:使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄 -p :這個是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式 -TN:指定延遲時間,可透過類似 -T4 來加快偵測速度 (約 4ms),效能會較好。 [Hosts 位址與範圍]:這個有趣多了,有幾種類似的類型 192.168.1.100 :直接寫入 HOST IP 而已,僅檢查一部; 192.168.1.0/24 :為 C Class 的型態, 192.168.*.* :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了! 192.168.1.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!
nmap 的使用也很簡單,鳥哥大部分只用兩種方式來偵測而已,一種是使用 TCP 與 UDP 共同偵測的方法去看某部主機啟動的埠口, 其中由於 UDP 需要偵測的埠口比較大量,所以使用了 -sU 之後,偵測的速度會變很慢,在使用上需要注意一下。另一個方式則是使用 -sP 去看某段網域的所有電腦是否活著而已!
# 1. 查看本機啟用的 UDP 與 TCP 埠口 [root@cloud ~]# nmap -sTU localhost Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:53 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.00015s latency). Other addresses for localhost (not scanned): ::1 Not shown: 1999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds # 上面特別說明,只針對全部放行的埠口做檢查,內網不分析。
最簡單的方法就是這樣做處理!可以針對某一個主機名稱或 IP 進行偵測。不過,要注意,不要偵測非你自己管理的設備! 不然你的網路很容易被停權!
# 2. 探索整個 class C 的區網中,哪些主機 IP 可能是活動中的 (active, alive) [root@cloud ~]# nmap -sP 192.168.201.0/24 Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:54 CST Nmap scan report for 192.168.201.252 Host is up (0.0039s latency). MAC Address: 94:57:A5:9C:DF:60 (Hewlett Packard) Nmap scan report for 192.168.201.254 Host is up (0.00026s latency). MAC Address: 18:31:BF:45:58:F2 (Asustek Computer) Nmap scan report for 192.168.201.249 Host is up. Nmap done: 256 IP addresses (3 hosts up) scanned in 4.46 seconds
一般針對單一主機的偵測結果輸出會有 3 行左右,如上所示,偵測 192.168.201.252 的結果中,除了探測出正確的網卡卡號 (MAC) 之外, 也從網卡卡號找到該主機可能的主機板類型哩!而且速度相當快,只花費數秒鐘就完成 256 個 IP 的偵測了。 很有趣的是,還能找到我這一台 HP 的事務機~那麼這部事務機可以提供什麼埠口讓我連線呢?來偵測一下 TCP 好了!
[root@cloud ~]# nmap -sT 192.168.201.252 Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:57 CST Nmap scan report for 192.168.201.252 Host is up (0.013s latency). Not shown: 989 closed ports PORT STATE SERVICE 80/tcp open http 139/tcp open netbios-ssn 443/tcp open https 445/tcp open microsoft-ds 515/tcp open printer 631/tcp open ipp 6839/tcp open unknown 7435/tcp open unknown 8080/tcp open http-proxy 9100/tcp open jetdirect 9220/tcp open unknown MAC Address: 94:57:A5:9C:DF:60 (Hewlett Packard) Nmap done: 1 IP address (1 host up) scanned in 1.41 seconds
未來你就會知道, port 631 通常就是印表機常用的埠口,而 port 9100 通常是 HP 印表機慣用的埠口~從這邊就能夠發現到, 啊!這個 IP 就是鳥哥辦公室的網路噴墨印表機!透過這個方法,你也能夠抓到自己辦公室裡面有沒有怪異的 IP 正在被使用中! 可以作為管理整個區網的重要工具之一!
事實上,這個 namp 是很多 cracker 喜歡使用的軟體,因為他很強大!無論是 TCP 還是 UDP 都可以偵測!偵測到某些特定的埠口之後, 就可能可以透過某些漏洞來取得該伺服器的使用權!對於網路管理員來說,對方使用 nmap 進行 port scan (埠口偵測) 時,還真是覺得很討厭! 而且,某些系統會透過類似 TCP wrapper 的功能來抓取 port scan 的偵測來源端,因此,你的 IP 可能會被紀錄喔! 所以,千萬不要使用 nmap 去偵測別人家的網域,那可能會害你吃上官司!萬萬不可!萬萬不可!
不過,如果拿 nmap 來探索與管理自己的區域網路,則是相當好用的一個工具喔!
為什麼要做磁碟陣列?是因為擔心硬碟損毀會造成整個系統的遺失,所以使用磁碟陣列。那想一想,如果磁碟陣列做好之後不觀察, 那你怎麼知道何時出問題了?何時需要更換硬碟?另外,如果根目錄的容量被使用到 100% 了!那你當然就無法繼續操作系統... 整個變很怪~總之,系統很多狀況你至少應該一天了解一次才行。那如果要你每天都登入系統去做同樣的事情, 那也可能讓你覺得很崩潰~所以囉,寫一隻可以自動偵測的腳本,應該是不錯的好主意!
基本上,我們可能需要注意的項目有底下這些:
假設我們的分析腳本檔名設計為 /root/bin/maintain.sh 好了,那麼依據上面的說明,我們可能可以這樣做:
[root@localhost ~]# vim /root/bin/maintain.sh #!/bin/bash myhost=$( hostname ) mydate=$( date +%Y-%m-%d ) mytime=$( date +%Y-%m-%d' '%H:%M ) myfile=/root/log/${mydate}-$( date +%s ).txt [ ! -d /root/log ] && mkdir /root/log # 0. output your host ( echo echo "HOSTNAME: $myhost" echo "Analysis time: $mytime" # 1. check software raid if [ -b /dev/md126 ]; then echo echo "###################################" echo "check Software RAID /dev/md126" cat /proc/mdstat | sed 's/^/\t/g' fi # 2. check real disk hdds=$( ls /dev/sd* 2> /dev/null ) if [ "${hdds}" != "" ]; then echo echo "###################################" echo "check SATA disk" ( for i in ${hdds} do echo "check for ${i}" smartctl --all ${i} | grep overall-health done ) | sed 's/^/\t/g' fi # 3. check filesystem echo echo "###################################" echo "check filesystem" df -Th -x tmpfs -x devtmpfs | sed 's/^/\t/g' # 4. output port number echo echo "###################################" echo "check network TCP/UDP listening ports" netstat -tlnpu | sed 's/^/\t/g' # 5. check NTP echo echo "###################################" echo "check time and NTP server" ( timedatectl ; chronyc sources ) | sed 's/^/\t/g' # 6. setup yum update and show needs restarting echo echo "###################################" echo "update systems and check restarting OK!?" ( yum -y update echo needs-restarting -rs ) | sed 's/^/\t/g' # 7. check ssh login user echo echo "###################################" echo "check ssh login users" ( grep ssh /var/log/secure | grep Accepted | \ sed 's/^.*Accepted password for //g'| \ sed 's/ port.*$//g' | sort| uniq -c ) | sed 's/^/\t/g' ) | tee $myfile [root@localhost ~]# sh /root/bin/maintain.sh HOSTNAME: cloud.vbird Analysis time: 2022-07-21 10:59 ################################### check Software RAID /dev/md126 Personalities : [raid10] md126 : active raid10 sda[3] sdb[2] sdc[1] sdd[0] 1953519616 blocks super external:/md127/0 64K chunks 2 near-copies [4/4] [UUUU] md127 : inactive sdb[3](S) sdd[2](S) sda[1](S) sdc[0](S) 11104 blocks super external:imsm unused devices:################################### check SATA disk check for /dev/sda SMART overall-health self-assessment test result: PASSED check for /dev/sdb SMART overall-health self-assessment test result: PASSED check for /dev/sdc SMART overall-health self-assessment test result: PASSED check for /dev/sdd SMART overall-health self-assessment test result: PASSED ################################### check filesystem Filesystem Type Size Used Avail Use% Mounted on /dev/md126p3 xfs 100G 3.9G 97G 4% / /dev/md126p2 vfat 1022M 6.9M 1016M 1% /boot/efi /dev/md126p4 xfs 100G 748M 100G 1% /home /dev/md126p6 xfs 1.7T 12G 1.7T 1% /kvm ################################### check network TCP/UDP listening ports 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 1194/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1194/sshd: /usr/sbi udp 0 0 127.0.0.1:323 0.0.0.0:* 1115/chronyd udp6 0 0 ::1:323 :::* 1115/chronyd ################################### check time and NTP server Local time: Thu 2022-07-21 10:59:04 CST Universal time: Thu 2022-07-21 02:59:04 UTC RTC time: Thu 2022-07-21 02:59:04 Time zone: Asia/Taipei (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* dns3.ksu.edu.tw 3 6 377 36 +62us[ +94us] +/- 237ms ################################### update systems and check restarting OK!? Last metadata expiration check: 0:07:19 ago on Thu Jul 21 10:51:45 2022. Dependencies resolved. Nothing to do. Complete! No core libraries or services have been updated since boot-up. Reboot should not be necessary. ################################### check ssh login users 5 vbird from 192.168.201.254 [root@localhost ~]# vim /etc/crontab 20 0 * * * root sh /root/bin/maintain.sh
懶的打字的話,鳥哥也寫文字檔給大家下載~直接 wget 下載到你的系統上就可以了!
wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/maintain.sh
有任何需要,你都可以隨時增加到 maintain.sh 裡面去,這樣管理起來就方便許多!尤其很容易修改! 看起來也很直觀~鳥哥也將每次分析的資料存放在 /root/log 裡面,方便未來的查詢。 如果你知道如何設計 mail 的話,也能夠讓該封信件直接傳送到你的外部信箱中。
事實上,RockyLinux 上面預設有 logwatch 登錄檔分析軟體喔!它的功能與我們要的系統偵測有點不太一樣, 這個 logwatch 可以分析 /var/log/ 裡面的登錄檔,進行進一步分析,可以取得比較好的分析結果。 定期分析則是使用 crontab。基本實施過程我們可以這樣做看看:
# 先安裝好這套軟體,然後查詢一下設定檔在哪裡? [root@localhost ~]# yum -y install logwatch [root@localhost ~]# rpm -qc logwatch /etc/cron.daily/0logwatch /etc/logwatch/conf/ignore.conf /etc/logwatch/conf/logwatch.conf /etc/logwatch/conf/override.conf /usr/share/logwatch/default.conf/logwatch.conf # 因為 logwatch 預設會使用 email 傳送,因此需要安裝 mail server [root@localhost ~]# yum -y install postfix [root@localhost ~]# systemctl start postfix # 執行一下放在 /etc/cron.daily 底下的定期執行檔: [root@localhost ~]# sh /etc/cron.daily/0logwatch # 開始讀取 root 的 mail [root@localhost ~]# mail s-nail version v14.9.22. Type `?' for help /var/spool/mail/root: 1 message 1 new ▸N 1 logwatch@cloud.vbird 2022-07-21 11:02 616/26877 "Logwatch for cloud.vbird (Linux)" & 1 <==這裡是說,要讀取 1 號信件的意思!底下為信件內容 [-- Message 1 -- 616 lines, 26877 bytes --]: To: root@cloud.vbird From: logwatch@cloud.vbird Subject: Logwatch for cloud.vbird (Linux) Message-Id: <20220721030241.5ACAAC051536@cloud.vbird> Date: Thu, 21 Jul 2022 11:02:40 +0800 (CST) ################### Logwatch 7.5.5 (01/22/21) #################### Processing Initiated: Thu Jul 21 11:02:40 2022 Date Range Processed: yesterday ( 2022-Jul-20 ) Period is day. Detail Level of Output: 0 Type of Output/Format: mail / text Logfiles for Host: cloud.vbird ################################################################## --------------------- Cron Begin ------------------------ **Unmatched Entries** INFO (Syslog will be used instead of sendmail.) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) CMDEND (run-parts /etc/cron.hourly) ---------------------- Cron End ------------------------- --------------------- Mdadm Begin ------------------------ /dev/md/imsm : mdadm: cannot open /dev/md/kvm_0: No such file or directory ---------------------- Mdadm End ------------------------- --------------------- SSHD Begin ------------------------ SSHD Started: 2 Times Users logging in through sshd: vbird: 192.168.201.254 (_gateway): 4 Times ---------------------- SSHD End ------------------------- --------------------- Disk Space Begin ------------------------ Filesystem Size Used Avail Use% Mounted on /dev/md126p3 100G 4.0G 97G 4% / /dev/md126p2 1022M 6.9M 1016M 1% /boot/efi /dev/md126p4 100G 748M 100G 1% /home /dev/md126p6 1.7T 12G 1.7T 1% /kvm ---------------------- Disk Space End ------------------------- ###################### Logwatch End ######################### & exit
使用 email 做紀錄確實是很不錯的主意~logwatch 預設就是使用 email 進行傳輸。 只是,我們已經使用了 maintain.sh 自己做分析,有時候並不一定要使用 logwatch 就是了! 這邊鳥哥先將 logwatch 移除!各位夥伴有興趣就自己玩囉!
[root@localhost ~]# yum remove logwatch
系統管的好不好有時候不只是系統的軟硬體問題而已,管理員的態度對於系統正常運作與否有很大的關係! 舉個最簡單的例子,我們都知道密碼不要設定的太簡單,但是,如果你的老闆、好朋友的帳號要求簡單的密碼時,你要怎麼辦?這就重要了吧!
要了解系統可能被怎麼破解,那就得要從到底攻擊者從哪個角度發起攻擊來思考。物理攻擊應該是沒有辦法避免的,所以, 將伺服器主機實際擺放在機房確實是有其必要性的~那可以避免大部分的物理攻擊行為。除了這個之外,從網路發起攻擊時, 你的伺服器總是可能會收到許多的網路連線需求的封包,這些封包很可能就有正常或不正常的連線行為。正常的連線行為就還好, 不正常的連線行為就比較困擾一下。無論如何,若你的伺服器要回應用戶端資料時,封包進入到伺服器的流程,大致上可以這樣思考:
基本的流程就是:
要注意的是『要順利取得資料,每一關都要順利通過才行!』並不是找平均值,是要全部打通關! 這點非常重要!所以出錯時,每個環節都要仔細去分析探討。
你要先知道的是,用戶端連線到你的伺服器的目的是什麼?當然是取得你伺服器所提供的資源。若以 WWW 伺服器而言,用戶端最可能需要的, 除了靜態網頁所提供的資料之外,最重要的就是互動式動態網頁的資料庫資源!另外,如果是 FTP 伺服器的話,當然就是需要你提供的檔案囉! 無論如何,最終的結果經常與用戶端要取得你伺服器的『檔案資料』有很大的關係!不過,針對網路服務,除了一般 Linux 權限之外, 還得要考慮 SELinux 喔!
假如:(1)你的網路如果不通了,你會知道可能發生的問題在哪裡嘛?(2)你區網內的交換器或集線器突然變得很熱鬧 (全部燈號突然瘋狂閃爍),然後用戶開始抱怨網路變慢了,你有辦法偵測到問題嘛?(3)有個用戶說,他的電腦 IP 位址參數在開機時,老是回報『這個 IP 位址已經被使用了』,你有辦法抓出有問題的那個 IP 位址是誰盜用了嘛?
上述這些問題全部都跟你的網路基礎學的好不好有關,尤其是網路時通時不通的情況,最是困擾!因為很難找出實際的錯誤! 所以得要多方測試。問題是,你要測試什麼?總是得要有個目標吧!這就是重點!所以囉,後續章節的網路基礎真的很重要, 管理員若不熟悉網路基礎,很多問題會抓不到方向解決啊!
此外,有很多網路的表示方式,包括 192.168.1.0/24 這樣的表示方式,以及 IPv6 的表示方式等資料,都需要熟悉,否則未來在設定伺服器, 或者是防火牆的網路放行任務等,都會出問題!所以,趕緊加油學習吧!
很多剛剛學習架站的朋友,都會問說:『各位大大,我的伺服器防火牆已經啟用了,為什麼還是會被攻擊與入侵成功啊?』 很正常!因為防火牆『一點用處也沒有』!如果你的系統已經關閉了大部分的服務,同時你的系統也是更新到最新的狀態, 許多時候,有沒有防火牆對你來說,問題不大!為什麼呢?
如圖 1.3.1 所示,針對正常的服務來說,例如 WWW 來說,你的防火牆一定要放行人家對你伺服器的 WWW 連線吧? 也就是說:『只要連線到你的 WWW 伺服器的封包,你的防火牆是不會抵擋他進入的』,所以防火牆有用嘛?當然沒有用!所以我們才說, 對於正常的服務來說,防火牆一點屁用也沒有~不要再相信人家說的防火牆需要很強大啦!
不過對於某些需要給點限制的服務來說,防火牆的任務是很重要的!舉例來說,未來我們會談論到 ssh 這個指令, 這個指令會連線到伺服器的 port 22,且登入後取得的 bash 就像是在本機前操作系統一樣!所以,只要能夠使用 ssh 登入, 並且輸入正確的帳號密碼,幾乎就可以完全掌控系統的操作 (當然,還需要有 root 權限才行!)。也因為 ssh 這麼可怕, 所以,通常對於 ssh 來說,我們會建議取消 root 的登入權限,避免網路怪客以 root 來猜測密碼攻擊。
對於鳥哥來說,我的伺服器通常會對我自己的工作機放行 ssh 的 port 22 而已,其他的 IP 都會被我拒絕掉! 使用的方式就是透過防火牆的功能來達成的!因此,這個時候防火牆的任務與功能就相當強大了!此外, 你的系統也可能會偶而用到某些特定的服務,但是並不是隨時啟用的,對於這種情況來說,適時的保護這些非常規的服務也是相當重要的任務! 這就是防火牆的重要任務之一囉!保護資源限制或是不對外公開的服務!
所以說,防火牆有時候有用,有時候沒有用,還是得要分析你的服務以及封包的流向之後,你才會了解到防火牆的目的為何喔! 不要盲目的以為有了防火牆,網路就會變得很美好,假的!這點管理員的認知很重要喔!
所謂的服務就是伺服器軟體啦!你安裝了 httpd 這個軟體,並且啟用他,你的伺服器就變成 WWW 伺服器囉!這個 WWW 服務就是一隻或一組程式的意思。 那麼我們也知道服務也可以進行部份的資源限制喔!包括網路磁碟機的 samba 服務可以在自己的設定檔裡面就限制能使用的用戶來源 IP 位址呢! 甚至不需要防火牆的支援哩!
不過提供服務的軟體有沒有問題可能是個大問題!舉例來說,早期的 ssh 版本中,有一個版本之前的軟體都有個 bug, 該 bug 會讓攻擊者不需要知道伺服器的帳號密碼,只要能夠接觸到 ssh 這個埠口,就可以順利的取得 root 的權限來登入與操作系統了! 你說,可怕不可怕!所以,本章一開始才會要求大家一定要更新軟體!非常非常重要喔!
如果你的 httpd 這隻服務出問題,那麼當 httpd 被入侵導致被取得使用權之後,httpd 可能可以在你的系統中進行各種檔案的探索,進一步竊取你的資料。 此時,你可以透過 SELinux 的規則控制,讓你的 httpd 只能讀取某些特定目錄的資料,其他目錄的資料就不給讀寫~ 這就是 SELinux 以及某些軟體的 chroot 的功能!
常在網路上面發現很多網友問:『請教一下,如何才能夠讓使用者瀏覽到我的某個目錄底下的檔案呢?』,很多高手就會故意說, 你就設定『 chmod -R 777 / 』就好了吧?呵呵!一設定就慘了咧~你可能最終唯一的手段就是重新安裝系統了.... 好一點的會告訴你,就『 chmod -R 777 /some/dir/ 』這樣,這也會出問題~亦即 /some/dir/ 底下的任何資料,任何人都可以讀/寫/刪除!你說可怕不可怕? 為了避免這些問題,SELinux 的使用,也能夠讓 777 的權限不能被讀寫~
由於 SELinux 通常用在『避免自己的用戶做傻事』的前提之下去設計的,而這個做傻事的用戶通常就是管理員自己.... 所以,我們會在下個章節來討論討論 SELinux !管理員一定要看喔!才不會做傻事!
我某個廠商朋友常常問我:『鳥哥,有個公司的老闆,他總是有個需求,就是啊,每個人的資料他都需要可以查閱,但是不能夠修改。 因為帳號們都是不同的群組,而且還有舊有的帳號,所以似乎也不能使用群組的權限來管理,其他人的權限就更不可行了!請問, 我可以怎麼處理啊?』咦!這不就是『針對單一用戶的權限設定』嘛?會的朋友一下子就立刻想到 ACL 了!隨便搞搞就搞定了! 管理員竟然不知道什麼是 ACL ?回去瞧瞧基礎篇囉!
本章 1.2 小節的基本強化功能當中,有些事情是管理員一定要進行的!現在讓我們來搭配圖 1.3.1 討論討論這些動作之後的基本原因吧!
請搭配圖 1.3.1 的流程,通過防火牆之後,用戶端就可以接觸到網路服務了!前一小節我們也討論過,網路服務如果出問題,你的系統很容易被攻擊與入侵! 所以,為了避免困擾,最好當然就是關閉不必要的網路服務,讓攻擊者無從攻擊!然後將軟體整個升級到沒有問題的版本 (雖然隨時都可能會出現新的問題), 並且依據更新的軟體去判斷要不要重新開機!這樣就可以讓你的系統維持良好的狀態!即使沒有防火牆的情況下,你的伺服器也能活的好好的呢!
一般來說,你的 email 如果是 user1@hostname.domain 的情況下,那麼攻擊者就知道你的主機名稱為 hostname.domain,然後這個主機裡面可能有個名為 user1 的帳號,因此,攻擊者就可以透過前面講的 port scan 軟體去偵測 hostname.domain 這部機器,然後根據掃描到的埠口, 去連線你的伺服器,然後嘗試使用 user1 去猜密碼!如果你的密碼是很多人喜歡設計的 123456,嘿嘿!想要取得你的資訊, 根本不需要 1 分鐘的時間!
所以,如果是 email 或純粹的 FTP 檔案伺服器的帳號,鳥哥通常不會給這些帳號的本機登入權限。不過,即使是這樣,攻擊者仍然可以透過正常的管道, 去嘗試使用 user1 以及猜密碼的方式,去探索該帳號的 email 以及 FTP 啊!此時攻擊者並不是要登入本機喔~是想要偷取 user1 的資料。 那怎辦?你有許多辦法來處理:
在多年的管理員生涯之後,鳥哥個人覺得上面第一點最難啊~難如登天...所以,能做多少算多少了!救一個是一個~至於最後一點也是很有效果的! 其實我們在前一小節裡面談到的 crontab 的 email 裡面就是透過這種方式來處理~假設我實際的帳號名稱其實是 dmtsai,但是我的 email 可以用 vbird@hostname.domain 來處理,只要在 /etc/aliases 裡面增加『 vbird: dmtsai 』就可以了!在這種情況下,攻擊者會以為帳號是 vbird ,所以會用該帳號來猜密碼! 不過,實體帳號其實是 dmtsai 啦!這樣子的隱藏帳號,也是很有效的管理方式!
我們經常說,密碼不要寫在任何紙上面或是檔案裡面,否則很容易被竊取。然後我們又用 openssl 去計算出人腦記不住的密碼了! 你最好能記的起來這麼多密碼啦!不可能~所以,某些特別的密碼隱藏方式,就很需要了解一下!可以提供自己建立密碼隱藏的功能。
# 先取得某個圖檔,隨便來源皆可!我們取得本站提供的檔案好了: [vbird@cloud ~]$ wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/file_permission.gif # 查看下這個檔案的細節 [vbird@cloud ~]$ file file_permission.gif file_permission.gif: GIF image data, version 89a, 512 x 306 # 將密碼偷偷丟進去這個檔案內,然後查看檔案資訊: [vbird@cloud ~]$ echo -e "\nsomeweb: password" >> file_permission.gif [vbird@cloud ~]$ file file_permission.gif file_permission.gif: GIF image data, version 89a, 512 x 306 # 完全沒變! # 取得之前儲存的密碼 [vbird@cloud ~]$ tail -n 1 file_permission.gif someweb: password
這個檔案未來還是可以使用瀏覽器去查閱圖檔資訊,但是該檔案後面幾行就藏了你個人的密碼!當然,這個檔案就要好好保存!不要流出去也不要被自己誤刪! 至少比起一般的文字檔來說,別人比較不容易透過這樣的方式去追蹤檢查啊!不過,也因為影像檔的後面資料很容易藏東西, 聽說某些攻擊碼也會用類似的方式來隱藏/執行。所以,現在連圖檔的內容,也是需要留意啦!