「フレッツひかり」環境でBuffalo WiFiルータ配下のPC(Macbook air)からL2TP/IPSec VPNで接続し、ファイルサーバからデータを取得させようとした。
L2TP/IPSec VPNサーバーは、YAMAHA NVR510(アドレスは、vpnsv.xx.netvolante.jp。plalaのIPv4 PPPoEでglobal address)。ファイルサーバーは、Synology DS-220JでSMB接続とした。VPN接続後、ファイルサーバに接続できない。
相手の接続環境とVPNサーバー側のネットワークが「192.168.11.0/24」で同じだったことが原因だった。こちらのネットワークも昔BuffaloのWZR-HP-G300NHを使っていた。この時から「192.168.11.0/24」を使用している。手持ち機器のデフォルトネットワークを確認してみると「ひかり電話Home GateWay」が 「192.168.1.0/24」、「Yamaha NVR500/NVR510」が「192.168.100.0/24」を使用している。メジャーなルータ配下の機器からVPN接続すると同じネットワークで接続される確率が高く、接続障害の原因になる。
最近のIPv4 over IPv6接続では、自分のネットワーク端末から自分のネットワークへのVPN接続が異なるglobal address経由で出来る。テスト接続に便利であるが、同様の問題が発生する。同一ネットワークからのVPN接続が可能となる対策をNVR510(Rev.15.01.21)/NVR500(Rev.11.00.41)で検討してみた。
(1)NVR510/500 L2TP/IPSecVPN環境
「
NVR-500 VPN( L2TP/IPSec )接続設定」から設定内容を抽出。静的NATやセキュリティフィルタを除いてある。接続してくるVPN端末は、DHCPサーバーから192.168.11.0/24ネットワークのIPアドレスを設定している。VPN端末のARP応答をLAN1側で代理応答するよう「ip lan1 proxyarp on」を加えている。IPv4 over IPv6に1個のTUNNELが使われるため、残り3個がVPN接続に使える。下記設定は、ipsec tunnelが1個なので1接続となる。
NVR500.config/NVR510.config
ip lan1 address 192.168.11.250/24
ip lan1 proxyarp on
ip lan1 dhcp service server
ip lan2 address 192.168.1.51/24
dhcp service server
dhcp scope 1 192.168.11.2-192.168.11.63/24
pp select anonymous
pp bind tunnel2
pp auth request mschap-v2
pp auth username someone@somewhere xxxxxxxx
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp remote address pool dhcp
ip pp mtu 1280
pp enable anonymous
tunnel select 2
tunnel encapsulation l2tp
ipsec tunnel 2
ipsec sa policy 2 2 esp aes-cbc sha-hmac
ipsec ike keepalive use 2 off
ipsec ike nat-traversal 2 on
ipsec ike pre-shared-key 2 text COMMONKEY
ipsec ike remote address 2 any
tunnel enable 2
ipsec auto refresh on
ipsec transport 2 2 udp 1701
l2tp service on
L2TP/IPSecの同時接続数を増加するためには、TUNNELを増やす必要がある。NVR510/500は、最大4個までなのでtemplateを使わなくても負荷にならないが、修正や停止を考えるとtemplateを使用する方が良さそう。
templateで同時接続数を増やす記述
pp select anonymous
pp bind tunnel2-tunnel4
pp auth username someone2@somewhere2 xxxxxxxx
pp auth username someone3@somewhere3 xxxxxxxx
pp auth username someone4@somewhere4 xxxxxxxx
pp auth username someone5@somewhere5 xxxxxxxx
tunnel select 2
tunnel template 3-4
no tunnel select
ipsec transport template 2 3-4
template分のconfig詳細は、「show config tunnel 3
expand」で確認する(パラメータ部のid番号を注意深く設定しないとtemplate展開されないので注意が必要。正しく反映されるかexpandオプションで確認しておくのが良い。)。「tunnel 2」で「tunnel disable 2」とするとtemplateで反映し、tunnel 3、tunnel 4もdisableされるので便利。pp anonymousに複数ユーザアカウントを設定すれば、同時に3人まで接続することが出来るようになる。
(2)対応策検討
・
VPN接続時のIPアドレスを異なるネットワークアドレスに変更
VPN接続後にファイルサーバーからVPN経由でなく、直接パケットがVPN端末に送信されるのを防ぐ
no ip lan1 proxyarp on
pp select anonymous
no ip pp remote address pool dhcp
ip pp remote address pool 192.168.254.1-192.168.254.3
TUNNELが3個しか使えないので「192.168.254.1から192.168.254.3まで」の3個をVPN端末用に設定する。lan1インターフェースのproxy arpは不要になる。他のネットワークからルーターを介して192.168.254.0/24へのパケットがデフォルトルートあるいは静的経路情報で戻ってくる設定が必要になる。
・
192.168.11.0/24内のファイルサーバーアドレスをNATアドレスに変更する
NVR510は、MAP-E等に対応するため「ポートセービング」を標準とした。ポートセービング機能が動作していると
「PP」インターフェースの「anonymous」でNATが動作しない。「nat descriptor backward-compatibility 1」でNVR500と同様にポートセービング機能をオフ可能。DS-Liteは、AFTRでNATされるのでポートセービング機能が無くても問題無い。
ポートセービング機能を使用する場合は、特定ユーザだけPPインターフェースでVPN接続させPPインターフェースでNATするかLAN1 and/or LAN2でNATする事が出来そう。ファイルサーバーに複数アドレス設定が可能であれば、LAN1にsecondary address「192.168.254.5/24」を設定し、ファイルサーバ(DS-220J)に「192.168.254.254/24」を設定する事も可能。PP anonymousと同じネットワークで設定するとLAN1にProxy arpが必要。DS-220Jはコンソール接続で一時的な設定が可能(再起動で消失する)。
「PP anonymousでNAT」と「LAN1 and/or LAN2でNAT」の設定を確認してみる。また、「PPでNAT」も検討してみる。
(3)PP anonymousでNAT
NVR510コマンドリファレンス(
NVR500)情報だけでNAT設定するのは困難なので
NATディスクリプタのヤマハ技術資料(
NATデスクリプタコマンド仕様)を参考にした(1995年のrt100i頃から続く情報)。L2TP/IPSec VPN接続すると192.168.254.1-3範囲の一つがpeerアドレスとして割り当てられる。(1)の設定で、VPN接続後「192.168.254.1」が割り当てられたとする。このアドレスからNAT変換で宛先アドレス192.168.254.240から192.168.11.240へ変換してファイルサーバーへ送信。ファイルサーバーからの応答パケットは、送信元アドレスを変換して192.168.254.1で受信する。VPN端末側アドレスが外側、ファイルサーバーアドレスが内側のNATディスクリプタでPP anonymousインターフェースに順方向に設定する。ファイルサーバーの外側アドレスに192.168.254.240(内側アドレスは、192.168.11.240)の静的NATとする。静的NATが設定されていてもaddress outerが必要。address outerは、静的NATの外側アドレスと同じIPとし、動的NATが発生しないようにする。address outerだけだとデフォルトでaddress innerがautoとなる。意図しない動的NAT変換を防ぐため、address innerに192.168.11.240を指定しておく。VPN接続時に「ppp ipcp msext on」でDNSアドレス192.168.11.250が渡される。同時にこのアドレスは、VPN端末のルートテーブルにホストルートでVPNサーバーに送信するよう設定される。pp anonymousインターフェースに設定された順方向NATディスクリプタで192.168.254.240以外のNAT policyが無いので宛先パケットが棄却される(コマンド仕様及び技術資料)。しかし、仕様と異なり192.168.11.250のDNSが使える。自己アドレスと同じだからか?NATディスクリプタにマッチしない宛先にもアクセス出来る。
NATディスクリプタ内向き設定に該当しないパケットの扱い設定「nat descriptor masquerade incoming
nat_descriptor action」でスルーさせても「TCPポート0-1023までのパケットは、破棄されると仕様に記載されている。PPanonyousインターフェースでは、仕様と異なるので不具合かもしれない。本件対応上の問題は無い。
「nat descriptor backward-comptibility 1」は、NVR510に必要でNVR500は不要。
NVR510
pp select anonymous
ip pp nat descriptor 20
nat descriptor backward-compatibility 1
nat descriptor type 20 nat
nat descriptor address outer 20 192.168.254.240
nat descriptor address inner 20 192.168.11.240
nat descriptor static 20 1 192.168.254.240=192.168.11.240 1
「nat descriptor backward-compatibility」を変更すると再起動が必要となる。
(4)LAN1 and/or LAN2でNAT
ポートセービングが必要な場合、PP anonyous以外のLAN1やLAN2でNATする必要がある。LAN2側にネットワーク接続が無い場合(PPPoE接続だけ等の場合)、LAN1側だけで良い。ひかり電話HGWの配下にNVR510を配置しIPv4 PPPoEでインターネットに接続している。ひかり電話HGW設定のためLAN2を介して「192.168.1.1/24」に接続する必要があるため、LAN2側もNAT設定する。
L2TP/IPSec VPNで接続するVPN端末は、192.168.254.1が割り当てられたとする。LAN1は、192.168.11.0/24ネットワークにアドレス192.168.11.250で接続されている。ファイルサーバーは、アドレスを192.168.253.240とし、NATで192.168.11.240へ接続させる。LAN2は、192.168.1.0/24ネットワークにアドレス192.168.1.51で接続されている。ひかり電話HGWは、アドレス192.168.1.1である。192.168.1.0/24ネットワーク上のホストから192.168.11.0/24ネットワークのホストへは、LAN2で192.168.253.0/24ネットワークのホストへNAT変換し、LAN1で再度192.168.11.0/24ネットワークのホストへNAT変換させる。(
技術資料のTwiceNATのような設定)
NVR510/NVR500
ip route 192.168.253.0/24 gateway 192.168.11.240
ip lan1 nat descriptor reverse 30
ip lan2 nat descriptor 40
no nat descriptor backward-compatibility 1
nat descriptor type 30 nat
nat descriptor address outer 30 192.168.253.254
nat descriptor address inner 30 192.168.11.254
nat descriptor static 30 1 192.168.253.2=192.168.11.2 253
nat descriptor type 40 nat
nat descriptor address outer 40 192.168.11.254
nat descriptor address inner 40 192.168.253.254
nat descriptor static 40 1 192.168.11.2=192.168.253.2 253
VPN端末の送信元アドレス192.168.254.1からファイルサーバーアドレス192.168.253.240宛へnat descriptor 30で192.168.11.240宛にNATする。ファイルサーバーからの戻りのパケットは、送信元192.168.11.240で宛先192.168.254.1をnat descriptor 30で送信元192.168.253.240へNATする。LAN1インターフェースにnat descriptor 30を逆方向で変換する。
nat descriptor 40は、LAN2側のネットワークからLAN1側の192.168.11.0/24ネットワークへ向かわせるため、宛先アドレスを192.168.253.0/24上のホストにNATする。戻りのパケットは、送信元アドレスが192.168.253.0/24のホストアドレスになるのでnat descriptor 40で送信元192.168.11.0/24のホストアドレスにNATする。
192.168.253.0/24宛のホストは、経路設定でLAN1インターフェースへ向かわせたいがgatewayは、IP指定する必要がある。LAN1インターフェースに設定された192.168.11.250とすると
ルータの自己アドレスとNATの関係で示されるようにnat descriptor 30でNATされない。192.168.11.0/24上の経路制御機能を持つホストを指定するかホストgatewayとして指定する必要がある(NVR510で経路エントリー数が約10,000なので192.168.11.0/24上のホスト全部をホストゲートウェイ設定しても大丈夫そう)。
例えば、192.168.11.5がファイルサーバーであれば、「192.168.253.5/32 gateway 192.168.11.5」と経路情報を設定しおく(WindowsOSのファイル共有であれば、firewall設定で許可しておく必要がある)。DS-220Jは、LinuxOSなので経路制御してくれる。
DHCP不具合の解決策
LAN1側に接続されるホストにDHCPサーバー機能でIP設定とネットワーク情報設定を行っている。NAT設定を行うとDHCP応答に時間が掛かるようになる。renewも出来なくなるようだ。nat descriptorの条件を変えテストしてみた結果、下記条件で発生する。
インターフェースに逆方向(reverse)でnat descriptorを設定
nat descriptorにinnnerアドレスが設定されている
複数のstatic設定がされている
NATをどのように設定したら解決するか判らなかった。
DHCP Relayを使用し、LAN2側へrelay(
ルータの自己アドレスとNATの関係で示されるように内部的に DHCPアプリへrelayされると推定した)する事で回避した。
DHCP Relay
ip lan1 dhcp service relay 192.168.1.51
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.11.2-192.168.11.63/24
遅延もなくスムーズに動作する。
サブネットワーク接続の問題と解決
LAN1側の192.168.11.0/24ネットワークにゲートウェイ(192.168.11.251)を介してサブネットワーク(192.168.4.0/24)が接続された場合の問題
NVR510の経路情報
ip route 192.168.4.0/24 gateway 192.168.11.251
192.168.11.0/24ネットワークに接続されたホストは、default routeでNVR510(192.168.11.250)が設定されている。これらのホストから192.168.4.0/24ネットワークのホストへは、送信元192.168.11.nnnで宛先192.168.4.mmmのパケットがNVR510にLAN1インターフェースを介して渡される。NAT descriptor 30で送信元が192.168.253.nnnに変換され、経路情報に従いLAN1インターフェースから192.168.11.251ゲートウェイへ渡される(送信元192.168.253.nnnで宛先192.168.4.mmm)。ゲートウェイへ渡すパケットは、送信元192.168.11.nnnで宛先192.168.4.mmmとなるよう再度NAT変換する必要がある。
NAT descriptor 31
ip lan1 nat descriptor 31 reverse 30
nat descriptor type 31 nat
nat descriptor address outer 31 192.168.11.254
nat descriptor address inner 31 192.168.253.254
nat descriptor static 31 1 192.168.11.2=192.168.253.2 253
nat descriptor 31で送信元192.168.253.nnnを送信元192.168.11.nnnにNAT変換するようLAN1インターフェースで順方向に設定する。
順方向設定されたnat descriptorのouter addressがproxy arp応答する
LAN1/LAN2インターフェースに順方向で設定されたnat descriptorのouter addressがproxy arp応答する。nat descriptor 31でstatic設定しているouter側アドレス192.168.11.2-254のアドレスがproxy arp応答するため、192.168.11.0/24ネットワーク上のホストとIPの2重登録状態が発生する。LAN1/LAN2共に「ip interface proxyarp off」の設定であるがproxy arp応答する。このproxy arpを止める方法が無いのでLANインターフェースと同じネットワークのouter addressを順方向設定しないようにする必要がある(NAT設定されたLANインターフェースのネットワークにサブネットワークを構成出来ない)。
ホームネットワークでは、サブネットワークの必要性が少ないので大きな問題にはならないと思うが、、、
nat descriptor設定内でproxyarp on/offが設定できると良い。
回避策として
・インターフェースのネットワークと同じアドレスを順方向のNATディスクリプタに設定しない
・サブネットワークへdefault経路経由で転送されないようDHCP等で経路情報を指定する
重複IP設定状態時の問題
192.168.5.0/24ネットワークに192.168.5.3のホストとNVR500のLAN1に順方向でouter addressが192.168.5.2-254のstatic NATを設定してarping 192.168.5.3とした時のarp応答
nat descriptorが順方向に設定されたインターフェースのネットワークとouter addressが同じネットワークだとホスト間の通信がNVR500に誘導され予期しないNATや経路制御で通信がループしたり通信が出来なくなる事が発生する。
Windows OSのDHCPでは、重複IP設定エラーとなる
静的設定に変更すると
Automatic
Private
IP Addressingが動作し、静的設定が有効にならない。
APIPA機能を停止する
Disable APIPA
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
IPAutoconfigurationEnabled DWORD 0
設定後、再起動が必要。自動プライベートIP設定が停止するが、重複IP設定検出機能が働き、静的IP設定が有効にならない。
重複IP設定チェック機能を停止する
Disable Gratuitous ARP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
ArpRetryCount DWORD 0
設定後、再起動が必要。これで、DHCPによるIPv4アドレス取得も、IPv4静的設定も上手くいく。重複IP設定状態になるので解決にはならない。
macOSでも重複IP設定検出でDHCPがAllocate/Declineを繰り返す。静的IP設定にすれば、重複IP設定であると警告されるが利用できる。
設定オフできるか不明。重複IP設定状態になるので解決にはならない。
Debian10+dhclientでは、重複IP設定チェックされていないようで問題無く利用できる。重複IP設定状態になるので解決にはならない。
NATディスクリプタ内向き設定に該当しないパケットの扱い
変換テーブルにマッチしないパケットは、「through」「reject」「discard」「forward」が選択出来、初期値は、rejectとなっている。インターフェースに順方向に設定されたnat descriptor内向きパケットは、policyにマッチしない場合、破棄される仕様。PP anonymousでもLAN1/LAN2でも破棄されなかったのでnat typeを変更して調べてみた。
nat descriptor type
(nat): pass
(nat-masquerade): pass
(masquerade): reject
基本rejectでnat type noneのディスクリプタでpassする仕様だと良いような気がする。
最終的な設定
LAN1 and/or LAN2 NAT for NVR500/NVR510
ip lan1 address 192.168.11.250/24
ip lan1 nat descriptor reverse 30
ip lan1 dhcp service relay 192.168.1.51
ip lan2 address 192.168.1.51/24
ip lan2 nat descriptor 40
ip route 192.168.253.240/32 gateway 192.168.11.240
nat descriptor type 30 nat
nat descriptor address outer 30 192.168.253.254
nat descriptor address inner 30 192.168.11.254
nat descriptor static 30 1 192.168.253.2=192.168.11.2 253
nat descriptor type 40 nat
nat descriptor address outer 40 192.168.11.254
nat descriptor address inner 40 192.168.253.254
nat descriptor static 40 1 192.168.11.2=192.168.253.2 253
dhcp service server
dhcp scope 1 192.168.11.2-192.168.11.63/24
dhcp scope bind 1 192.168.5.5 ethernet 00:30:f5:CC:DD:EE
dhcp scope option 1 classless_static_route=18,c0,a8,04,c0,a8,05,05,00,c0,a8,05,01
DHCPの静的経路情報配布を設定する。サブネットワークは、192.168.4.0/24(C0,A8,04,00/18)でゲートウェイが192.168.5.5(C0,A8,05,05)。デフォルトルート(00,C0,A8,05,01)も設定しておく。サブネットワークのルータは、
子羊ルータでWAN側がDHCP。IP固定とするためscope bindで指定。ファイルサーバーは、VPN端末からVPN接続後、「192.168.253.240」で接続。VPN端末の接続ネットワークが「192.168.11.0/24」以外であれば、VPN接続後、「192.168.253.240」あるいは「192.168.11.240」で接続。
(5)PPでNAT
PPインターフェースで特定ユーザーをL2TP/IPSec接続させる設定が必要となる。サーバー側には、固定IPアドレスが必要となる。接続クライアントのIPが固定であれば「ipsec ike remote addres aaa.bbb.ccc.ddd」で指定すれば良いが、不特定なので「ipsec ike remote name special-host」「ipsec ike remote address any」のaggressiveモードでの接続を試みた。
PP NAT for NVR500/NVR510
pp select 2
pp name L2TP-IPSec-Special
pp bind tunnel4
pp auth request mschap-v2
pp auth username someone10@somewhere10 xxxxxxxx
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp remote address 192.168.254.10
ip pp nat descriptor 20
pp enable 2
tunnel select 4
ipsec ike remote address 4 any
ipsec ike remote name 4 special-host
Macbook pro(macOS Mojave-10.14.6)のL2TP/IPSec(raccoon)を使い「my_identifier keyid tag "special-host";」「exchange_mode aggressive;」で接続。
nvr500 aggressive mode
info,user Apr 3 10:51:33 nvr500-lan2.familyname [IKE] respond ISAKMP phase to 192.168.11.8
debug,user Apr 3 10:51:33 nvr500-lan2. familyname [IKE] add ISAKMP context [862] 67927e0791374f82 00000000
debug,user Apr 3 10:51:33 nvr500-lan2. familyname [IKE] receive message from unknown gateway 192.168.11.8
debug,user Apr 3 10:51:34 nvr500-lan2. familyname [IKE] inactivate context [862] 67927e0791374f82 00000000
debug,user Apr 3 10:51:34 nvr500-lan2. familyname [IKE] delete ISAKMP context [862] 67927e0791374f82 00000000
aggressive modeでIdentificationデータがKEY-ID(11)で「specialーhost」が送付されている。しかし、nvr500では、認識しないようだ。
main modeへ設定変更
tunnel select 4
ipsec ike remote address 4 192.168.11.8
no ipsec ike remote name 4 special-host
remoteアドレスを指定してmainモードで接続
nvr500 log main mode
info,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] respond ISAKMP phase to 192.168.11.8
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] add ISAKMP context [866] edd3da9ab14e67e0 00000000
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] invalid ISAKMP proposal
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] ISAKMP SA attribute (hash algorithm) 6
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] NAT Traversal: NAT box detected, start keepalive timer
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] add ISAKMP SA[1] (gateway[4])
debug,user Apr 3 11:17:31 nvr500-lan2.familyname [IKE] activate ISAKMP socket[4]
info,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] respond IPsec phase to 192.168.11.8
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] add IPsec context [867] edd3da9ab14e67e0 f6eebe82
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] setup IPsec SAs (gateway[4], ISAKMP SA[1])
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] add IPsec SA[2]
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] add IPsec SA[3]
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] activate IPsec socket[transport:4](inbound)
info,user Apr 3 11:17:32 IP Tunnel[4] Up
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] activate IPsec socket[transport:4](outbound)
debug,user Apr 3 11:17:32 nvr500-lan2.familyname [IKE] IPsec socket[transport:4] is refered
info,user Apr 3 11:17:32 nvr500-lan2.familyname [L2TP] TUNNEL[4] connected from 192.168.11.8
info,user Apr 3 11:17:32 nvr500-lan2.familyname [L2TP] TUNNEL[4] tunnel 7441 established
info,user Apr 3 11:17:32 nvr500-lan2.familyname [L2TP] TUNNEL[4] session 29044 established
debug,user Apr 3 11:17:32 nvr500-lan2.familyname PP[02] SEND LCP ConfReq in STARTING
L2TP/IPSecがtunnel 4で接続され、ppインターフェースで認証接続。NVR500仕様でipsec ike remote nameの「 type パラメータは相手側セキュリティ・ゲートウェイの判別時に考慮されない」と規定されいるので、tunnel 4、pp 2での接続が選択されないようだ。NVR510は未確認。「key-id」指定で接続出来てもクライアントにkey-id指定するのが容易で無い。この方法は、現実的でない。