とおあすの技術雑記帳

トラブったところとか色々まとめ

Cisco、YAMAHAルータを利用した簡易ダイヤルアップ接続環境の構築

はじめに

この記事では、CiscoYAMAHAルータを利用した簡易的なダイヤルアップ接続環境の構築方法を紹介します。ダイヤルアップのあの音を楽しみたい、インターネットの歴史を感じたい、速度が遅く遅延が大きい環境を実際に作りたいという方におすすめです。

必要なもの

自宅で簡易的なダイヤルアップ接続環境を構築するには、
・モデム
・電話交換機となるデバイス
・電話ケーブルx2
・PPPクライアント用PC
が必要です。
モデムは、Amazonから適当なUSB接続のモデムを購入しました。

https://amzn.asia/d/5ztzhIZ

電話交換機となるデバイスとしては、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)での接続です。

youtu.be

最後に

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のためのセッションを別で張るか、IPv4IPv6を1つのセッションで通信できるようにするか)
この2点に尽きます。
WAN回線においてIPv6通信を行う方法の一つとして、IPoE接続方式があります。IPoE接続方式では、PPPoEの設定が不要で単にDHCPv6-PDクライアントをWANインターフェースで動かすだけでプレフィックスが振られ通信できるようになります。LANとほとんど変わらないような方式です。
しかしIPoE接続方式は主にNTT回線を利用するISPだけが対応していることがほとんどで、eo光では対応していません(回線認証を行う仕組みがないのでしょうか)。そのためeo光ではIPv6で通信する場合でも昔ながらのPPPoEを利用する必要があるのです。
またPPPoEでIPv6通信を行う際、IPv6通信のためのPPPoEセッションを別で張るマルチセッション方式と、IPv4IPv6を1つのPPPoEセッションで通信できるようにするシングルセッション方式があります*。
OCNなど一部の対応するISPでは前者の方式を、eo光では後者の方式を採用しており、eo光公式サイトではこの方式を「PPPoEによるデュアルスタック方式」と呼んでいます。
残念ながら今回用いるこのシングルセッション方式に市販のルータはほとんど対応していないため、専用のルータを使えというのが公式の言い分です。
しかし、CiscoのルータやNEC UNIVERGE、Yamaha RTXといった逸般的なルータならこの方式でも対応していますので、専用のルータなんか使わなくてもできちゃうわけです。

*PPPのプロトコルに注目して話をすれば、マルチセッション方式ではNCPのIPCPとIPv6CPはそれぞれ個別のPPPoEセッションにおいて動かされますが、シングルセッション方式ではこの2つを同じセッションで動かすということになります。

シナリオ

自宅からPPPoE経由のIPv6インターネット接続を提供するISP回線を利用し、IPv6通信を行えるように設定する。 ISPはシングルセッションのPPPoE接続においてIPv4IPv6の接続性を提供する。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サーバの設定。
VPNIPSecトンネルからトンネルを新規作成します。
「カスタム」を選び名前を入力します。こんな感じで設定します。

暗号化・認証方式は元々何個か入っているはずです。別に消さなくても接続できます。
ただ、実はこの設定だけでは足りない部分があります。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アドレス形式のみ設定できるので、それに倣ってCiscoIPアドレス形式にしています(CiscoでもIPアドレス形式を使って設定可能です)。
OSPFパケットが来ているのにルートが登録されない場合は、mtu-ignoreやredistributionの設定を行えば多分うまく行くと思います。

最後に

keyringを追加するなどすれば、さらに拠点が増えても接続できるようになると思います。私はこれ以上拠点間接続を増やせるのか実験できる環境がないので、本当にできるかどうかは分からないですが参考にはなるかと。
接続できるまではdebugログとの長い戦いでした。