VPSのサーバOSをCentOS8からUbuntuに移行

※記事内に商品プロモーションを含む場合があります

正確にはRockey Linux 8だけど、最近、レッドハットがソースコードの
公開をやめたので、今後どうなるかは分かりませんが、
もう振り回されたくないので、サーバOSをUbuntuに移行する事にしました。

無印のCentOS8も本来のサポート期限は2029年まででしたし、
CentOS Stream 8も2024年5月まで短縮され、一時的にRockyLinuxを使っていました。

CentOS Stream8 から、Rocky Linux 8 は再起動は必要ですが
比較的簡単に移行可能です。

前にCentOS7から8に移行した時は、約9年はOS移行しなくて良いと思っていましたが
わずか3年で、OS移行する事になりました。

今回は、別サーバへ移行

前回は、同じVPSにCentOS8をインストールしてサーバを構築していましたが
今回は別サーバに移行する事にしました。
【関連】CentOSの入れ替えを1日でやった時の手順をまとめてみた

ついでに、ストレージをHDDからSSDに変更しました。
月額料金も約1500円から1700円になりました。

前回は、各サーバサービスのバージョンがあまり変わらなかったので
ファイルと設定をコピーするだけでOKでした。
今回は、OS、ファイアウォールから違うので、別サーバ移行ついでに
SSD仕様のVPSへアップグレードしました。

再起動が爆速になったので、約200円の増額でも良いかなと思っています。

Ubuntu Linux 22.04.2

CentOSではrootでログインできましたが、Ubuntuでは別ユーザーでログイン後
sudo su -などでrootに切り替わる必要があります。

また、ファイアウォールもfirewalldからUFWになります。

初期設定では、SSHのポートが22、ユーザー名がubuntuと狙われやすいので
SSHのポートを50000番~65000番に変更し、ユーザー名も別のモノに変更し
ubuntuユーザーは削除しましょう。

ubuntuユーザーを削除する前に、新ユーザーでsudoが使えるか確認しましょう。
sudoが使えないと管理権限が無いので、aptによるアップデートも出来ませんし
設定の変更も出来ません。

その場合、シングルユーザーモードに入って追加するか
OSの再インストールを再インストールして再設定する必要があります。

UFW(ファイアウォール)

firewalldにはあった、ゾーンなどの概念も無いシンプルなファイアウォールです。

ポート開放したい場合は
sudo ufw allow 80
で80番ポート(v4/v6)の2つのルールが追加されポートが開放されます。

ルールを消したい時は、
sudo ufw status numbered
で番号付でリストを表示し、消したい番号を確認してから
sudo ufw delete [番号]
で消す事ができます。

ただ、このままだと、VPNのみポート開放し、ファイル共有が使える様にしたり
できません。

そこで、IPアドレスの範囲を指定することで
sudo ufw allow from 192.168.11.0/24 to 192.168.11.1 port 445 proto tcp
特定のネットワークのみポート開放できます。

また、初期設定ではさくらのVPS側にもパケットフィルター設定機能があるので
通信が出来ない場合は、パケットフィルター設定を確認し、無効化しましょう。

Apache

最近はApacheの設定ファイルも細かくなり、サイトを追加する時
例えばnew.eax.jpというサイトを追加する時。
/etc/apache2/sites-enabled/new.eax.jp.conf
を作って以下の内容を書き込みます
パスなどは修正が必要です。

##################################################
## new.eax.jp
<VirtualHost  *:443>
    ServerName new.eax.jp
    ServerAlias new.eax.jp
    DocumentRoot /www/new.eax.jp/
    Protocols h2 http/1.1
    TransferLog /data/log/new.eax.jp.log
    ErrorLog /data/log/new.eax.jp-err.log
    DirectoryIndex index.html index.php
    <ifModule mod_expires.c>
        ExpiresDefault "access plus 1 weeks"
        ExpiresByType text/html "access plus 600 seconds"
        ExpiresByType image/x-icon "access plus 14 days"
        ExpiresByType image/vnd.microsoft.icon "access plus 14 days"
        ExpiresByType image/jpeg "access plus 14 days"
        ExpiresByType image/png "access plus 14 days"
        ExpiresByType image/gif "access plus 14 days"
        ExpiresByType text/css "access plus 14 days"
        ExpiresByType application/xhtml+xml "access plus 600 seconds"
        ExpiresByType text/javascript "access plus 14 days"
        ExpiresByType text/js "access plus 14 days"
        ExpiresByType text/x-javascript "access plus 14 days"
        ExpiresByType application/javascript "access plus 14 days"
        ExpiresByType application/x-javascript "access plus 14 days"

    </ifModule>
    <IfModule mod_deflate.c>
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
        Header append Vary User-Agent env=!dont-vary
    </IfModule>


    #   SSL Engine Switch:
    #   Enable/Disable SSL for this virtual host.
    SSLEngine on
    SSLProtocol All -SSLv2 -SSLv3
    SSLHonorCipherOrder ON  ##追記

    SSLCertificateFile /etc/letsencrypt/live/new.eax.jp/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/new.eax.jp/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/new.eax.jp/chain.pem


    <Directory /data/www/new.eax.jp>
        Require all granted
        AllowOverride All
    </Directory>

    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/"

    </FilesMatch>
</VirtualHost>
## new.eax.jp
##################################################

Let’s encrypt

まず、certbotをインストールします。
apt -y install certbot

前サーバではスタンドアロンだったので、毎回Apacheを止めてから
更新する必要がありました。

今回は、DNSで認証を行います。

certbot certonly --manual -d new.eax.jp --preferred-challenges dns

このコマンドを実行すると、設定すべきTXTレコードが表示されるので
new.eax.jpの場合、_acme-challenge.new.eax.jpに表示された
TXTレコーダーを追加します。

PHP ・ Wordpress

今回の移行でPHPのバージョンが8になったので
不具合が発生しました。

今使っているSANGOというテーマと
Widgets of Posts by Same CategoriesとClean Optionsで問題が発生しました。

原因は、create_function()の廃止です。
PHP7では非推奨でまだ使えていましたが、PHP8では完全に削除されてしまったので
create_function()があると、エラーとなりWordPressが表示されなくなります。
【参考】PHP8, create_function()の廃止。無名関数を使おう!

テーマの方は、create_functionからfunctionへ書き換え動作する様になりました。

プラグインの方は、強制的に無効化しました。
【関連】ブログが真っ白!になってしまった時プラグインを無効化する方法

プラグインはcreate_functionを書き換えても別のエラーが直らず
廃止としました。

Widgets of Posts by Same Categoriesの代替にList category postsを使用しています。

phpはapacheをevent-MPMで動かしているので
php-fpmで動作しています。

Postfixメールサーバ

私のメールは、VPSのメールサーバで受信して、G-Mailに転送しています。

ただし、普通に転送しても迷惑メールとして
G-Mailで拒否されます。

この問題を解決するには、

  • SPFレコードの設定
  • envelope-FROM の書き換えが

が必要です。

SPFレコードはネームサーバーで、TXTレコードで設定します。
設定は、私のサーバではこの様になっています。

“v=spf1 +ip4:153.120.64.168 +ip6:2401:2500:102:2a06:153:120:64:168 include:eax.jp ~all”

このSPFレコードを設定する事で、記載のIPから発信されるメールは
なりすましでは無いと証明されます。

ただし、普通に転送すると、メールの送信元が送信元となっているため
なりすましと判断されてしまいます。

この問題を解決するのに、envelope-FROM の書き換えが必要です。
【関連】メール転送で、「迷惑メール」にならないために・・・envelope-FROM 書き換え

envelope-FROM の書き換えを行う事で、送信元が転送元に書き換えられ
IPアドレスが一致するのでG-Mailでも受信できる様になります。

今回は、Googleにアクセス出来なくなった時に備え、Devcotでローカルアカウント
も作りました。

最近、銀行などからの、ご利用制限のお知らせ(詐欺メール)がうざいので
/etc/postfix/main.cfでreject_unknown_reverse_client_hostnameを設定しました。

reject_unknown_reverse_client_hostnameを設定する事で接続元のIPから
ホスト名が逆引き出来ない場合に、メール拒否します。

詐欺メールの多くが、銀行のドメインを名乗っていながら
接続元IPのホスト名が無い、unknownでした。

VPN

FTPやローカルアカウントメールはVPNからのみ
アクセスできる様にしています。

FTPやメールの受信って、私しかアクセスしないので
VPN限定にして、アクセスを制限しています。

VPNはxl2tpd、strongswanを使用して構築します。
IPsec-VPNの方がセキュリティ性が良いですが、証明書を作る必要があります。

その証明書には有効期限があり、有効期限が切れるとサーバでの
再設定が必要になるので、面倒に感じ、L2TP/IPsecを使用しています。

VPNで設定している、事前共有鍵(PSK)の長さはセキュリティ強度に直結しているので
英数字大文字小文字、数字と、記号(@%-#のみ)で作った60文字の鍵を使用しています。

あまり長すぎても、機器によっては対応していない可能性もあるので
60文字ぐらいが良いと思います。

Nat traversalの設定をしていて、テスト時は良かったのですが
同一WifiでパソコンとiPhoneで同時接続する時に、

[IKE] unable to reauthenticate in CHILD_SA REKEYING state, delaying for 14s

xl2tpdのログに、
xl2tpd[81723]: Can not find tunnel 81723 (refhim=0)
xl2tpd[81723]: network_thread: unable to find call or tunnel to handle packet. call = 81723, tunnel = 81723 Dumping.

と出て接続が切れる事があるので、対策を考えてましたが
Wireguardへ移行しました。
【関連】WireguardでVPNを構築し443ポートをhttpsと共存

あとがき

CentOS8時代では、1016日連続稼働していたので
さくらのVPSと、CentOS8は安定度が高いと感じました。

uptimeでサーバの稼働日数が、1016日(2年40週2日)と表示されている

2029年までは安泰と思っていた、CentOS8でしたがと突如
2021年末までになり、仕方なく、CentOS8 Streamに移行しました。

CentOS8 Streamもサポート期限(EOL)が2024年5月、
CentOS9 StreamでさえもEOLが、2027年5月と、3年しかありません。

なので、Rockey Linux8に移行しましたが、RHELソースコード非公開化
などがあったので、自宅サーバ(ラズパイ4)でも使っている、Ubuntu
に移行しました。

ちなみに、2023年8月時点でこのサーバが稼働しているUbuntu 22.04.2 LTSは
スタンダードサポート期間が、2027年4月、EOLが2032年4月です。

リリースから約10年使えるので、CentOS7の頃と同じぐらいのサポート期間です。