新しいAndroid OSはVPNの方法としてL2TPなどが削除されてIKEv2/IPSecじゃないと繋がらない。
しかし、自宅のNEC IXルータではIKEv2/IPSecでのリモートアクセスに関する情報が見当たらないので一旦諦めて、WiFi APとして使ってたTP-LinkルータにOpen VPNサーバ機能あったから、IXからOpenVPNトラフィックをTP-Linkに通して通信なんて言う事をしていたけど、やっぱりルータもスマホも標準機能で済ませたいので、自宅のNEC IX2235ルータで設定に挑戦した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
ip route default Tunnel10.0 ikev2 authentication psk id rfc822-addr {メアド} key char {パスワード} ikev2 default-profile child-pfs 2048-bit child-proposal enc aes-gcm-128-16 child-proposal integrity sha2-256 dpd interval 10 local-authentication psk id ipv4 {着信インタフェイスのIP} nat-traversal keepalive 10 sa-proposal enc aes-gcm-128-16 sa-proposal integrity sha2-256 sa-proposal dh 2048-bit sa-proposal prf sha2-256 ipsec-mode tunnel interface Tunnel10.0 tunnel mode ipsec-ikev2 ip unnumbered {LANインタフェイス名} ip mtu 1420 ip tcp adjust-mss auto ikev2 connect-type auto ikev2 ipsec pre-fragment ikev2 nat-traversal keepalive 20 ikev2 negotiation-direction responder ikev2 outgoing-interface {着信インタフェイス} ikev2 ipsec-mode tunnel ikev2 peer any authentication psk id rfc822-addr {メアド} |
これでAndroidから取りあえず繋がります。
Pixel7のVPN設定でIKEv2/IPSec PSK選択、サーバアドレスに{着信インタフェイスのIP}、IPSecIDに{メアド}、事前共有鍵に{パスワード}を設定します。 Androidちゃんで接続を試行するとしっかりと接続しました表示になり、IX側でもsa/child-saがあって繋がっていて、パケットも流れますし、LANへの通信も外向きの通信もPPPoEでNATされた状態になります(Android側でcman接続)
しかし、非常に遅いです。 原因を探るためにAndroid側からpingを打つとパケットが欠落したり応答時間が数十msから数百msで大きく変動しています。
何故か?
スマホ側に対してIPを払い出せないので、グローバルIPを持った状態で、これに対してIX側がウマいことルーティングできないので、自宅内からネットに繋ぐためのip route default GigaEthenert0.1に加えてip route default Tunnel10.0を記述して取りあえず通信出来る状態にしましたが、どちらに行くかは確率になってしまうためです。
ipsec-ikev2 Tunnelに対してdhcp bindingは出来ない、dhcp relay設定は出来るけど動作しない、ppp bindingを当ててもダメ、LAN側のIPを割り当てる作戦は出来ません。
では何とかならないのかと検証して、トンネルモードで繋がっているなら対向のプライベートアドレスに対してルートを設定すれば良いのでは?と言う事を考えるも、スマホで仮想ネットワークとか作ってルート設定とかは相当なハックで一般化できません。
IXを全てデバッグモードにしてログを全読みしていると、NAT-Tが動いていることに気付きました。 そして、試験でIXのHTTP画面アクセスしたときのログに100.88.x.xと言うIPアドレスがありました。
このNAT先のアドレスに対してルートを設定すれば良いのでは・・・?
1 |
ip route 100.64.0.0/10 Tunnel10.0 |
ip route default Tunnel10.0を削除してこれを入れて一応成功しました。
これはau 5Gで繋いでいる場合に適用でき、auが内部でキャリアリザーブIP範囲100.64.0.0/10を利用しているからです。 利用しているキャリアによって普通のプライベートアドレス範囲である10.0.0.0/8等から切り出していることもあります(Ymobileはこれだった)ので、各自の端末で確認して設定しましょう。
キャリアリザーブは衝突しませんが、10.0.0.0/8等のプライベートで切り出している場合、クラウドへのVPNで衝突することが考えられます。 私のGCP VPCが10.0.0.0/8の範囲に構成されているので衝突してしまうのでYmobileからの接続は諦めましたが、クラウドへVPN接続を張っていないなら、自宅のプライベートと被らないなら設定するのも良いでしょう(クラスAを自宅で使うのは通常不要なので、テスト構成とかで使ってるケースはあるとしても、大人しくクラスCに構成変更で良いでしょう) クラスAは広大なので、VPC側で実際に使うサブネットを小さくして、殆どのアドレスを開けてしまうと言う雑な方法は不完全ですがあり得ます。
使われているプライベートIPを簡単に調べる方法は、IXへVPN張った状態でのIX HTTPアクセスして、IXでshow logすればACLで弾かれたアドレスとしてスマホ側NAT内部アドレスが表示されます。
1 2 |
Router(config)# sh log HTTP.005: Connection was refused by access-list, foreign host 10.88.x.x, local host 192.168.2.1 |
foreign host部にトンネルを通ってきた対向IPが表示されていますので、このIPが衝突しないならip routeで設定すれば良いでしょう。
これで出先のスマホから自宅の固定IPででることが出来て、IP制限している本番サイト等に繋がる様になりました。
LAN側リソースを使いたい場合・・・
ローカルホスト側Windowsなどにアクセスしたい場合、そのままではpingが通りません。
LAN上で直接pingが通る場合でも、Windows Firewallで明示許可しないと通らない挙動です。 RDPやファイル共有を使う場合も同様に設定が必要ですのでそれぞれの環境で対応しましょう。
リモートアクセスVPNとして使えていますが、実際はトンネリングしてそれぞれのIPで通信しているので、LAN側の着信としてはスマホのグローバルでも無い内部のIPとして見える都合です。
前提が最後になりますが、普通にネットに繋がる状態になっている事は必須です。
L2TPを使っていたので着信インタフェイスにIPSecに必要なNAPT設定もある前提です(ESP, ポート500/4500がフィルタされず着信できること)
route-mapして居る人はip route以外に、適切な優先度でmatch ip address 対向ネットワークを、set interface Tunnelしてやることも必要です。
週末丸ごと使って何とか使い物になる状態になりました。
フルスタックエンジニアだけど、最近は殆どクラウドいじってばっかりでこんなネットワーク機器なんて触らないんで仕事の役には全くたたないけど自分的な実用性はあるのでOKって事で。
しっかし、NECさんも設定事例集にL2TP/IPSecしか載せてないし、IKEv2は拠点間情報だけだから困るよね。 結局、Android設定とか諸々はYAMAHAさん、CISCOさん、Alliedさんなんかの情報を見て、IXはIP払い出し機能が無いから普通には繋がらないなって言う対処切り分けが出来た。 コマンドリファレンスにも適用できるインタフェイス種類とかの情報が無いので、実際にコンソールでtab打って候補にあるコマンドを片っ端から調査する羽目に。で、最終的にloggingをdebugにしてひたすら状況追いかけて、お互いの通信内容読んでどこで引っかかってるか確認して、その問題を回避するための設定を考えて適用してを繰り返して何とか繋がった。
まぁ、繋がったからヨシ!
Androidコンフィギュレーションして、繋がって、WiFiオフでTracerouteするとトンネルを通ってるからネクストホップがIXのLAN IPで2ホップでLAN上のマシンに届く。 ツールで確認すると、端末IPはキャリアリザーブで、グローバルから見えるIPはVPNサーバの着信ポイントと同じプロバイダのアドレスになっている。
(389)