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

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

IPv6 の複数アドレスに関しては必要性を感じなかったので、セカンダリーは設定しませんでした。
IPV6_AUTOCONF="no" #yesをnoへ変更
#下記を追記
IPV6ADDR=IPv6アドレス
IPV6_DEFAULTGW=コントロールパネルで確認できる「ゲートウェイ」のアドレス
IPV6FORWARDING=yesネットワークマネージャーをリスタートして反映させます。
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 をベースに設定を変更していきます。

nftables の設定ファイルで、ip protocol(IPv4 のルール)に対応した ip6 nexthdr(IPv6 のルール)を追加していきます。
# 現在のルールセットを消去
flush ruleset
# 管理者用IPアドレスリストを読み込む
include "/etc/nftables/list/admin"
# 日本国内IPアドレスリストを読み込む
include "/etc/nftables/list/domestic"
# IPv4 & IPv6
table inet filter {
set admin {
type ipv4_addr
elements = $admin
}
set domestic {
type ipv4_addr
flags interval
elements = $domestic
}
chain input {
type filter hook input priority 0; policy drop;
# Ping floods
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 10/second accept
ip protocol icmp icmp type echo-request limit rate 10/second accept
# 関連・確立済みトラフィックは許可する
ct state established,related accept
# 不正なトラフィックは全て破棄する
ct state invalid drop
# ループバックインターフェイスのトラフィックは全て許可する
iif lo accept
# Neighbor Discovery を許可する
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
# 新しいエコー要求 (ping) は許可する
ip6 nexthdr icmpv6 icmpv6 type echo-request ct state new accept
ip protocol icmp icmp type echo-request ct state new accept
ip6 nexthdr udp ct state new jump UDP
ip protocol udp ct state new jump UDP
#ip6 nexthdr tcp tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
#ip protocol tcp tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
meta l4proto tcp tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
# 他のルールによって処理されなかったトラフィックは全て拒否する
ip6 nexthdr udp reject
ip protocol udp reject
ip6 nexthdr tcp reject with tcp reset
ip protocol 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 に対応していないため割り切って使っています。必ず自分の環境にあった設定を確認してください。
nftables を再起動して反映します。
systemctl restart nftablesIPv6 を有効にするサービスの設定
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 アドレスを許可リストに追加することで解決しました。

コメント