Windows Serverでのオーディオ有効化手順とメッセージダイアログ出現時の音が鳴らない問題への対処法
はじめに
本記事では、Windows Serverでのオーディオ有効化手順とメッセージダイアログ出現時の音が鳴らない問題への対処法について紹介します。
Windows Serverでオーディオを有効化する
Windows Serverはサーバ向けということもあり、2008~2022ではサウンドデバイスドライバが入っていたとしてもデフォルトで音が出ません(2025ではこの仕様がなくなった模様)。これはWindows Audio(と依存関係にあるWindows Audio Endpoint Builder)というサービスが無効化されているためで、これを有効化し開始すればとりあえず動画等の音は出る状態になります。
手順
- サービス(services.msc)を開く。
- Windows Audioを探し、ダブルクリックする。
- スタートアップの種類を「自動」にして「適用」ボタンを押す。
- 「OK」を押して閉じた後、Windows Audio Endpoint Builderに対しても2., 3. の操作を行う。
- Windows Audio、Windows Audio Endpoint Builderの「開始」ボタンを押して、サービスを起動させる。以下のような感じになればOK。
完了すると、タスクバー右側のアイコンで音量調整ができるようになっているはずです。

オーディオを有効化してもメッセージダイアログ出現時の音が鳴らない問題への対処法
先述のWindows Audio、Windows Audio Endpoint Builderサービスを起動しても、メッセージダイアログ出現時の音が鳴らない場合があります(というか、鳴るようになっていません)。ここでのメッセージダイアログ出現時の音というのは、サウンド設定の「システムエラー」や「メッセージ(情報)」、「メッセージ(警告)」が該当します。これはSystemSoundsServiceというタスクが無効化されていることが原因で、有効化し実行すれば音が鳴るようになります。これは最新の2025でもデフォルトで無効化されています。
手順
Juniper SRXとNEC UNIVERGEでIKEv2/IPSec IPv6 over IPv4トンネルを張る(動的IP対応?)
はじめに
Juniper SRXシリーズファイアウォールでIKEv2/IPSecを利用したIPv6 over IPv4トンネル接続を行う方法です。
検証にはJuniper SRX300を利用しています。今回は対向のルータをNEC UNIVERGE IX2215とします。
シナリオ
Juniper SRX300とNEC UNIVERGE IX2215が以下の図のようにWANを介しIPv6 over IPv4のIKEv2/IPSec仮想トンネルを確立する。
待ち受け側(Responder, IX2215)はPPPoEによりISPからグローバルIPアドレスを取得し、WANとの通信が行える状態である。
2つのルータはIKEv2、PSK方式による認証を行う。
トンネルを確立後、2つのルータ間でOSPFv3によりルート情報の交換を行う。
接続側(Initiator)はIPアドレスが不定(Dynamic)なので、それを考慮した設定を行う。

前提条件
・待ち受け側(Responder)はグローバルIPアドレスを持っていることが必須だが、ドメインを取得していれば固定IPである必要はない(待ち受け側でDDNSを利用して、IPアドレスの登録を行うこと)。
しかし、Juniper SRXは設定時にホスト名を入力すると、IPアドレスに自動的に解決してしまう。 表示されているIPアドレスの裏でホスト名が記録されてはおらず、IPアドレスが変わっても気づいてくれない。そのため、Python3スクリプトを利用してこれを解決する。
・接続側(Initiator)はNATの内側にあってもよい(NATトラバーサル)。(ファイアウォールにより場合によってはパケットドロップが発生するかもしれない)
パラメータ
2つのルータ間で絶対に合わせなければいけない設定です。適宜変更してください。
| 項目 | 値 |
|---|---|
| 接続先(IX2215側IP) | example.com(198.51.100.2) |
| NATトラバーサル | 有効 |
| IKEバージョン | IKEv2 |
| PSK | hogehoge |
| Phase1(Proposal)暗号化(encryption) | AES256(aes-cbc-256) |
| Phase1(Proposal)認証(integrity) | SHA256 |
| Phase1(Proposal)DH Group | 14(2048bit) |
| ローカルID(Type:key-id) | vpn-juniper |
| lifetime(Phase1) | 86400秒(1日) |
| Phase2プロトコル | ESP |
| Phase2暗号化 | AES256(aes-cbc-256) |
| Phase2認証 | SHA256(sha256-hmac) |
| Phase2 PFS | 有効,group1 |
| Phase2 PFS DH Group | group14(2048bit) |
| Dead Peer検出 | 有効、10秒 |
| lifetime(Phase2) | 86400秒(1日) |
| SRX300側トンネルインターフェースIPv6アドレス | 2001:db8:1::2/64 |
| IX2215側トンネルインターフェースIPv6アドレス | 2001:db8:1::1/64 |
| OSPFv3エリアID | 0.0.0.2 |
| OSPFv3 Hello Interval | 10秒 |
| OSPFv3 Dead Interval | 40秒 |
PSKは実際は複雑で長めに設定しておくことを強くお勧めします。
UNIVERGE IXの設定
UNIVERGE IXのConfig内で定義されているものの名前は次の通りです。
|項目|値| |---|---|
ikev2 authentication psk id keyid juniper-tun key char hogehoge ! ikev2 profile ikev2-profile child-lifetime 86400 child-pfs 2048-bit 1024-bit child-proposal enc aes-gcm-256-16 aes-cbc-256 child-proposal integrity sha2-384 sha2-256 dpd interval 10 local-authentication psk id keyid vpn-juniper nat-traversal keepalive 20 negotiation-direction responder sa-lifetime 86400 sa-proposal enc aes-cbc-256 sa-proposal integrity sha2-256 sa-proposal dh 2048-bit sa-proposal prf sha2-256 ! interface GigaEthernet0.1 ip address 198.51.100.2/24 ip mtu 1454 ip tcp adjust-mss 1414 ip napt enable ip napt static GigaEthernet0.1 udp 500 ip napt static GigaEthernet0.1 50 ip napt static GigaEthernet0.1 udp 4500 no shutdown ! interface Loopback0.0 ip address 10.1.0.1/24 ! interface Tunnel0.0 tunnel mode ipsec-ikev2 ipv6 address 2001:db8:1::1/64 ikev2 binding ikev2-profile ikev2 outgoing-interface GigaEthernet0.1 ikev2 peer any authentication psk id keyid vpn-juniper no shutdown
Juniper SRXの設定
Juniper SRXのConfig内で定義されているものの名前は次の通りです。
| 項目 | 値 |
|---|---|
| IKE Proposal名 | ikev2-proposal |
| IKE Policy名 | ikev2-policy |
| gateway名 | univerge-ix2215 |
| LAN側Zone名 | trust |
| WAN側Zone名 | untrust |
| VPN側Zone名 | s2s-tun-zone |
| trust→s2s-tun-zoneのポリシー名 | vpn-out |
| s2s-tun-zone→trustのポリシー名 | vpn-in |
| LAN側インターフェースの1つ | irb.24 |
| WAN側インターフェース | ge-0/0/5.0 |
| トンネルインターフェース | st0.0 |
| OSPFv3 router-id | 192.0.2.1 |
| OSPFv3の再配布ポリシー名 | ospf-redistribute-1 |
| 動的IP変更スクリプトファイル | dynamic-ip-change.py |
| 動的IP変更イベントポリシー名 | dyn-ip-change-policy |
| 動的IP変更イベント名 | script-event |
| 動的IP変更イベント実行間隔 | 1800秒(30分) |
security {
ike {
proposal ikev2-proposal {
authentication-method pre-shared-keys;
dh-group group14;
authentication-algorithm sha-256;
encryption-algorithm aes-256-cbc;
lifetime-seconds 86400;
}
policy ikev2-policy {
proposals ikev2-proposal;
pre-shared-key ascii-text "hogehoge"; ## 実際は暗号化される
}
gateway univerge-ix2215 {
ike-policy ikev2-policy;
address 198.51.100.2;
dead-peer-detection interval 10;
local-identity key-id vpn-juniper;
remote-identity key-id vpn-juniper;
external-interface ge-0/0/5.0;
version v2-only;
}
}
ipsec {
proposal ipsec-proposal1 {
protocol esp;
authentication-algorithm hmac-sha-256-128;
encryption-algorithm aes-256-cbc;
lifetime-seconds 86400;
}
policy ipsec-policy1 {
perfect-forward-secrecy {
keys group14;
}
proposals ipsec-proposal1;
}
vpn ipsec-vpn-univerge {
bind-interface st0.0;
ike {
gateway univerge-ix2215;
proxy-identity { #ここ重要
local ::/0;
remote ::/0;
}
ipsec-policy ipsec-policy1;
}
establish-tunnels on-traffic;
}
}
policies {
from-zone trust to-zone s2s-tun-zone {
policy vpn-out {
match {
source-address any;
destination-address any;
application any;
}
then {
permit;
}
}
}
from-zone s2s-tun-zone to-zone trust {
policy vpn-in {
match {
source-address any;
destination-address any;
application any;
}
then {
permit;
}
}
}
}
zones {
security-zone trust {
host-inbound-traffic {
system-services {
all;
}
protocols {
all;
}
}
interfaces {
irb.24;
}
}
security-zone untrust {
screen untrust-screen;
host-inbound-traffic {
system-services {
ike;
}
}
interfaces {
ge-0/0/5.0;
}
}
security-zone s2s-tun-zone {
host-inbound-traffic {
system-services {
all;
}
protocols {
all;
}
}
interfaces {
st0.0;
}
}
}
}
interfaces {
ge-0/0/0 {
unit 0 {
family ethernet-switching {
interface-mode trunk;
vlan {
members [ vlan24 ... ];
}
}
}
}
ge-0/0/5 {
unit 0 {
family inet {
address 192.168.100.100/24;
}
}
}
}
irb {
unit 24 {
family inet {
address 192.168.24.1/22;
}
}
}
st0 {
unit 0 {
family inet6 {
address 2001:db8:1::2/64;
}
}
}
}
policy-options {
policy-statement ospf-redistribute-1 {
term redistribute-static {
from protocol static;
then accept;
}
term redistribute-directconn {
from protocol direct;
then accept;
}
}
}
protocols {
ospf3 {
area 0.0.0.2 {
interface st0.0 {
interface-type p2p;
}
}
export ospf-redistribute-1;
}
}
event-options {
generate-event {
script-event time-interval 1800;
}
policy dyn-ip-change-policy {
events script-event;
then {
event-script dynamic-ip-change.py {
#ファイルがスクリプト実行毎に作成されるので普段はこの配下の設定はすべてdeactivateしてください
output-filename script-output.txt;
destination dest-local;
output-format text;
}
}
}
event-script {
file dynamic-ip-change.py;
}
destinations {
dest-local {
archive-sites {
/var/log;
}
}
}
}
Pythonスクリプト(dynamic-ip-change.py)
スクリプトは/var/db/scripts/eventに配置します。JunOS PyEZ(junos-pyez)をpip3でインストールしてあれば、PCでも実行できます。
import socket
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
commit_needed = 0
dev = Device(host='192.168.24.1', user='admin', password='password' )
dev.open()
dev.bind(cu=Config)
dev.cu.lock()
def dns_lookup(domainname):
try:
return socket.gethostbyname(domainname)
except:
return False
def config_change(delete_config, set_config):
global commit_needed
dev.cu.load("delete " + delete_config, format="set")
dev.cu.load("set " + set_config, format="set")
difference = dev.cu.diff()
print(difference)
if difference is None:
print("Commit is not needed.")
commit_needed = 0
else:
print("Commit needed!")
commit_needed = 1
def vpn_ip_change(gateway_name, domain_name):
ip = dns_lookup(domain_name)
print(ip)
change_conf_delete="security ike gateway " + gateway_name + " address"
change_conf_set="security ike gateway " + gateway_name + " address " + ip
print(change_conf_set)
config_change(change_conf_delete, change_conf_set)
vpn_ip_change("univerge-ix2215", "example.com")
if commit_needed == 1:
print("committing")
dev.cu.commit(comment="Commit by dynamic-ip-change.py")
dev.cu.unlock()
dev.close()
最後に
SRX300でproxy-idを設定するところがIPv6 over IPv4を実現するためのキーポイントです。尚、プロキシIDというのはIKEv1のときの用語で、IKEv2ではこの部分をトラフィックセレクタと呼ぶので注意してください。用語は違いますが、いずれも「どんなトラフィックをトンネル内で送受信するか」を決めるものです。
動的IPを持つ拠点間でVPNを張る場合は、Juniper側がInitiatorとなる場合はこんな感じでスクリプトを書かないといけませんので正直あまり適していないと思います。CiscoではEEMを使って同様の対応は可能ですが、IKEv2の場合だとKeyringのaddress指定を0.0.0.0にするなどしないといけないので、Ciscoもあまり適しているとは言えない気がします。ホスト名を設定に登録できるのは私が知る限りではAllied Telesis AT-AR、UNIVERGE IX、FortiGateが標準で対応していますので、こういったケースの場合には適しているかと思います。
Cisco、YAMAHAルータを利用した簡易ダイヤルアップ接続環境の構築
はじめに
この記事では、Cisco、YAMAHAルータを利用した簡易的なダイヤルアップ接続環境の構築方法を紹介します。ダイヤルアップのあの音を楽しみたい、インターネットの歴史を感じたい、速度が遅く遅延が大きい環境を実際に作りたいという方におすすめです。
必要なもの
自宅で簡易的なダイヤルアップ接続環境を構築するには、
・モデム
・電話交換機となるデバイス
・電話ケーブルx2
・PPPクライアント用PC
が必要です。
モデムは、Amazonから適当なUSB接続のモデムを購入しました。
電話交換機となるデバイスとしては、YAMAHA NVR500を利用しました。NVR500には内線機能があり、電話番号はTEL1ポートの電話が*1、TEL2ポートの電話が*2となっています。
さらに、PPP接続をする場合はモデムがあり、PPPサーバになれるルータあるいはPCが必要です。WindowsのPCでも構いませんが、私はCisco 891FJを利用しました。このルータは電話ポートを搭載しており、1回使ってみたいとずっと思っていたからです。
電話ケーブルはRJ-11(6極2芯)のものを2本用意しました。
構築
Cisco 891FJのインターフェース
Cisco 891FJにはLAN側スイッチポートの左隣に、V.92対応の電話ポートがあります。今回はこれを利用します。
デフォルトの設定ではなんと!このポートはコンソールへのアクセスに利用することができます(line 3に割り当て)。つまり、モデムから電話をかけるとコンソールにアクセスできるということです。
Cisco 891FJではこのポートを利用してネットワーク通信を行う際はAsync3インターフェースを使用します。
構築前のテスト
モデム、NVR500、891FJを以下の図のように接続します。

録音アダプタを使用する場合は、適切な場所に設置してください。
モデムのコンソールをTeraTermやscreenなどで開き(ボーレートは大概115200)、以下のATコマンドを入力してください(大文字で記載していますが、小文字でも可。詳しくは別途調べてください)。尚、打った文字は1つ目のコマンドを実行するまで表示されない場合があります。これはコマンドエコーが無効になっているからです。
AT&F (モデムの設定初期化)
ATDT*2 (*2にダイヤル、ダイヤル方式にはトーンを利用)
しばらくすると891FJのコンソール画面につながるはずです。
切断するには、ログイン前はEnterを連打、ログイン後はexitを入力します。あるいはエスケープ文字(+++)を打ってから、切断コマンド(ATH)を打ちます。
Cisco 891FJの設定
PPPサーバの設定をします。
Config中のパラメータは以下の通りです。適宜変更してください。
| パラメータ | 値 |
|---|---|
| PPPユーザ名 | ppp-test |
| PPPパスワード | ppp-test |
| ip unnumberedに使用するI/F | Loopback2 |
| dialer-group | 2 |
| PPP認証方式 | CHAP |
| PPPクライアントアドレスプール | pool-ppp |
| PPPクライアントへ割り当てるアドレス | 192.168.120.10-15 |
以下に設定例を示します。PPPクライアントのPCをインターネットに繋げる場合は、これに加えてその設定も適切に行ってください。
username ppp-test password ppp-test ! interface Loopback2 ip address 192.168.120.1 255.255.255.255 ! interface Async3 ip unnumbered Loopback2 encapsulation ppp dialer in-band dialer idle-timeout 0 dialer-group 2 peer default ip address pool pool-ppp async mode dedicated ppp authentication chap callin ! ip local pool pool-ppp 192.168.120.10 192.168.120.15 dialer-list 2 protocol ip permit
PCへのダイヤルアップ接続のセットアップ
PPPクライアントとなるPCにてダイヤルアップ接続の設定を行います。大体の方法は調べればたくさん出るかと思いますので、そちらを当たるとよいでしょう。
設定の際の注意事項:
・ダイヤル方式を確かめてください。電話の仕様上「プッシュ」に設定しないと*と#の入った電話番号にダイヤルできません。
・認証方式が正しいか確かめてください。上記の例ではCHAPです。
・仮想マシン経由でモデムを利用している場合は、モニタースピーカ(電話をかける時にPCのスピーカーから音の様子を聞ける機能)はオフにしといたほうがいいかもしれません。自分の環境では雑音だけが出たので。
接続テスト
構築前のテストに記載の手順をもう一度実行し、コンソールにアクセスできないこと(文字化けしたような内容が表示されること)を確認します。コンソールでATHを打って切断します。
その後、実際にクライアントからダイヤルアップ接続を開始して確かめます。
通信が可能になると891FJ前面のV.92ランプが点灯、Async3インターフェースがUpします。
PPP接続が完了すると、PPPランプも点灯します。
後はPingするなり適当なサイトにアクセスするなりして通信できることを確かめます。
切断
接続を終了する場合は、必ず切断処理を行ってください。
実際の接続の様子
実際に環境を構築し、Windows98SEから接続を行った際の様子です。V.34(21600bps)での接続です。
最後に
ATコマンドを駆使して使用する通信規格を制限する(AT+MS=コマンド)と、それに応じて音も変わってきます。音にこだわりのある方は一度やってみてください。
V.90、V.92はISDN回線でないと実現できません。つまりこの方法ではできないということです。
eo光のIPv6接続をCiscoルータでやってみる(シングルセッションPPPoE)
はじめに
1~2年ほど個人的にIPv6にハマった時期がありました。IPv6を学び始めた時のIPv4と異なった仕様は難解ではありましたがとても新鮮で面白く、自分の家でもIPv6のグローバルプレフィックスが欲しいと思ったわけです。
私の家にはeo光の回線が引かれています。eo光もIPv6には対応しています。しかし、ネットで出てくる大半の接続設定は困ったことにNTT回線向けのものしか大体出てこない。出てきてもCiscoルータでのやり方は書いていない。なので書いておこうかと思ったわけです。
IPv6接続形態:NTTとeo光の違い
まずNTTとeo光のIPv6方式の違いについて解説しておこうかと思います。
簡単に言えば
・接続形態の違い(IPv6でPPPoEを使う・使わない)
・PPPoEを使う場合の方式の違い(IPv6のためのセッションを別で張るか、IPv4とIPv6を1つのセッションで通信できるようにするか)
この2点に尽きます。
WAN回線においてIPv6通信を行う方法の一つとして、IPoE接続方式があります。IPoE接続方式では、PPPoEの設定が不要で単にDHCPv6-PDクライアントをWANインターフェースで動かすだけでプレフィックスが振られ通信できるようになります。LANとほとんど変わらないような方式です。
しかしIPoE接続方式は主にNTT回線を利用するISPだけが対応していることがほとんどで、eo光では対応していません(回線認証を行う仕組みがないのでしょうか)。そのためeo光ではIPv6で通信する場合でも昔ながらのPPPoEを利用する必要があるのです。
またPPPoEでIPv6通信を行う際、IPv6通信のためのPPPoEセッションを別で張るマルチセッション方式と、IPv4とIPv6を1つのPPPoEセッションで通信できるようにするシングルセッション方式があります*。
OCNなど一部の対応するISPでは前者の方式を、eo光では後者の方式を採用しており、eo光公式サイトではこの方式を「PPPoEによるデュアルスタック方式」と呼んでいます。
残念ながら今回用いるこのシングルセッション方式に市販のルータはほとんど対応していないため、専用のルータを使えというのが公式の言い分です。
しかし、CiscoのルータやNEC UNIVERGE、Yamaha RTXといった逸般的なルータならこの方式でも対応していますので、専用のルータなんか使わなくてもできちゃうわけです。
*PPPのプロトコルに注目して話をすれば、マルチセッション方式ではNCPのIPCPとIPv6CPはそれぞれ個別のPPPoEセッションにおいて動かされますが、シングルセッション方式ではこの2つを同じセッションで動かすということになります。
シナリオ
自宅からPPPoE経由のIPv6インターネット接続を提供するISP回線を利用し、IPv6通信を行えるように設定する。
ISPはシングルセッションのPPPoE接続においてIPv4とIPv6の接続性を提供する。PPPoE接続完了後、DHCPv6-PDクライアントを動作させ、グローバルIPv6プレフィックスを要求する。
プレフィックス取得後、Vlan10インターフェースにグローバルIPv6アドレスを設定し、Vlan10内のノードに対しグローバルIPv6プレフィックスをRAにより広告する。VLAN10内のノードはRAを受け取ることにより、SLAACによりグローバルIPv6アドレス、デフォルトゲートウェイを設定する。
IPv6 DNSサーバの設定はRDNSSにより行うものとする。

設定パラメータ
| 項目 | 値 |
|---|---|
| WAN側インターフェース | GigabitEthernet8 |
| PPPoEユーザ名 | pppoe-user |
| PPPoEパスワード | pppoe-pass |
| PPPoE認証方式 | CHAP |
| DHCPv6-PD取得プレフィックス名 | wan-prefix |
| Vlan10 グローバルIPv6アドレス | (wan-prefix)::1/64 |
| Vlan10 RA lifetime | 3600秒(1時間) |
| Vlan10 RAインターバル | 180秒 |
| (RDNSS)IPv6 DNSサーバ | 2606:4700:4700::1111(Cloudflare) |
wan-prefixにDHCPv6-PDで取得したプレフィックスが結びつきます。eo光では/64のプレフィックスが降ってきます。
例:取得したプレフィックスが2001:db8:1111:2222::/64なら、Vlan10のグローバルIPv6アドレスは2001:db8:1111:2222::1/64となります。
Config例
注意:
・ファイアウォール設定は省いています。ACLやCBAC、ZBFWを利用して別途ファイアウォール設定を行ってください。eo光ではプロバイダ側でのIPv6フィルタは一切行われていません。
・RDNSSはソフトウェアバージョンが古いと対応していません(15.4(1)T, 15.3(2)Sで対応とのこと)。
・当たり前かもしれませんが、HGW(eo光では多機能ルータ)のルータ機能は使わないでください。
ip cef ipv6 unicast-routing ipv6 cef ! interface GigabitEthernet8 no ip address duplex auto speed auto no cdp enable ipv6 enable pppoe enable group global pppoe-client dial-pool-number 1 no lldp transmit no lldp receive ! interface Dialer1 mtu 1454 ip address negotiated no ip unreachables ip nat outside ip virtual-reassembly in encapsulation ppp dialer pool 1 dialer-group 1 no cdp enable ipv6 enable ipv6 mtu 1454 no ipv6 unreachables ipv6 dhcp client pd wan-prefix rapid-commit ppp authentication chap callin ppp chap hostname pppoe-user ppp chap password 0 pppoe-pass ppp ipcp dns request accept ppp ipcp route default ! interface Vlan10 ip address 192.168.10.1 255.255.255.0 ip nat inside ipv6 address wan-prefix ::1/64 ipv6 enable ipv6 nd ra lifetime 3600 ipv6 nd ra interval 180 ipv6 nd ra dns server 2606:4700:4700::1111 ipv6 tcp adjust-mss 1394 ! access-list 1 permit 192.168.10.0 0.0.0.255 !NAT対象の通信のACL ip nat inside source list 1 interface Dialer1 overload dialer-list 1 protocol ip permit dialer-list 1 protocol ipv6 permit (ip route 0.0.0.0 0.0.0.0 Dialer1) ! ppp ipcp route defaultを利用しているので要らないはず ipv6 route ::/0 Dialer1
設定が完了したら保存して一旦reloadすることをお勧めします。
解説と補足
PPPのNCPにはIPCPとIPv6CPがありますが、IPCPにはIPアドレスを割り振る機能やDNSサーバのIPアドレスを通知する機能があるのに対し、IPv6CPにはその機能がありませんのでDHCPv6-PDクライアントを用います。
接続状況は、DialerインターフェースやVirtual-Accessインターフェースの状態、show ppp all、show pppoe session、ログ、891FJを利用していればPPPランプで確認して下さい。
ちなみに現在はIX2215を使ってますが891FJより相性が良いような感じがします。891FJでは若干PPPoE接続に時間がかかったり、原因はよくわかりませんが接続してから数分後に一旦PPPoEが切れることがありました。(ちなみにプロバイダ側のBASはJuniperです)
(4/30追記)UNIVERGEはPPPoEのセッションが不完全な状態で切れていることを検出すると、PADTを送ってその不完全な状態のセッションを落とすという機能があるようです。相性がよいと感じたのはそのためでした。とてもいい機能だと思います。
CiscoルータとFortigate間でVPN IPSecトンネルを張る(IKEv2 動的IP対応)
はじめに
Cisco 891FJとFortigate 50EとのIKEv2を利用したIPSecトンネル接続(IPSec VTIを利用)を行う方法です。
IKEv2はv1に比べ、複雑さが減ったらしいですが、まだポピュラーではない方法なのか設定方法のドキュメントはあまりまとまっていないように感じます。
相変わらずパラメータの数は多いです。双方でしっかり合わせていかなければ接続できません。
色々ハマった部分もあるのでまとめておきたいと思います。
なおここではIPv4接続を前提としています。IPv6でトンネルを張るには多少設定が異なる程度で、多分できると思います。(接続側がIPv6アドレスが降ってこないので検証できません)
シナリオ
Cisco 891FJとFortigate 50Eが以下の図のようにWANを介しIPSec 仮想トンネルを確立する。
待ち受け側(Responder,Cisco)はPPPoEによりISPからグローバルIPアドレスを取得し、WANとの通信が行える状態である。(IPoEでも可)
今、設定でファイアウォールのポートを開放し、接続を待つ。
2つのルータはIKEv2、PSK方式による認証を行う。
トンネルを確立後、2つのルータ間でOSPFによりルート情報の交換を行う。
接続側(Initiator)はIPアドレスが不定(Dynamic)なので、それを考慮した設定を行う。なおこの設定を行うことで、拠点間接続が増えるときにも役立つ。

前提条件
待ち受け側(Responder)はグローバルIPアドレスを持っていることが必須だが、ドメインを取得していれば固定IPである必要はない。(待ち受け側でDDNSを利用して、IPアドレスの登録を行うこと。私はmydnsを使ってます)
接続側(Initiator)はNATの内側にあってもよい(NATトラバーサル)。(ファイアウォールにより場合によってはパケットドロップが発生するかもしれない)
なお実際自分の環境では接続側はグローバルとプライベート間の境界ではありません。接続側もWANとの境界にある方が本当は望ましいのですが、私の管轄外ですのでどうにもできません。
VPN接続のための情報
2つのルータ間で絶対に合わせなければいけない設定です。適宜変更してください。
| 項目 | 値 |
|---|---|
| 接続先 | example.com |
| NATトラバーサル | 有効 |
| IKEバージョン | IKEv2 |
| PSK | hogehoge |
| Phase1(Proposal)暗号化(encryption) | AES256(aes-cbc-256) |
| Phase1(Proposal)認証(integrity) | SHA256 |
| Phase1(Proposal)DH Group | 14(2048bit) |
| ローカルID(Type:key-id) | vpn-fortigate |
| lifetime(Phase1) | 86400秒(1日)(デフォルト) |
| Phase2暗号化 | AES256(aes-cbc-256) |
| Phase2認証 | SHA256(sha256-hmac) |
| lifetime(Phase2) | 43200(12時間)(デフォルト) |
| Cisco側のトンネルインターフェースIP | Unnumbered(Loopback1:100.100.100.100/32) |
| Fortigate側のトンネルインターフェースIP | 172.16.5.2/32 |
| OSPFエリアID | 0.0.0.2 |
| OSPF Hello Interval | 10秒 |
| OSPF Dead Interval | 40秒 |
PSKは実際は複雑で長めに設定しておくことを強くお勧めします。
Ciscoルータ側の設定
CiscoルータではVPN接続要求を受信したとき、設定が次の順に評価され、接続要求に応答します。(間違ってたらすみません)
この流れに合うように設定していかなければなりません。
Ciscoのドキュメントによれば、Phase1は"IKE_SA_INIT"、Phase2は"IKE_AUTH"という名前でデバッグログに現れます。そこからもその様子が見て取れると思います。
1.Policyに関連付けられたProposalを確認する。
2.Proposalで設定した暗号化方式と認証方式、DH Groupが要求に合うかどうか確認する。合致すればPhase1は完了
3.IKEv2 Profileの"match"句の設定より接続側が提供する情報(address/key-id/e-mail/FQDN)に合うProfileを探す。
4.3.で条件に合うProfileが見つかれば、設定された認証方式に従い認証を行う。
(ここからはPSK認証の場合)
5.Profile内で設定されたkeyringを参照する。
6.keyring内に設定された"match"句を確認する。合致すれば次へ。
7.PSKが合っているかどうか確認する。PSKが合致すれば、認証完了を通知する。
8.IPSec Profileの設定に従い、transform-setとikev2-profileを確認する。
9.transform-setの設定から、tunnelを張ることを決定する。
10.IKEv2 Profileに関連付けされたvirtual-templateの設定を参照する。
11.virtual-templateの設定をもとに、virtual-accessトンネルインターフェースを設定する。(Tunnelインターフェースではありません。Tunnelモードのvirtual-accessです。やってみて初めて知りました)
以下に必要なconfig例を示します。CiscoのConfig内で新たに定義されているものの名前は次の通りです。
| 項目 | 値 |
|---|---|
| Proposal名 | ikev2-proposal |
| Policy名 | ikev2-policy |
| keyring名 | keyring-fg |
| keyring内のPeer名 | fortigate |
| トンネルの設定テンプレートInterface | Virtual-Template3 |
| IPSec transform-set名 | site-to-site-tunnel |
| IPSec Profile名 | ipsec-fortigate |
| Dynamic Map名 | vpn-dyn-map |
| WANインターフェースに関連付けるCrypto Map名 | vpn-crypto-map |
| OSPF router-id | 192.0.2.1 |
Config例
crypto ikev2 proposal ikev2-proposal encryption aes-cbc-256 integrity sha256 group 14 !(これがPhase1の暗号化方式の設定に当たります) ! crypto ikev2 policy ikev2-policy proposal ikev2-proposal !Proposalを紐づける必要があるのでProposalの設定が先です ! crypto ikev2 keyring keyring-fg peer vpn-fortigate identity key-id vpn-fortigate pre-shared-key local hogehoge pre-shared-key remote hogehoge !match identity の後には接続側が提供する情報 !(address/key-id/e-mail/FQDN)の種別を選びます ! crypto ikev2 profile ikev2-profile match identity remote key-id vpn-fortigate authentication remote pre-share authentication local pre-share keyring local keyring-fg virtual-template 3 !match identity remoteの後には接続側が提供する情報 !(address/key-id/e-mail/FQDN)の種別を選びます !ここで設定を"any"とすることもでき、keyringで判断させるのもありです !virtual-templateの後は数字を入力。 !virtual-templateをもとにtunnelを確立する ! crypto ipsec transform-set site-to-site-tunnel esp-aes 256 esp-sha256-hmac mode tunnel !(これがPhase2の暗号化方式の設定に当たります) ! crypto ipsec profile ipsec-fortigate set transform-set IPSec7 set ikev2-profile ikev2-profile ! crypto dynamic-map vpn-dyn-map 1 set nat demux set transform-set site-to-site-tunnel ! transform-setは複数設定可能。 !set transform-set <transform-set1> <transform-set2> ...のように記述 ! crypto map vpn-crypto-map 5 ipsec-isakmp dynamic vpn-dyn-map !"5"はシーケンス番号。任意の数字を指定 !vpn-crypto-mapは後でWAN側インターフェースに関連付ける ! interface Loopback1 ip address 100.100.100.100 255.255.255.255 ! router ospf 2 router-id 192.0.2.1 redistribute connected subnets ! interface Virtual-Template3 type tunnel ip unnumbered Loopback1 ip ospf hello-interval 10 ip ospf dead-interval 40 (ip ospf mtu-ignore) ip ospf 2 area 0.0.0.2 tunnel source Dialer1 tunnel mode ipsec ipv4 tunnel destination dynamic tunnel protection ipsec profile ipsec-fortigate !初めてinterface Virtual-Template3 type tunnelを実行する際には、"type tunnel"を忘れずに !トンネルのDestinationは接続側のWAN側IPアドレスとなる。 !接続側のIPは不定であるためにdynamicにする。 interface Dialer1 crypto map vpn-crypto-map ! ip access-list extended rules-ipv4 permit esp any any permit udp any any eq isakmp permit udp any any eq non500-isakmp !isakmp=500,non500-isakmp=4500 !(10/9追記)NATトラバーサルが利用されない場合、ESPを許可する必要があります。NATトラバーサルを必要とするクライアントはudp/4500を用います。抜けてたので修正。
Fortigate側の設定
Ciscoと呼び方が変わっている部分があります。また、設定は大体はGUIで可能ですが、一部の設定はCLIで設定する必要があります。
以下に設定後のConfigを示しますが、Configの部分以外に以下の設定が必要です。
・少なくとも1つ、VPNトンネルインターフェースが発信/着信インターフェースとなるポリシー。(定義しない場合はトンネルをつないでも通信しないので無意味と判断され行われません、デバッグログから)
・ドメイン名を利用して接続する際はDNSサーバの設定。
VPN→IPSecトンネルからトンネルを新規作成します。
「カスタム」を選び名前を入力します。こんな感じで設定します。

暗号化・認証方式は元々何個か入っているはずです。別に消さなくても接続できます。
ただ、実はこの設定だけでは足りない部分があります。CLIを利用し、さらに設定を行います。(以下参照)
具体的には「ローカルIDの種類」の設定です。接続の際に判別される部分になりますので注意してください。
設定が完了したら、インターフェースのIPアドレスを設定します。IPには接続側のトンネル内IPアドレスを入力します。
さらにVPNトンネルインターフェースが発信/着信インターフェースとなるポリシーを設定します。(設定しないと接続する意味がないとみなされ接続が開始されません)
Fortigate Config例
FortigateのConfig内で新たに定義されているものの名前は次の通りです。
| 項目 | 値 |
|---|---|
| インターフェース名 | site-cisco |
| phase1-interfaceの項目名 | site-cisco |
| phase2-interfaceの項目名 | site-cisco |
| OSPF router-id | 192.0.2.2 |
恐らくGUIで設定するとすべての名前が同じになるはずです。
尚、wan1がwan側インターフェースです。
(ポリシーの部分は載せていません。)
config system interface
edit "site-cisco"
set vdom "root"
set ip 172.16.5.2 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip 100.100.100.100 255.255.255.255
set interface "wan1"
next
end
config vpn ipsec phase1-interface
edit "site-cisco"
set type ddns
set interface "wan1"
set ike-version 2
set peertype any
set net-device disable
set proposal aes256-sha256 (複数記述可能)
set localid "vpn-fortigate"
set localid-type keyid (CLIのみ設定可能、GUIだけで設定するとFQDNと判断されます)
set dhgrp 14
set remotegw-ddns "example.com"
set psksecret hogehoge
next
end
config vpn ipsec phase2-interface
edit "site-cisco"
set phase1name "site-cisco"
set proposal aes256-sha256(複数記述可能)
set dhgrp 14
set keepalive enable
next
end
config router ospf
set router-id 192.0.2.2
config area
edit 0.0.0.2
next
end
config ospf-interface
edit "site-cisco"
set interface "site-cisco"
set dead-interval 40
set hello-interval 10
(set mtu-ignore enable)
set network-type point-to-point
next
end
config network
edit 2
set prefix 172.16.5.2 255.255.255.255
set area 0.0.0.2
next
end
(config redistribute "connected")
(set status enable)
(end)
end
他に気を付けたい部分・Note
トンネルインターフェースではサブネットは定義されません。
Cisco側でVirtual-Templateを設定する際は、ip unnumberedを利用しないとIPアドレスが上手く設定されません。(テンプレートなのでむしろIPアドレス設定がコピーされる方が困るのでしょうか)
また接続後Virtual-Accessが生成されますが、Virtual-Accessを設定するためにはVirtual-Templateをいじる必要があります。ただトンネルが確立しているとVirtual-Templateはロックされてしまうので、Virtual-Templateの設定は接続が1つもないときに行わなければなりません。
Ciscoルータ側の設定ではコマンドの省略をしがちですが、Virtual-Templateは"virtual-te"まで入力してください。viだけ入れるとvirtual-accessと認識されます。
OSPFについてはFortigateがIPアドレス形式のみ設定できるので、それに倣ってCiscoもIPアドレス形式にしています(CiscoでもIPアドレス形式を使って設定可能です)。
OSPFパケットが来ているのにルートが登録されない場合は、mtu-ignoreやredistributionの設定を行えば多分うまく行くと思います。
最後に
keyringを追加するなどすれば、さらに拠点が増えても接続できるようになると思います。私はこれ以上拠点間接続を増やせるのか実験できる環境がないので、本当にできるかどうかは分からないですが参考にはなるかと。
接続できるまではdebugログとの長い戦いでした。
