ConoHa の VPS を IPv6 対応させる

ConoHa Enterprise Linux 9
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

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

ConoHa の VPS で MTA-STS を設定する
前回まで ConoHa の VPS に RHEL9 をインストールし、そこにメールサーバーを構築しました。今回はその環境に MTA-STS ポリシーを設定していこうと思います。MTA-STS(Mail Transfer Agent-Stri...

今回はこのサーバーを IPv6 に対応させていきます。

ConoHa VPS

ネットワークインターフェイス(eth0)の設定変更

ConoHa の公式サイトに手順が載っていますので、以下を参考にしました。

IPv6をVPSへ設定する|ConoHa VPSサポート
ConoHa VPSのご利用ガイド、よくある質問などの各種サポート情報をご案内しています。ConoHa VPSは便利なご利用ガイドと専任スタッフのサポートで安心してご利用いただけます。

ただし、IPv6 の複数アドレスは必要性を感じなかったので、IPV6ADDR_SECONDARIES を設定しませんでした。

また、VPS 1 台の単独運用なので IPV6FORWARDING も設定しませんでした。

IPV6_AUTOCONF="no" #yesをnoへ変更

#下記を追記
IPV6ADDR=IPv6アドレス
IPV6_DEFAULTGW=コントロールパネルで確認できる「ゲートウェイ」のアドレス

ネットワークマネージャーをリスタートして反映させます。

systemctl restart NetworkManager

DNS の編集

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 アドレスの逆引きホスト名を指定して保存します。

ConoHa 管理画面

ファイアウォールの設定

以前に設定した nftables をベースとして設定を変更していきます。

管理者用や日本国内の IP アドレスリストの作成方法については以前の記事を参照してください。

Red Hat Enterprise Linux 9 のファイアウォール(nftables)設定
ここまで ConoHa の VPS に RHEL9 をインストールする方法と、初期設定の解説をしてきました。今回はサーバー構築において、最も大事な部分であるファイアウォールの設定をしていきます。ファイアウォールの設定方針以前までは fire...

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 に対応していないため割り切って使っています。必ず自分の環境にあった設定を確認してください。

nftables wiki

設定が済んだら nft コマンドの -c(check)オプションで、構文チェックをしておきましょう。

nft -c -f /etc/nftables/filter.nft

nftables を再起動して反映します。

systemctl restart nftables.service

IPv6 を有効にするサービスの設定

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:はい
SSL の設定

設定を保存したら、OLS を再起動しましょう。

Postfix

Postfix の設定で inet_protocols に all が指定されていれば、IPv4 と IPv6 両方が有効になっています。

postconf | grep ^inet_protocols
(out) inet_protocols = all
(out) smtp_address_preference = any

inet_protocols が ipv4 の場合は /etc/postfix/main.cf を修正して、Postfix を再起動します。

smtp_address_preference は、送信先の MX が IPv4 と IPv6 両方に対応している場合どちらを優先するかという設定です。IPv4 を優先したいときは smtp_address_preference = ipv4 を指定します。

Dovecot

Dovecot の設定で listen に「*, ::」が指定されていれば、IPv4 と IPv6 両方が有効になっています。

doveconf | grep ^listen
(out) listen = *, ::

listen が「*」の場合は /etc/dovecot/local.conf(もしくは /etc/dovecot/dovecot.conf)を修正して、Dovecot を再起動します。

確認

ウェブサーバーと、メールサーバーが正しく設定されているかチェックしておきましょう。

Test for modern Internet Standards like IPv6, DNSSEC, HTTPS, DMARC, STARTTLS and DANE.
Test for modern Internet Standards IPv6, DNSSEC, HTTPS, HSTS, DMARC, DKIM, SPF, STARTTLS, DANE, RPKI and security.txt

追記

WordPress の LiteSpeed Cache プラグインで QUIC.cloud と連携して画像を WebP に置換していましたが、最適化要求(Gather Image Data)で画像を渡すことはできても、画像を引き戻す(Pull Images)際に受け取れない状況になってしまっていました。

OpenLiteSpeed で /wp-admin に対して IP アドレスで制限をかけていたのですが、自サーバーの IPv6 アドレスを許可リストに追加することで解決しました。

ConoHa VPS

コメント

タイトルとURLをコピーしました