前一段时间,我发现我的VPS受到很多的SSH爆破攻击,出于安全和好奇,我运行了两个容器,一个用于运行mysql服务,另一个用于运行cowrie蜜罐服务,以记录攻击者的行为。
一开始,我只挂了一个静态网站,所以我以为我的VPS内存还有很多剩余,的确是有剩余,但是总量也不是很多….
存储有60GB,但是内存只有可怜的1GiB
而运行docker容器又是一个很耗费内存的操作,所以后面经常出现VPS卡死的情况。
学过操作系统这门课,了解一些内存交换(Swap)的概念,我想尝试一下是否可以通过这种方式去解决VPS卡死的问题
Swap
当系统物理内存(RAM)耗尽时,操作系统可以将一些不常用的数据从内存中移到Swap空间,以腾出内存用于当前需要运行的进程。这种机制允许系统在物理内存不足时继续运行,而不会立即崩溃或终止进程。
首先使用free
指令查看系统内存的使用情况。
1 | $ free -h |
该输出表示,系统总共有883 MiB的物理内存,其中362 MiB被使用,131 MiB是空闲的,389 MiB被用作缓冲区和缓存,可用内存为372 MiB,在需要时,可以使用这部分内存。
Swap这一行数据的值都为0,表明系统并没有配置Swap空间。
为了使得在这个物理内存有限的机器上运行这些程序,下面就开始设置Swap。
1 | sudo fallocate -l 16G /Swapfile |
1 | sudo chmod 600 /Swapfile |
这确保只有 root 用户可以直接访问Swap文件,这对于系统安全性是非常重要的。
1 | -rw------- 1 root root 16G Jan 28 10:00 /Swapfile |
安全性考虑
在多用户系统中,不同用户可能拥有不同的权限。设置Swap文件的权限为 600
可以防止潜在的安全风险,比如未经授权的用户读取或修改Swap文件的内容,可能会影响系统稳定性或暴露敏感数据。
因此,尽管Swap文件设置了 600
权限,所有用户仍然可以透明地使用Swap空间,只是他们不能直接访问或修改Swap文件的内容。这种做法可以保证系统的安全性和稳定性。
1 | sudo mkSwap /Swapfile |
这将文件格式化为Swap文件,使其可以被系统用作Swap空间。
1 | sudo Swapon /Swapfile |
1 | sudo Swapon --show |
1 | echo '/Swapfile none Swap sw 0 0' | sudo tee -a /etc/fstab |
/etc/fstab
文件包含了所有需要在系统启动时自动挂载的文件系统信息。将Swap文件添加到此文件中,可以确保每次系统重启后,Swap文件都会自动启用。
在完成之后再次使用free
命令就可以查看到,刚设置的Swap区生效了。
1 | $ free -h |
在配置Swap前,重启docker容器特别容易导致服务器hang住,在配置完成后,我再次restart docker容器,这时系统会卡住几秒钟,然后restart成功,此时再使用free
命令查看,发现Swap空间已被启用了。
1 | $ free -h |
之后都几乎没有出现过VPS直接卡死的情况。