在 Linode VPS 上将服务器系统由 CentOS 7 改成了 openSUSE Leap 15。这篇博文记录的是之前将 Linode VPS 上的服务器操作系统从 CentOS 7 改为 openSUSE Leap 15 的过程。就是现在这个水景一页博客所在的服务器,基于 Apache、MariaDB、PHP 和 PHP-FPM。
前情提要¶
今天要维护服务器,照例先搜索自己网站上的记录,才发现并没有把之前在 Linode VPS 上配置 openSUSE Leap 服务器的记录整理上来。倒是先把迁移 Let’s Encrypt 证书的过程发布了。这还是两年多以前的事情了。费了好大劲才从自己电脑里找出来之前的笔记,看起来应该基本上算是很完整了,干脆抽点时间发布出来,以后再在这个基础上面慢慢完善。
安装 openSUSE Leap 的时候,Leap 15.2 还没有发布,所以下面记录都是按照 openSUSE Leap 15.1 系统来的。不过根据后来升级到 openSUSE Leap 15.2 以及再升级到 openSUSE Leap 15.3 的经验来看,安装配置过程应该没有什么不同。
哎,现在 openSUSE 15.4 都已经发布了,又该升级了。再等几天吧。实在是太忙了。
背景¶
最开始安装网页服务器的时候,采用了众口相传的 CentOS 作为操作系统。网上都说服务器就需要鲁棒、稳定和安全。而且因为流行,网上关于 CentOS 相关的安装、配置和优化的文章也多,有问题也容易找到解决方法。但是十来年的时间下来,软件更新越来越快,CentOS 的更新总是落后太多。更新周期长肯定会导致每次更新变化大。不能用上较新的技术倒还好,最怕的是碰上 CentOS 的大版本更新,前后变动太大,几乎需要从头再来,升级更新还不如重装系统快。
随着 CentOS 8 发布已经过去快一年了,但是因为个人时间不充裕,又害怕 CentOS 大版本升级过程中的麻烦,一直没敢升级/重装。可是 WordPress 不断更新之后对 PHP 也有要求了,原来凑合着在 CentOS 上使用 Remi 更新的 PHP 也不好用了。
RHEL 7 到 RHEL 8 的升级有自动工具可用,但是基于 RHEL 的 CentOS 却没有支持。从网络上多个信息来源看,从 CentOS 7 升级到 CentOS 8 是不太可行的,而且不受官方支持。更何况对于处于生产状态的系统来说,还有很多后期的应用和配置更可能带来问题。既然如此,升级这一路径就不考虑了。鉴于近年来对 openSUSE 这一发行版越来越熟悉,而且 openSUSE 社区对系统无故障升级这件事情一直都很支持,我决定将系统改为 openSUSE Leap。
对于个人网站这样的小服务器来说,还是应该考虑向易于维护倾斜一下最好,在可靠和便捷之间取个更好的平衡点。这些年拿滚动发行版的 openSUSE Tumbleweed 作为个人电脑操作系统,体会到其实社区的测试还是很可靠的。不过 Tumbleweed 如果用来做服务器的话还是让人有些顾虑。相对平稳的 openSUSE Leap 就是个非常合适的选择了。考虑到桌面和家用服务器都是 openSUSE,就趁着这个时候把 Linode VPS 的操作系统给换成了 openSUSE Leap。同时也借此机会好好整理一下服务器上的配置文件并做备份。仔细考虑了一下,要完成的工作还是挺多的。
迁移路径¶
还是要利用云服务的便利性的。大致思路如下。
- 新建一个 Linode VPS,在上面安装和配置 openSUSE Leap 系统的网页服务器,同样基于 LAMP 搭配(Linux、Apache、MariaDB、PHP);
- 根据旧的系统上的配置提前将 LAMP 及网站程序配置好并测试服务器状态;
- 迁移网站文件和数据库,并测试网站工作状态;
- 利用 Linode 的交换 IP 工具完成新旧服务器的更替。
当然也可以制定详细的迁移方案和步骤,将步骤写成 bash 脚本来实现自动化执行以缩短迁移时间。准备好了之后,当前的主机关机,另开一个磁盘安装 openSUSE Leap 15,同时挂载现有的系统盘作为数据盘,使用 bash 脚本完成迁移。前后也不过就十来分钟的事情。这样操作比较考验细心程度,万一考虑不周或者脚本中有错误,那就难以估计耗时了。
新开一个 Linode VPS,安装和配置 openSUSE Leap¶
为了减轻后续维护工作的麻烦程度,尽量不大动系统默认配置。
首先,使用 Linode 官方提供的方案部署安装 openSUSE Leap 系统。¶
其次,修改 SSHD 服务器配置。¶
防火墙禁用默认的 22 端口,因为端口扫描和暴力破解的操作太多了,不胜其烦。
# firewall-cmd --remove-service=ssh --permanent
增加 sshd 监听端口(假设是 1234 端口),
# sed -i '/^#AddressFamily\sany/i Port 1234' /etc/ssh/sshd_config
防火墙允许新端口,
# firewall-cmd --zone=public --add-port=1234/tcp # firewall-cmd --zone=public --add-port=1234/tcp --permanent
禁止 root 用户登录,
# sed -i 's/PermitRootLogin\syes/#PermitRootLogin yes/g' /etc/ssh/sshd_config
关闭 X11Forwarding,
# sed -i 's/X11Forwarding\syes/#X11Forwarding yes/g' /etc/ssh/sshd_config
为服务器上的一般用户配置 SFTP Jail(这个暂时不展开了。
最后,SSH 最好还是使用证书登录。
第三,配置防火墙。¶
防火墙组合使用 iptables + ip6tables + firewalld。看任务,捡顺手的工具完成任务就行。
系统默认的策略是拒绝所有入站连接,所以我们需要开启需要的服务/端口,并对这些服务和端口进行监测以阻挡/减轻常见的攻击。太高级的咱也想不到,小服务器估计也没人看得上来霍霍。只要别把自己挡在 VPS 外面,剩下的都可以以后慢慢来。
参考之前的安全策略:
- https://cnzhx.net/blog/secure-my-vps/
- CentOS 上的 iptables 防火墙配置:https://cnzhx.net/blog/centos-redhat-iptables-firewall-configuration/
- CentOS 上的 iptables 防火墙配置:https://cnzhx.net/blog/centos-rhel-ipv6-ip6tables-firewall-configuration/
还可以考虑增加的防火墙项目有下面这些。
为自己需要的系统服务开启特定端口,特别是 SSH 开启防火墙端口,这事儿绝对不能忘记了。
为下面这些服务/连接设定新建连接速率限制,
- ssh 端口 1234
- web 服务端口 80/443
- phpmyadmin 也可以另外设定一个端口
检查并封禁常见的问题连接,
- drop_syn_flood
- drop_non_syn_new_tcp
- drop_ping_of_death
- drop_port_scan
- drop_spoofing
- drop_win_forwarding
对一些特定标记的连接直接丢弃,速率限制等等,可参考,
- https://linuxgazette.net/108/odonovan.html
- https://unix.stackexchange.com/questions/76271/iptables-recent-module
- https://serverfault.com/questions/682045/source-ip-rate-limiting-in-iptables-hashlimit-vs-recent
- https://superuser.com/questions/1071656/whats-the-difference-between-iptables-state-and-ctstate
还可以使用大名鼎鼎的 Fail2Ban。
第四,系统参数优化。¶
不知道是 Leap 还是 Linode 的定制,很多系统参数已经优化过了,不需要理会。
sysctl 的自定义配置可以放在 /etc/sysctl.d/local.conf
,管它有没有,摸一下就可以了,
# touch /etc/sysctl.d/local.conf
然后就是这些参数了(忘记从哪里借鉴过来的了),
# cat >> /etc/sysctl.d/local.conf <<\EOF #SYN sysctl -w net.ipv4.tcp_max_syn_backlog=2048 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_synack_retries=2 #Spoofing sysctl -w net.ipv4.conf.all.rp_filter=1 sysctl -w net.ipv4.conf.default.rp_filter=1 sysctl -w net.ipv4.conf.eth0.rp_filter=1 sysctl -w net.ipv4.conf.lo.rp_filter=1 EOF
安装并配置 Apache + MariaDB + PHP + PHP-FPM + phpMyAdmin¶
这个条目内容较多还是单独写到一篇博文里吧:在 openSUSE Leap 中安装配置 Apache + MariaDB + PHP + PHP-FPM 网页服务器 LAMP。
配置 DKIM 进行邮件认证以及加密服务器发出的电子邮件¶
为了保证迁移系统发行版不会对原来的服务造成影响,类似于 DKIM 这样的用于邮件认证的服务也需要迁移。好在不同的发行版上配置的方式几乎没差别。
可以参考之前的博文,
- https://cnzhx.net/blog/encrypt-outbound-mail-on-server/
- https://cnzhx.net/blog/implementation-of-dkim-on-centos-7/
- https://www.linuxbabe.com/redhat/set-up-opendkim-centos-8-rhel-8
- https://wiki.archlinux.org/index.php/OpenDKIM
配置完成后可以在这里 https://www.mail-tester.com/spf-dkim-check 检查配置的结果。
配置自动化任务¶
自动化系统和用户任务包括两类,systemd timer 或者系统 crontab 中实现的。crontab 给出的时间虽然不如 systemd timer,但是胜在操作简单。当然还需要准备好相应的 bash 脚本。
包括自动更新系统、自动更新软件、检查服务器日志等等。
迁移网站资源、数据库、Let’s Encrypt 配置等¶
对于文件类的资料,比如网站文件、导出的数据库文件等等,既可以通过 SSH 来传输(scp),也可以通过直接将老系统的虚拟硬盘挂到新系统上来实现(Linode VPS 允许这样的操作)。
Let’s Encrypt 证书的迁移前面已经写过了。
测试访问¶
到这里应该已经弄得差不多了,可以测试一下新服务器上的网站是否能够正常工作。当然不能去修改 DNS 解析。在本地修改 /etc/hosts
就可以达到目的。
# echo "${新IP地址} ${域名}" >> /etc/hosts
交换 IP¶
仍然不需要修改 DNS 解析。Linode 允许给位于同一个数据中心的两个 VPS 交换 IP,即时生效。
在 Linode 控制面板中,切换到这个虚拟主机的详情页面,然后 Network,然后下方的 IP Address 里面有个 IP Transfer。这就是交换 IP 的地方了。
还有个 IP Sharing 是用来将一个虚拟主机作为另一个主机的“备胎”的。也就是正在工作的主机出问题时候,就会由另一个主机接手。感觉更像是负载均衡的一种用法。
交换完成后注意检查一下虚拟主机中是否有跟 IP 地址有关的设置没有自动调整的。例如 检查 /etc/hosts
中的 IPv4 是否正确。
至于 IPv6 地址,可以等重启系统后再配置新的 IPv6。反正现阶段真正用 IPv6 的就没多少。
后记¶
依稀记得当时做这个迁移花了很多时间。先沙盘推演,写好 bash 脚本,然后一气呵成。其实呢,当时主要是觉得多开一个 Linode 虚拟主机太浪费。还是穷啊 :D
话说回来,这本来就是个挺复杂的活。那么多年了,整个系统并没有经常性的去维护。有时候时间一长就不记得做了些什么。还有个问题就是,有时候偶尔的心血来潮的改动并没有做记录。这就导致大动作之前需要仔细检查一下。所以说正规的服务器维护都应该有详尽的日志自有他的道理。©
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/switch-to-opensuse-leap-from-centos-on-linode-vps/>。转载请保留此信息及相应链接。
引用通告: 将 Let’s Encrypt 证书迁移到新系统 | 水景一页