FreeBSDのパケットフィルター設定

FreeBSDにはパケットフィルター(ファイアウォール)機能があります。既にさくらのVPSでパケットフィルターを設定していますが、FreeBSDにも設定することでより細かい制御を行うことができます。

注意FreeBSDのハンドブックではファイアウォール(Firewalls)となっていますが、ここではさくらのVPSの設定と対比するため、パケットフィルターという表記に統一しています。

接続先ポート番号と接続元ポート番号

一般的にパケットフィルターでは、出ていく(outbount)通信は遮断せず、入ってくる(inbound)通信をブロックするように設定します。しかし、TCP/UDPの通信では接続先のポート番号と同様に、接続元のポート番号があります。例えばHTTPの通信であれば、クライアントから見るとサーバへの接続先ポート番号は80ですが、サーバがそのレスポンスをクライアントに返すための接続元ポート番号があります。

さくらのVPSから外のサーバへHTTPで通信する(パッケージの更新を行う)と、サーバの接続元ポート番号へのinbound通信が発生します。つまり、この通信を許可するように設定しないと、サーバから外へHTTP通信ができなくなってしまいます。しかし、HTTPの接続先ポート80と違って接続元ポートは不定なので事前にポート番号を指定できないのです。

ステートレスとステートフル

パケットフィルターにはステートレスステートフルの2種類があります。

ステートレスのパケットフィルターは、サーバからの通信に対するレスポンスの通信で使われるであろうこういった一時的なポートをあらかじめ許可しておく必要があります。その代わり、ステートレスのパケットフィルターはシンプルで負荷が軽くなります。

ステートフルのパケットフィルターは、許可された通信に対するレスポンスの通信も許可することができます。上記の例で言えば、サーバからHTTPで通信した際のレスポンスを、そのレスポンスを受信している間だけは許可するようになります。その通信が終わると、許可していた接続元ポートにアクセスしてもブロックされます。ステートフルではこのように接続の状態(ステート)を管理する必要があるため、パケットフィルターの処理負荷が後述のステートレスに比べて高くなります。

さくらのVPSのパケットフィルター

さくらのVPSのパケットフィルターはステートレスです。そのため、あらかじめ許可されていて変更できないプロトコルやポートがあります。詳細は注意事項で確認できます。

TCP/UDPの通信の接続元ポート(エフェメラルポートやダイナミックポート、動的ポートといいます)はIANAがポート49152~65535を推奨しています。FreeBSDやWindowsはこの範囲を使います。一方でLinuxはポート32768~61000を使います。なお、いずれもOSの設定で変更は可能です。これが、さくらのVPSのパケットフィルターはデフォルトでTCP/UDPともポート32768〜65535を許可している理由です。

したがって、さくらのVPSでパケットフィルターを有効にしていてもTCP/UDPのポート32768〜65535への通信は常にオープンであるということです。この範囲のポートへの攻撃をブロックできるようにするのが、さくらのVPSのパケットフィルターに加えて、FreeBSDであえてパケットフィルターを設定する理由です。

FreeBSDのパケットフィルター

FreeBSDには以下のパケットフィルターが用意されています。昔はパケットフィルターを有効にするにはそれぞれの機能をkernelで有効にして作成し直す必要がありましたが、今は好きなものをいつでも有効にできます。

ipfw

ipfwはFreeBSDに古くからあるパケットフィルターで、インターネット上にもFreeBSDのパケットフィルターとしてドキュメントが豊富にあります。ipfwコマンドでルールを1つずつ設定できるのが特徴です。複雑なルールを用いずいくつかのルールしか使わない場合や、シェルスクリプトでルールを生成してそのまま実行する場合には便利です。

ipf(ipfilter)

ipfはFreeBSD以外にNetBSDやOpenBSD、Solarisなどでも使えるパケットフィルターです。そのため、SolarisやFreeBSD以外の*BSDで設定などを含めてインターネット上にはノウハウや例が豊富です。逆にFreeBSDだけの設定を探そうとするとipfwよりも少ないかもしれません。また、ipfはルールファイルを作成して、ipfコマンドでルールファイルを指定して設定します。そのため、ルールを変更する時は一度ルールを削除してルールファイルを読み込み直すことになります。決まったルールを異なる環境で同じように設定する際は便利です。

pf

pfはOpenBSDがipfを参考に開発したパケットフィルターです。ipfと同様にルールファイルを作成して、pfctlコマンドでそのルールファイルを指定することで設定します。しかし、ルールファイルの書式はipfと似ているようで異なります。そのため、ipfに慣れている人であっても戸惑うことが多いと思います。

また、pfはOpenBSDが発祥のパケットフィルターであることもあり、ノウハウや例を見付けるのが難しいのが実情です。ドキュメントもFreeBSDのハンドブックでもOpenBSDを参照するように書かれていたりと、始めて触ろうとするとハードルが高く感じられます。しかし、セキュリティ至上主義のOpenBSDが開発したパケットフィルターですので、堅牢性と安定性は他のパケットフィルターに勝るとも劣りません。ここではpfの布教を兼ねて、pfの設定の仕方を紹介します。

pfctlコマンド

OSのパケットフィルターは設定を間違えると最悪の場合はsshでログインできなくなってしまう場合があります。そのため、いざという時に備えて最低限の復旧方法を覚えておいた方がよいです。

  • pfを有効化
% sudo pfctl -e
  • pfを無効化
% sudo pfctl -d
  • pfルールを削除して再読み込み
% sudo pfctl -F all -f /etc/pf.conf
  • pfのルール表示
% sudo pfctl -s rules
  • pfルールのチェック(設定はしない)
% sudo pfctl -vnf /etc/pf.conf

また、pfルールを設定する際には意図的にsleepを入れたコマンドを一行で実行して、もしも入力がなかった場合にはpfルールを削除するようなこともできます。以下の例では、pfルールを設定した後で5秒待ち、その間にCtrl-Cを押せば中断できます。もしもpfルールで通信がブロックされてターミナルの入力を受け付けなくなってしまった場合には、そのままsleepが終了してpfルールがクリアされるという仕組みです。

% sudo pfctl -F all -f /etc/pf.conf; echo Ctrl-C to break; sleep 5; sudo pfctl -F all

pfの設定ファイル

設定の前提条件として以下を想定しています。

  • インタフェースは1つ(グローバルIP)だけである
  • Inboundは SSH/HTTP/HTTPS および、Outboundに対する戻り(ステートフル)を許可する
  • Outboundは全て許可する

pfの設定は /etc/pf.conf に記述しますが、デフォルトのファイルが存在しません。したがって新規に作ることが必要です。/usr/share/examples/pf/pf.conf が用意されているので、これをサンプルとして修正するのがおすすめです。まず、それぞれの項目の内容を説明します。

#       $FreeBSD$
#       $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
#
# See pf.conf(5) and /usr/share/examples/pf for syntax and examples.
# Remember to set gateway_enable="YES" and/or ipv6_gateway_enable="YES"
# in /etc/rc.conf if packets are to be forwarded between interfaces.

#ext_if="ext0"   # 外向けのインタフェース名。さくらのVPSではvtnet0となっている。
#int_if="int0"   # 内向けのインタフェース名。さくらのVPSではvtnet1となっているが、今回は不要。

#table <spamd-white> persist  # ルールを再読み込みしないで使えるテーブル機能。今回は不要。

#set skip on lo  # ループバックへの適用をスキップする。

#scrub in        # IPパケットのサニタイズを行う。

#nat-anchor "ftp-proxy/*"  # FreeBSDをNATルータとする例。不要。
#rdr-anchor "ftp-proxy/*"  # 同上。不要。
#nat on $ext_if inet from !($ext_if) -> ($ext_if:0)  # 同上。不要。
#rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021  # 同上。不要。
#no rdr on $ext_if proto tcp from <spamd-white> to any port smtp   # SMTPサーバの設定。不要。
#rdr pass on $ext_if proto tcp from any to any port smtp \         # 同上。不要。
#       -> 127.0.0.1 port spamd                                    # 同上。不要。

#anchor "ftp-proxy/*"  # FreeBSDをNATルータとする例。不要。
#block in              # inboundをデフォルトblockする。
#pass out              # outboundをデフォルトpassする。

#pass quick on $int_if no state      # 内向けインタフェースからの接続をステートレスで許可。今回は不要。
#antispoof quick for { lo $int_if }  # ループバックと内向けインタフェースに対してIP偽装パケットをブロック。

#pass in on $ext_if proto tcp to ($ext_if) port ssh             # 外向けインタフェースへのsshを許可。
#pass in log on $ext_if proto tcp to ($ext_if) port smtp        # SMTPサーバの設定。不要。
#pass out log on $ext_if proto tcp from ($ext_if) to port smtp  # SMTPサーバの設定。不要。
#pass in on $ext_if inet proto icmp from any to ($ext_if) icmp-type { unreach, redir, timex }  # 外向けインタフェースへの一部のICMPを許可。

上記を元に環境に合わせた /etc/pf.conf を作成します。

#       $FreeBSD$
#       $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
#
# See pf.conf(5) and /usr/share/examples/pf for syntax and examples.
# Remember to set gateway_enable="YES" and/or ipv6_gateway_enable="YES"
# in /etc/rc.conf if packets are to be forwarded between interfaces.

ext_if="vtnet0"   # 外向けのインタフェース名。さくらのVPSではvtnet0となっている。

tcp_services="{ 22 80 443 }"      # 許可するSSH/HTTP/HTTPSのポート番号を定義。
icmp_types="{ echoreq unreach redir timex }"  # 許可するICMPを定義。

set block-policy drop     # blockしたパケットは応答を返さずにdropする。
set loginterface $ext_if  # 外向けインタフェースのロギングを有効にする。

set skip on lo  # ループバックへの適用をスキップする。

scrub in        # IPパケットのサニタイズを行う。

block in log    # inboundをデフォルトblockしてロギングする。
pass out        # outboundをデフォルトpassする。

antispoof quick for { lo }  # ループバックに対してIP偽装パケットをブロックする。

pass in on $ext_if proto tcp to ($ext_if) port $tcp_services  # 外向けインタフェースの特定のポートを許可。
pass in on $ext_if inet proto icmp from any to ($ext_if) icmp-type $icmp_types  # 外向けインタフェースへの特定のICMPを許可。

pass in on $ext_if inet6 proto udp from any to ff02::66 port 2029  # IPv6のARPを許可。
pass in on $ext_if inet6 proto icmp6 all                           # IPv6のICMPを許可。
pass in on $ext_if inet6 proto udp from fe80::/10 port = dhcpv6-client to ff02::/16 port = dhcpv6-server  # IPv6のDHCPv6を許可。

前提に加えて2つ追加しています。

さくらのVPSではコントロールパネルよりサーバー監視を行うことができます。特定のサービスを監視するのでなければpingを選択するのが無難なので、ICMPの echoreq (いわゆるping)を許可しています。

また、さくらのVPSではIPv6が有効になっていますので、IPv6はルーティングに必要なものを追加で許可しています。SSH/HTTP/HTTPSは inetinet6 を指定していないので、共通で有効になります。

更に詳しく設定したい場合はOpenBSDのPFのドキュメントを参照してください。

pfの設定

最後にpfを有効にします。既に書いている通り、pfは設定を間違えるとログイン不能になることがあります。そのため、記述には最新の注意を払いましょう。

いきなり /etc/rc.conf に反映せずに、まずはコマンドで有効化することをお薦めします。もしも問題があってログインできなくなった場合は、コントロールパネルからVPSを再起動することでpfが有効になっていない状態で起動し直すことができます。

% sudo pfctl -e
% sudo pfctl -vnf /etc/pf.conf
% sudo pfctl -F all -f /etc/pf.conf
% sudo pfctl -s rules

これで問題なくsshでログインしたり、Webサーバに対してアクセスしたりできることを確認できたら、常に有効になるように /etc/rc.conf に以下の記述を追加します。

pf_enable="YES"
pflog_enable="YES"

sysrcコマンドでも設定できます。

% sudo sysrc pf_enable=YES
% sudo sysrc pflog_enable=YES

pfステートの確認

pfのステートフルな通信の状態を確認するにはpfctlコマンドを使います。

% sudo pfctl -s states

また、portsにはtopコマンドのようにリアルタイムでステートを見ることができるpftopというツールがあります。pfctlコマンドよりも直感的に分かりやすくてお薦めです。

% sudo pkg add pftop
% sudo pftop

参考

ntpdの設定

サーバーの設定をする上でsshdの次に大切なものが時刻同期です。

時刻同期の必要性

時刻同期はセキュリティ上で必要なことです。

インターネットは機器が接続されている世界です。攻撃を受けた際、あるいは、踏み台などにされた際にはそれらの痕跡が各機器にログなどとして残ります。実際に事件が起きた際にはそういったログの提出を求められることもあります。その時に時刻が同期されていないとログを辿ることが難しくなってしまいます。

そういった時の備えとして、常にサーバーの時刻は同期しておくようにしましょう。

NTP

一昔前までは正確に時刻を同期する方法が確立されておらず、それぞれの機器はそれぞれで時間を設定していたものです。しかし、今では据置き型の時計は電波時計、携帯電話やスマホはGPSで時刻を同期するようになりました。

そんな中でサーバーには古くから時刻を同期するためのNTP(Network Time Protocol)があります。正確な時刻を提供するサーバーをNTPサーバー。それに合わせて時刻を同期するクライアントをNTPクライアントと呼びます。

NTPサーバーは原子時計や水晶発振子といった正確に時刻を知ることができるデバイスと同期してます。こういったサーバーを特にstratum 1と呼びます(stratum 0は原子時計や水晶発振子などです)。また、DNSにおけるキャッシュサーバーのように、そういったデバイスと同期したNTPサーバーと同期して、ネットワーク内でリファレンスとなる時刻を提供するサーバも存在します。こちらはstratum 2、3、…となります。

さて、VPSでは基本的にはNTPクライアントだけがあればいいのですが、定期的にNTPクライアントを使って時刻を同期するよりも、自分だけが参照できるNTPサーバーを立ち上げて、上位のNTPサーバーにぶら下げる方が一般的です。

NTPサーバー

FreeBSDで使うことができるNTPサーバーには以下があります。

  • ntpd
  • OpenNTPD
  • chrony

OpenNTPDはOpenBSDのプロジェクトが開発したNTPサーバーです。前に紹介したportsから入れることができます。

chronyはLinuxでよく使われているNTPサーバーです。

どれを入れてもいいのですが、FreeBSDにはntpdが標準で入っていますので今回はこれを使うことにします。

ntpdの設定

実はさくらのVPSでFreeBSDサーバーを作成した場合は、既にntpdの設定が行われています(自分の場合はそうでした)。

具体的には /etc/rc.conf に以下の記述があれば有効になっています。

ntpd_enable="YES"

sysrcコマンドでも確認できます。

% sysrc -e ntpd_enable
ntpd_enable="YES"

続いて ntp.conf の中身を確認しましょう。

(省略)
#
# The option `iburst' is used for faster initial synchronization.
#
server ntp1.sakura.ad.jp iburst
(省略)

この server の部分に上位となるNTPサーバーを指定します。日本で公開されているNTPサーバーには以下のようなものがあります。

これ以外にも各VPSサービスやプロバイダーが公開している場合がありますので、サーバーからネットワーク的に近いものを選びましょう。今回はさくらインターネットが公開しているNTPサーバーを指定しました。

ntpdの起動

FreeBSDにおけるサービス(デーモン)の起動スクリプトは /etc/rc.d/XXXX (OS標準の場合)か /usr/local/etc/rc.d/XXXX (portsから入れた場合)にあります。

Linuxでいうところの /etc/init.d に近いと思います。なおLinuxの systemctl に相当するコマンドは service になります。

今回は ntpd を起動するので以下のコマンドを実行します。

% sudo /etc/rc.d/ntpd start
Starting ntpd.

service を使う場合は以下のコマンドになります。

% sudo service ntpd start
Starting ntpd.

また、同期しているかどうかは ntpq コマンドで確認できます。

% ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*2001:e42:0:1:21 43.162.219.88    2 u  344 1024  377   16.745   -0.121   0.183

VPSの場合はないとは思いますが、あまりにサーバーの時刻がNTPサーバーの時刻と離れていて ntpd で同期できない場合があります。そういう場合は ntpdate コマンドを使って、一度手動で時刻を同期してみてください。なお、このコマンドは既に ntpd が起動しているとエラーになります。一度止めてから実行してください。

% sudo /etc/rc.d/ntpd stop
% ntpdate ntp1.sakura.ad.jp
% sudo /etc/rc.d/ntpd start

参考

sshの初期設定

サーバーにログインする際に使うsshに関するお薦めの設定を説明します。

  • rootでログインしない
  • パスワードでログインしない

Linuxに限らずFreeBSDでも管理者はrootです。しかし、rootで直接ログインするのは避けるようにします。AWSやGCPではデフォルトでrootユーザーによるログインは禁止されています。なぜそうするのかというと、一般ユーザーでログインするようにしていれば、万が一セッションを乗っ取られてもサーバーのコントロールが奪われることにはならないからです。

まず最初に作業用のユーザーを作成しましょう。さくらのVPSでFreeBSDをインストールした際にVNCコンソールを使ったと思います。こちらからログインして作業してもいいでしょう。

ユーザーを作成する

adduserコマンドで対話的に作成します。もしもインストーラーでユーザーを作成済であれば、飛ばして構いません。グループにwheel operator networkを追加しているのは理由があります。

  • wheel: suを使うために必要
  • operator: 一般ユーザーでshutdownをするために必要
  • network: 一般ユーザーでネットワーク関連のコマンドを使うのに必要
# adduser
Username: ユーザー名
Full name:(空欄でいい)
Uid (Leave empty for default):
Login group [ユーザー名]:
Login group is ユーザー名. Invite ユーザー名 into other groups? []: wheel operator network(この3つを加えておくといい)
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: tcsh(※Linuxと違い、FreeBSDでbashはデフォルトではありません)
Home directory [/home/ユーザー名]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: パスワードを入力
Enter password again: パスワードを入力
Lock out the account after creation? [no]:
Username   : ユーザー名
Password   : ****
Full Name  : 
Uid        : 1001
Class      :
Groups     : ユーザー名 wheel operator network
Home       : /home/ユーザー名
Shell      : /bin/tcsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (ユーザー名) to the user database.
Add another user? (yes/no): no
Goodbye!
#

bashが使いたい場合はpkgコマンドでbashを追加してください。

# pkg install bash
# echo /usr/local/bin/bash >> /etc/shells
# chsh /usr/local/bin/bash ユーザー名

ssh公開鍵を登録する

パスワードはソーシャルエンジニアリングなどで盗まれるリスクがあります。ssh公開鍵によるログインを使うようにしましょう。

作成したユーザーにパスワードでログインできることを確認したら、次はssh公開鍵を作りましょう。これはFreeBSDサーバーではなく、手元の端末側で行います。既に公開鍵がある場合はそれを使って構いません。

% ssh-keygen -b 384 -t ecdsa

次にssh公開鍵をFreeBSDサーバーに設定します。

% mkdir .ssh
% cat > .ssh/authorized_keys
(ここにssh公開鍵 id_ecdsa.pub の中身をコピペする)
Ctrl-D
% chmod -R go-rwx .ssh

公開鍵でログインできればOKです。

sudoを設定する

一般的にrootになるにはsuコマンドを使いますが、suの問題点はrootのパスワードが必要であることです。先に書いたようにrootのパスワードは使わないに越したことはありません。

そこでsudoを使います。sudosuのように特権(root権限)を得ることができますが、違いはそのユーザーのパスワードを使うという点です。sudoはデフォルトではインストールされていないので、pkgコマンドを使ってインストールします。最初のインストールはrootでないとできないので、rootでログインするかsuを使いましょう。

# pkg install sudo

このままでは作成したユーザーはsudoを使えません。sudoで特権が得られるように設定します。FreeBSDではports(pkgコマンド等でインストールしたパッケージ)は/usr/localにインストールされます。そのため、設定ファイルも/etc/ではなく/usr/local/etcになります。

# cd /usr/local/etc/sudoers.d
# cat > ユーザー名
ユーザー名 ALL=(ALL) ALL
Ctrl-D
# chmod 440 ユーザー名

これで作成したユーザーでsudoできるようになります。whoamiを実行するとrootになっているのが分かります。

% whoami
ユーザー名
% sudo whoami
root

rootログインを無効にする

FreeBSDのデフォルトではrootでsshログインできないようになっています。さくらのVPSでインストールしたFreeBSDではrootでのsshログインが許可されている場合があります。

/etc/ssh/sshd_configを確認しましょう。下記のようにPermitRootLoginがコメントアウトされていれば大丈夫です。yesになっていた場合はコメントアウトしてください。

(省略)
# Authentication:

#LoginGraceTime 2m
#PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
(省略)

ここまでで十分ではありますが、更にセキュリティを強化したい方向けの設定を書いておきます。

sshのポートを変更する

sshはデフォルトではポート22を使います。これは共通であるがために、sshのログインを試みようとする攻撃の対象となりがちです。

パケットフィルターを設定している場合にはポート22へのアクセスを制限しているので必要ないかもしれませんが、「全て許可」にしている場合には別のポートに変えておくことで攻撃の対象にされにくくすることができます。

sshのポート変更は/etc/ssh/sshd_configでもできますが、私は/etc/rc.confによる変更をお薦めします。以下はポート22222に変更する場合です。

% sudo sysrc sshd_flags='-p 22222'
% sudo /etc/rc.d/sshd restart

ところで、/etc/rc.confを編集するためのsysrcなんてコマンドがあるんですね。今回この記事を書くにあたって調べて初めて知りました。(どうやらFreeBSD 9.2で追加されたらしい)

私のような古参はvi/etc/rc.confを編集することしか知らないので、コマンドで編集できると知って新鮮な気持ちになりました。ちなみにviが苦手な人はeeというエディタ(Linuxのnanoみたいなやつ)もあるので、使い易い方をお使いください。

参考

パケットフィルターを設定

さくらのVPSでサーバーを新規作成したら、まずやってもらいたいことがあります。それはパケットフィルターを設定することです。

なぜパケットフィルターが必要か?

インターネット上に作成したサーバーは常に悪意のある第三者から攻撃される危険に晒されています。インストール直後のFreeBSDは、基本的にssh以外のサービスは外部に公開していないとはいえ、ネットワーク上で接続できるという事実は変わりません。

悪意のある第三者は攻撃して乗っ取ることができるターゲットを常に探していますので、たとえIPアドレスやFQDNを公開していなかったとしても攻撃される可能性はあります。その際に、攻撃の対象となるサービスを可能な限り減らしておくことが重要です。

パケットフィルターの設定

一般的なクラウドサービスでは「セキュリティグループ」が導入されています(AzureやAWSなど)。デフォルト拒否、指定したものだけを許可するルールが一般的です。さくらのVPSのパケットフィルターも有効にするとデフォルトは拒否になります(※)。そこで必要なサービスだけを許可に加えていきましょう。

(※厳密にはこちらに記載のあるように、いくつかのポートはデフォルトで許可になっています。)

sshの接続を許可する

まずはsshを追加しましょう。その際にsshの接続元のIPアドレスは可能な限り制限することが望ましいです。そこで「全てのポート」ではなく、自分がログインする接続元のIPアドレスだけの「一部許可」にして限定することをお勧めします。

「接続可能ポートを追加」で一部IPアドレスのみ許可する

なお、パケットフィルターでは全て許可にしておいて、サーバー側(つまりFreeBSD)で許可するIPアドレスを制限する方法もあります。しかし、こうするとIPアドレスが変わったり、設定を間違えた場合にFreeBSDにログインできなくなるリスクが生じます。

さくらのVPSのコントロールパネルは、どんなIPアドレスからでもアクセスできます。そこで、サーバー側ではなくパケットフィルター側でIPアドレスを制限することで、もしも接続元IPアドレスが変わってしまった場合でも変更できるようにしておくのです。

他のサービスの接続を許可する

今後、FreeBSDのサーバーでサービスを公開する(例えばWebとか)際には順次パケットフィルターに接続可能ポートを追加していくことになります。

ただ、現時点では特にサービスは公開していないので追加はしないでおきましょう。

次はいよいよFreeBSDサーバー側での設定を始めます。

参考

FreeBSDをインストール

実は「さくらのVPS」で最初から選べるOS(標準OS)にFreeBSDはありません。そのため、「OS再インストール」によってFreeBSDをインストールすることになります。具体的には以下の手順になります。

  1. コントロールパネルの「新規作成」から適当なOS(※)を選んでサーバーを作成する。
    ※とりあえずCentOS 7あたりを選ぶとよいです。
  2. 「OS再インストール」から「カスタムOS」を選択して「FreeBSD 12」か「FreeBSD 13」を選ぶ。
  3. さくらのVPSマニュアルに従ってインストールを行う。
    マニュアルの画面はFreeBSD 11ですが、FreeBSD 12/FreeBSD 13でも同じなので安心です。

以上で終わりです。実はさくらのVPSマニュアルがかなり丁寧に解説しているので、この画面の通りの操作でほぼ問題ありません。強いて言うならばセットアップで作業用のユーザを作っておいた方がいいですが、後から作っても問題ありません。

管理ユーザ(root)のパスワードは覚えておく

最初に選ぶ「標準OS」で設定した管理ユーザ(root)のパスワードは一応覚えておいてください。FreeBSDのrootパスワードはインストーラーの中で再設定するのですが、実はコントロールパネルにIPアドレスでログインする際には最初の「標準OS」の時に設定したパスワードを使います。もしも忘れた場合はコントロールパネルで再設定できますのでご安心を。

FreeBSDのバージョンリリース

2022/3/10現在のFreeBSDの各バージョンリリースとEOL(End of Life)は以下です。

ブランチ/リリースリリース日EOL日
stable/132026/1/31
13.1-RELEASE(2022/4予定)(13.2-RELEASEの3ヶ月後)
13.0-RELEASE2021/4/1313.1-RELEASEの3ヶ月後
stable/122024/6/30
12.3-RELEASE2021/12/712.4-RELEASEの3ヶ月後
12.2-RELEASE2020/10/272022/3/31
https://www.freebsd.org/security/#sup

FreeBSDも他のオープンソースソフトウェアと同じく「メジャー.マイナー」というバージョンナンバリングを採用しています。特にメジャーバージョンを取って12系とか13系と言います。番号が新しい方(13)が最新版のメジャーバージョン系列で、もう片方(12)が安定版のメジャーバージョン系列になります。CentOSにおける7系と8系(8系はなくなってしまいましたが…)の関係に近いと考えてもらうとよいです。

FreeBSD 12にするか13にするか

安定版系列(12系)は先にサポート終了になるので、基本的には最新版系列(13系)を選んだ方がよいです。しかし、FreeBSDには最初の最新版メジャーバージョン(つまりX.0)は避けた方がよい、というジンクスもあったりします。最近はないですが、私は昔は最初のリリースで地雷を踏んだことがよくありました。現時点では13系のリリースは13.0なので個人的には避けたいところです。13.1がリリースされれば、13.1を選んで問題ないでしょう。12系を選ぶ場合は最新の12.3を選べば問題ありません。新規インストールの場合に古いリリースを選ぶ必要はありません。

FreeBSDのメジャーバージョンアップ

ちなみに、FreeBSDでは12系から13系に上げるメジャーバージョンアップ作業(※)はそれほど大変ではありません。そのため今は12系を選んでおいて、後でサポート終了が近くなってから13系に上げても問題ありません。

(※12→13が大変ではないだけで、バージョン間によっては大きな変更があって大変になる場合があります。コンパイラがgccからclangに変わった時やia32からamd64に変わった時はかなり大変でした。)

既に廃止してしまいましたが、旧 www.magisystem.net の自宅サーバは 4.4-RELEASEから12.3-RELEASEまで実に8回ものメジャーバージョンアップを乗り越えてきました。初めてだと心配なこともありますが、最近のFreeBSDにはfreebsd-upgradeコマンドがあって慣れると簡単にできます。また、メジャーアップグレードしやすいように環境を保つことでも作業負荷を低減できます。

このあたりのノウハウも後々書いていこうと思います。

参考