こんにちは、UOZUです。
さくらのVPSのコントロールパネルを見ると、IPv4だけでなくIPv6の情報も表示されています。
ただし、アドレスが割り当てられていても、OS側の設定が無効なままではIPv6で通信できません。今回は標準OSのAlmaLinux 10を対象に、IPv6の有効化と通信確認の進め方を紹介します。
IPv4での接続を維持しながら、IPv6でも通信できる構成にすることが今回の目標です。
最初に確認:VPSのパケットフィルターはIPv6に非対応
今回、特に気を付けたいのが通信制限です。
さくらのVPSのパケットフィルターはIPv4が対象で、IPv6はこの機能では制限されません。公式マニュアル:パケットフィルター
例えば、パケットフィルターでSSHの接続元を会社のIPv4アドレスだけに制限していても、IPv6側へ同じ制限が自動的に適用されるわけではありません。
検証時の環境では、OS初期導入段階ではfirewalldは無効だった為、IPv6を有効化する前に、OS側のファイアウォールは有効にしておきましょう。
firewalldの有効化
今回の構成ではSSHを利用するため、必要なサービスだけ許可されていることを確認します
# firewall-cmd --list-all
FirewallD is not running
# nft list ruleset
# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
# systemctl enable --now firewalld
Created symlink '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service' → '/usr/lib/systemd/system/firewalld.service'.
Created symlink '/etc/systemd/system/multi-user.target.wants/firewalld.service' → '/usr/lib/systemd/system/firewalld.service'.
# firewall-cmd --list-all
public (default, active)
target: default
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
1. 割り当てられたIPv6情報を確認する
コントロールパネルで対象サーバーを開き、「ネットワーク」タブから割り当てられたIPv6アドレスを確認します。
IPv6アドレス、プレフィックス長、ゲートウェイを控えておきましょう。公式手順では、OSの設定ファイル内に記載されたIPv6情報と、コントロールパネルの表示を照合する流れになっています。公式手順:AlmaLinux 10のIPv6有効化

本文で後ほど使うIPv6アドレスは説明用アドレスであり、実際の接続には使えません。必ず自分のVPSに割り当てられた値を使ってください。
2. 現在の設定とバックアップを確認する
OSとネットワークの状態を調べます。
# cat /etc/redhat-release
AlmaLinux release 10.0 (Purple Lion)
# ip -br a
lo UNKNOWN 127.0.0.1/8
ens3 UP 203.0.113.189/23 fe80::8f6e:d48a:b991:f2c1/64
ens4 UP
ens5 UP
# nmcli c s -a
NAME UUID TYPE DEVICE
ens3 5da28fcc-ae87-32b1-9d9a-0b5248e96b9f ethernet ens3
lo 71f566b5-be49-444b-ae1c-d3196d416ba3 loopback lo
# cat /etc/sysctl.conf
--
# Do not accept RA
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.ens3.accept_ra=0
# Do not use IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# cat /etc/NetworkManager/system-connections/ens3
[connection]
interface-name=ens3
type=ethernet
autoconnect=true
[ipv4]
address1=203.0.113.189/24
gateway=203.0.113.1
dns=133.242.0.3;133.242.0.4;
method=manual
#[ipv6]
#addresses=3fff:db8:102:2120:203:0:113:189/64
#gateway=fe80::1
#method=manual
ens3や上記ファイルが存在しない場合は、ここで作業を止めて実際の接続プロファイルを確認します。名前だけを推測して別ファイルを作らないようにしましょう。
変更前の設定を、NetworkManagerの設定ディレクトリの外へ保存します。
# install -d -m 700 /root/ipv6-setup-backup
# cp -ip /etc/sysctl.conf /root/ipv6-setup-backup/sysctl.conf
# cp -ip /etc/NetworkManager/system-connections/ens3 /root/ipv6-setup-backup/ens3
3. カーネル側でIPv6を有効にする
標準構成では、/etc/sysctl.confにIPv6を無効化する設定があります。
# vi /etc/sysctl.conf
--
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
--
↓
--
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
標準構成にあるaccept_raの設定は、この作業では変更しません。今回は割り当て済みアドレスとゲートウェイを設定するため、RAによる自動設定へ切り替える必要はありません。
ここではファイルを編集するだけにし、反映は後の再起動でまとめて行います。公式手順:カーネルパラメータの変更
4. NetworkManagerのIPv6設定を有効にする
続いてネットワーク設定を編集します。
# vi /etc/NetworkManager/system-connections/ens3
--
#[ipv6]
#addresses=3fff:db8:102:2120:203:0:113:189/64
#gateway=fe80::1
#method=manual
--
↓
--
[ipv6]
addresses=3fff:db8:102:2120:203:0:113:189/64
gateway=fe80::1
method=manual
上記は説明用の表記です。実ファイル内のアドレスとコントロールパネルの値が一致していることを確かめ、IPv6設定の対象行だけ先頭の#を外します。IPv4やconnectionのセクションは維持します。公式手順:ネットワークコンフィグの変更
5. 再起動して設定を反映する
変更箇所を見直してから再起動します。ここでSSH接続はいったん切断されます。
# systemctl reboot
起動後、まず従来のIPv4経由で管理接続できることを確認します。接続できない場合は、用意したコンソールから調べます。
6. IPv6アドレスと経路を確認する
ログイン後、IPv6が有効になっているか確認します。
# sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.ens3.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.ens3.disable_ipv6 = 0
# ip -6 -br a
lo UNKNOWN ::1/128
ens3 UP 3fff:db8:102:2120:203:0:113:189/64 fe80::9ea3:baff:fe07:4707/64
# ip -6 r s
3fff:db8:102:2120::/64 dev ens3 proto kernel metric 100 pref medium
fe80::/64 dev ens3 proto kernel metric 1024 pref medium
default via fe80::1 dev ens3 proto static metric 100 pref medium
disable_ipv6は0、アドレスはコントロールパネルの割り当て値と一致していることを確認します。
| 表示 | 確認するポイント |
|---|---|
| scope global | 割り当てられたグローバルIPv6アドレスがあるか |
| scope link | リンクローカルアドレス。これだけではインターネット接続の確認にならない |
| default via … dev ens3 | IPv6のデフォルト経路があるか |
| tentative / dadfailed | アドレスの確認途中、または重複検出失敗になっていないか |
公式手順の例では、デフォルト経路はdefault via fe80::1 dev ens3です。実環境の割り当て情報と照合してください。
【画像挿入位置:ip -6 addressとip -6 routeの確認結果】
7. 実際にIPv6で通信する
ゲートウェイとの疎通
ゲートウェイがfe80::1の場合は、次のように確認します。
# ping -6 -c 4 fe80::1%ens3
PING fe80::1%ens3 (fe80::1%ens3) 56 data bytes
64 bytes from fe80::1%ens3: icmp_seq=1 ttl=64 time=7.47 ms
64 bytes from fe80::1%ens3: icmp_seq=2 ttl=64 time=4.10 ms
64 bytes from fe80::1%ens3: icmp_seq=3 ttl=64 time=12.2 ms
64 bytes from fe80::1%ens3: icmp_seq=4 ttl=64 time=9.59 ms
--- fe80::1%ens3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 4.095/8.338/12.201/2.969 ms
リンクローカルアドレスへの通信なので、-Iでインターフェースを指定します。応答がなければ設定や経路を確認しますが、相手側の応答制限もあり得るため、pingだけで断定しません。
外部への通信
管理下のIPv6対応サーバーなど、疎通確認を許可されている宛先へping -6を実行します。
# ping -6 -c 4 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=116 time=19.4 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=116 time=19.5 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=116 time=19.4 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=4 ttl=116 time=19.3 ms
--- 2001:4860:4860::8888 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 19.340/19.391/19.477/0.051 ms
今回はGoogleの公開DNSまでPingで応答が確認できました。
続いて、AAAAレコードとHTTPSに対応したホストへ接続します。
# curl -Iv6 https://google.com
* Host google.com:443 was resolved.
* IPv6: 2404:6800:400b:c00c::66, 2404:6800:400b:c00c::8b, 2404:6800:400b:c00c::65, 2404:6800:400b:c00c::64
* IPv4: (none)
* Trying [2404:6800:400b:c00c::66]:443...
* Connected to google.com (2404:6800:400b:c00c::66) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
* subject: CN=*.google.com
* start date: Sep 4 08:04:41 2026 GMT
* expire date: Nov 27 08:04:40 2026 GMT
* subjectAltName: host "google.com" matched cert's "google.com"
* issuer: C=US; O=Google Trust Services; CN=WR2
* SSL certificate verify ok.
* Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha384WithRSAEncryption
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://google.com/
* [HTTP/2] [1] [:method: HEAD]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: google.com]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [user-agent: curl/8.9.1]
* [HTTP/2] [1] [accept: */*]
> HEAD / HTTP/2
> Host: google.com
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/2 301
HTTP/2 301
< location: https://www.google.com/
location: https://www.google.com/
< content-type: text/html; charset=UTF-8
content-type: text/html; charset=UTF-8
< content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-uRAP7-G3LgJuFC2xv2dJTg' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-uRAP7-G3LgJuFC2xv2dJTg' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
< date: Sun, 20 Sep 2026 10:11:44 GMT
date: Sun, 20 Sep 2026 10:11:44 GMT
< expires: Tue, 20 Oct 2026 10:11:44 GMT
expires: Tue, 20 Oct 2026 10:11:44 GMT
< cache-control: public, max-age=2592000
cache-control: public, max-age=2592000
< server: gws
server: gws
< content-length: 220
content-length: 220
< x-xss-protection: 0
x-xss-protection: 0
< x-frame-options: SAMEORIGIN
x-frame-options: SAMEORIGIN
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
* Connection #0 to host google.com left intact
-6でIPv6を指定することで、IPv4経由で成功していたケースと区別できます。相手によってHEADリクエストを受け付けない場合もあるため、HTTPステータスとエラー内容を確認します。
DNSサーバーへの問い合わせ自体がIPv4でも、AAAAレコードを取得してIPv6通信することは可能です。今回のためだけにDNSサーバーをIPv6アドレスへ変更する必要はありません。
外部からVPSへのSSH接続
IPv6対応の別端末・回線から、新しいSSH接続を試します。3fff:db8:102は実際のVPSのIPv6アドレスへ置き換えます。
$ ssh -6 alma@3fff:db8:102:2120:203:0:113:189
Warning: Permanently added '3fff:db8:102:2120:203:0:113:189' (ECDSA) to the list of known hosts.
SAKURA internet [Virtual Private Server SERVICE]
Last login: Sun Sep 20 21:00:39 2026 from xxx.xxx.xxx.xxx
サーバー側のSSHがIPv6で待ち受けていること、OS側のファイアウォールが管理元からの接続を許可していることが前提です。
# ss -6 -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=731,fd=8))
WebサイトのAAAAレコードは最後に登録する
初めてそのIPv6アドレスへ接続する際は、SSHのホスト鍵の確認が表示されることがあります。既知の管理経路から確認した鍵のフィンガープリントと照合してください。WebサイトのAAAAレコードは最後に登録する
WebサイトをIPv6で公開する場合は、IPv6通信に加えて、WebサーバーのIPv6待ち受け、HTTP/HTTPSの許可、TLS証明書まで確認します。
AAAAレコードを登録すると、利用者がIPv6経由でアクセスするようになる可能性があります。サーバー側の準備が不十分だと、一部の利用者だけ接続が遅くなったり失敗したりする原因になります。
そのため、DNSの公開は接続テストを終えてから行いましょう。
まとめ
さくらのVPSのAlmaLinux 10では、カーネル側とネットワーク設定の両方を確認してIPv6を有効化します。
有効化後は、アドレスが表示されるだけでなく、経路、外向き通信、外部からの接続まで順に確かめましょう。
また、VPSのパケットフィルターはIPv6を制限しないため、OS側で必要な通信だけを許可することが大切です。IPv4とIPv6それぞれの接続・防御設定を確認して、運用に組み込んでいきましょう。
最後までお読みいただき、ありがとうございました!