小型云系统我们在第零章谈过他的重要性!这一章我们真的就来建置它吧!
要仿真出整个机房的环境,最省钱的作法当然就是在云里面通过虚拟环境来架设一番。不过,若真的要去公有云申请帐号, 我们的情况是没有办法处理好想要的桥接与子网的切割,这就伤脑筋了!因此,这一章,我们使用简易的电脑主机配备搭配一些设置, 让我们的母机器未来可以生出好多个虚拟机来使用。
如同 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 U盘来进行开机片的制作。最简单的指令方式有点像这样 (我这里假设你的 USB U盘为 /dev/sdc !请使用 lsblk 去找出你的U盘文件名来取代掉即可。)
[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 U盘吧! 在 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 http://vbird.cn/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 http://vbird.cn/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 http://vbird.cn/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
这个文件未来还是可以使用浏览器去查阅图档信息,但是该文件后面几行就藏了你个人的密码!当然,这个文件就要好好保存!不要流出去也不要被自己误删! 至少比起一般的文本档来说,别人比较不容易通过这样的方式去追踪检查啊!不过,也因为图像档的后面数据很容易藏东西, 听说某些攻击码也会用类似的方式来隐藏/运行。所以,现在连图档的内容,也是需要留意啦!