ConoHa の VPS に Red Hat Enterprise Linux 9 をインストールして、ウェブサーバーやメールサーバーの構築をしてきました。

今回はこのサーバーを IPv6 に対応させていきます。
ネットワークインターフェイス(eth0)の設定変更
ConoHa の公式サイトに手順が載っていますので、以下を参考にしました。

ただし、IPv6 の複数アドレスは必要性を感じなかったので、IPV6ADDR_SECONDARIES を設定しませんでした。
また、VPS 1 台の単独運用なので IPV6FORWARDING も設定しませんでした。
IPV6_AUTOCONF="no" #yesをnoへ変更
#下記を追記
IPV6ADDR=IPv6アドレス
IPV6_DEFAULTGW=コントロールパネルで確認できる「ゲートウェイ」のアドレスネットワークマネージャーをリスタートして反映させます。
systemctl restart NetworkManagerDNS の編集
ConoHa の管理画面から DNS を開き、AAAA レコードを 2 つ追加します。
AAAA レコード(追加)
ドメインのレコードを設定する。
- タイプ:AAAA
- 名称:@
- 値:IPv6 アドレス
サブドメインに対してワイルドカードでレコードを設定する。
- タイプ:AAAA
- 名称:*
- 値:IPv6 アドレス
SPF レコード(修正)
既存の SPF レコードに対して、IPv6 アドレスも追加する。
- タイプ:TXT
- 名称:@
- 値:v=spf1 +ip4:(IPv4 アドレス) +ip6:(IPv6 アドレス) -all
PTR レコード
続いて、逆引きホスト名の設定も入れていきます。
ConoHa 管理画面からサーバーを表示し、IPv6 の PTR レコードを編集します。
サーバーに割り振った IPv6 アドレスの逆引きホスト名を指定して保存します。

ファイアウォールの設定
以前に設定した nftables をベースとして設定を変更していきます。
管理者用や日本国内の IP アドレスリストの作成方法については以前の記事を参照してください。

nftables の設定ファイルで、ip protocol(IPv4 のルール)に対応した ip6 nexthdr(IPv6 のルール)を追加していきます。
# 現在のルールセットを消去
flush ruleset
# 管理者用IPv4アドレスリストを読み込む
include "/etc/nftables/list/admin"
# 日本国内IPv4アドレスリストを読み込む
include "/etc/nftables/list/domestic"
table inet filter {
set admin {
type ipv4_addr
elements = $admin
}
set domestic {
type ipv4_addr
flags interval
elements = $domestic
}
chain input {
# 入力チェイン:明示的に許可されないパケットは全て破棄する(policy drop)
type filter hook input priority 0; policy drop;
# ループバックインターフェイスのトラフィックは全て許可する
# (IPv4/IPv6 両方の lo を先に通すため最上段に置く)
iif lo accept
# IPv6 を破棄する場合は以下の行を有効化する(下記 ICMPv6 関連ルールは事実上無効化される)
#meta nfproto ipv6 drop
# Neighbor Discovery を許可する
ip6 nexthdr icmpv6 icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
# ICMPv6 エラーメッセージ(PMTUD などに必須)
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem } accept
# MLD(マルチキャストリスナー検出)
ip6 nexthdr icmpv6 icmpv6 type { mld-listener-query, mld-listener-report, mld-listener-done, mld2-listener-report } accept
# Ping floods 対策(10/sec を超えた echo-request は drop、それ以下は accept)
# (ct state established,related より前に置かないと、ping flood の 2発目以降が ESTABLISHED 扱いで rate limit を素通りする)
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second drop
ip6 nexthdr icmpv6 icmpv6 type echo-request accept
ip protocol icmp icmp type echo-request limit rate over 10/second drop
ip protocol icmp icmp type echo-request accept
# 関連・確立済みトラフィックは許可する
ct state established,related accept
# 不正なトラフィックは全て破棄する
ct state invalid drop
# 新規の UDP パケットは UDP チェインで判定する
meta l4proto udp ct state new jump UDP
# 新規の TCP 接続開始(SYN のみ立ったパケット)を TCP チェインで判定する
meta l4proto tcp tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
# 他のルールによって処理されなかったトラフィックは全て拒否する
meta l4proto udp reject
meta l4proto tcp reject with tcp reset
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain TCP {
# 管理者にのみ解放
# ssh, OLS 管理画面
tcp dport { 22, 7080 } ip saddr @admin accept
# 日本国内にのみ開放
# SMTPS, IMAPS
tcp dport { 465, 993 } ip saddr @domestic accept
# 全開放
# SMTP, HTTP, HTTPS
tcp dport { 25, 80, 443 } accept
}
chain UDP {
# 全開放
# http/3
udp dport { 443 } accept
}
}参考サイトにしっかり書いてあったのですが、Neighbour Discovery を許可する設定を入れないと IPv6 が切断されてしまう現象でハマりましたのでご注意ください。
※上記の設定だと MUA(Thunderbird など)が IPv4 で日本国内からしか到達できない状態ですが、アクセスする環境が IPv6 に対応していないため割り切って使っています。必ず自分の環境にあった設定を確認してください。
設定が済んだら nft コマンドの -c(check)オプションで、構文チェックをしておきましょう。
nft -c -f /etc/nftables/filter.nftnftables を再起動して反映します。
systemctl restart nftables.serviceIPv6 を有効にするサービスの設定
OpenLiteSpeed
リスナーの追加
OLS の管理画面から「リスナー」を開き、新しいリスナーを追加します。
- リスナー名:(任意)
- IP アドレス:[ANY] IPv6
- ポート:443
- セキュア:はい
バーチャルホストマップの割り当て
作成したリスナーにバーチャルホストマップを割り当てます。
プルダウンから設定済みのバーチャルホストを選択し、ドメインと紐づけます。

SSL の設定
作成したリスナーの「SSL」のタブを開き、SSL の設定を追加します。
- 秘密鍵ファイル:Let's Encrypt で取得した privkey.pem へのパス
- 証明書ファイル:Let's Encrypt で取得した fullchain.pem へのパス
- 証明書チェーン:はい
- プロトコルバージョン:TLS v1.2、TLS v1.3
- SSL再交渉保護:はい
- ALPN:SPDY/3、HTTP/2、HTTP/3
- Open HTTP3/QUIC (UDP) Port:はい

設定を保存したら、OLS を再起動しましょう。
Postfix
Postfix の設定で inet_protocols に all が指定されていれば、IPv4 と IPv6 両方が有効になっています。
postconf | grep ^inet_protocols
(out) inet_protocols = all
(out) smtp_address_preference = anyinet_protocols が ipv4 の場合は /etc/postfix/main.cf を修正して、Postfix を再起動します。
Dovecot
Dovecot の設定で listen に「*, ::」が指定されていれば、IPv4 と IPv6 両方が有効になっています。
doveconf | grep ^listen
(out) listen = *, ::listen が「*」の場合は /etc/dovecot/local.conf(もしくは /etc/dovecot/dovecot.conf)を修正して、Dovecot を再起動します。
確認
ウェブサーバーと、メールサーバーが正しく設定されているかチェックしておきましょう。
追記
WordPress の LiteSpeed Cache プラグインで QUIC.cloud と連携して画像を WebP に置換していましたが、最適化要求(Gather Image Data)で画像を渡すことはできても、画像を引き戻す(Pull Images)際に受け取れない状況になってしまっていました。
OpenLiteSpeed で /wp-admin に対して IP アドレスで制限をかけていたのですが、自サーバーの IPv6 アドレスを許可リストに追加することで解決しました。

コメント