iPhone(iOS)・Mac <-> Fortigate間VPNでLAN環境にリモート接続する

VPN IPsecFortigate,iOS,IPsec,VPN

はじめに

iPhoneとMacからFortigateにVPN接続しLAN環境へリモート接続をします。
また、インターネットへ接続の場合はFortigate経由ではなく直接インターネットへ抜けるようにします。

構成・要件

要件は下記の通りとします。

  • Fortigateのwan側インタフェースはグローバルIPアドレスを直接持ちa.example.comのFQDNが割り当てられています。
  • VPNトンネルを通る通信は宛先IPが192.168.0.0/16のサブネット内だった場合とします。(図ではinternal1が/24に割り当てられていますが、更に配下に/24のサブネットが複数存在します)
  • インターネット向け通信はVPNトンネルは通らず、直接インターネットから抜けるようにします。VPNトンネルを通りFortigateからインターネットへ抜けさせることも可能ですがトラフィックフローとして無駄なため。(※以下、補足あり)
  • VPN接続時にユーザIDとパスワードを使い認証することが可能になるXAUTH機能を使います。

※補足:明示的に指定した宛先IPアドレスに合致したパケットのみVPNトンネルへ通す技術をスプリットトンネルと言います。例えば、今回の要件の様に、LAN側アドレスをスプリットトンネルの対象にし、それ以外はすべてインターネットへ抜けさせると言ったことが可能です。

下記は今回検証で使用する機器とOS Versionです。

用途機器OS Version
VPN装置Fortigate 60Dv6.0.10 build0365
VPNクライアントiPhone XiOS 14.0.1
VPNクライアントMacBook Pro 13inch 201710.15.7

Fortigateの設定

Fortigateの設定について説明します。(なお、インタフェースやルーティング等の基本的な設定は割愛します)

ユーザ作成

XAUTH機能用のユーザIDを作成します。

なお、今回はkantaroのアカウントのみ作成しますが、もし複数人でVPN接続する場合は「config user local」で人数分のアカウントを作成し、『config user group』に割り当てます。

config user local
    edit "kantaro"
        set type password
        set passwd [任意のパスワード入力]
    next
end

config user group
    edit "VPN-GROUP_ADMIN"
        set member "kantaro"
    next
end

スプリットトンネル用のAddress Objectの作成

スプリットトンネル用のアドレスオブジェクトを作成します。当方の環境はLANをすべて『192.168.0.0/16』内で払い出しているため下記の設定となっています。

config firewall address
    edit "ADDR_192.168.0.0/16"
        set subnet 192.168.0.0 255.255.0.0
    next
end
config firewall addrgrp
    edit "ADGRP_ALL-LAN"
        set member "ADDR_192.168.0.0/16"
    next
end

IPsec Phase1/Phase2の作成

『config vpn ipsec phase1-interface』では「set ipv4-start-ip」「set ipv4-end-ip」で設定したIPアドレスからクライアントのIPアドレスが割り当てられます。

config vpn ipsec phase1-interface
    edit "VPN-IOS_ADM"
        set type dynamic
        set interface "wan1"
        set peertype any
        set mode-cfg enable
        set proposal 3des-sha256 aes128-sha256 aes192-sha256 aes256-sha256
        set dhgrp 14
        set xauthtype auto
        set authusrgrp "VPN-GROUP_ADMIN"
        set ipv4-start-ip 172.16.20.1
        set ipv4-end-ip 172.16.20.100
        set ipv4-split-include "ADGRP_ALL-LAN"
        set client-keep-alive enable
        set psksecret [任意のパスワード入力]
    next
end
config vpn ipsec phase2-interface
    edit "VPN-IOS_ADM"
        set phase1name "VPN-IOS_ADM"
        set proposal 3des-sha256 aes128-sha256 aes192-sha256 aes256-sha256
        set pfs disable
        set keepalive enable
    next
end

Firewall Policyの作成

全許可設定としましたが、限られた通信のみ許可したい場合はアドレスやサービス等の設定を細かく設定する必要があります。

config firewall policy
    edit 104
        set name "INET_IOS_ADMIN-->LAN"
        set srcintf "VPN-IOS_ADM"
        set dstintf "internal1"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set fsso disable
    next
end

VPNクライアントのiPhoneとMacの設定

iPhoneの設定

まず、VPNクライアントの設定を行います。下記に進みVPNの設定画面を表示します。

  設定>一般>VPN>VPN構成を追加…

VPNの設定画面が出たら下記のスクリーンショットの通り進めます。※パスワードやFQDN等の情報は一部マスキングしています

接続時間が表示されていればVPN接続はできています。iPhoneの設定は以上です。

Macの設定

パラメーターとしてはiPhoneと同様です。まずはiPhoneと同様、VPNクライアントの設定を行います。下記に進みVPNの設定画面を表示します。

  デスクトップ左上のAppleマーク>システム環境設定…>ネットワーク

ネットワークの設定画面が出たら下記のスクリーンショットの通り進めます。※パスワードやFQDN等の情報は一部マスキングしています

接続時間が表示されればVPN接続はできています。Macの設定は以上です。

Fortigate ステータス確認

次にiPhoneとMacから同時にVPN接続をしている状態でFortigateのステータスを確認します。

まずはルーティングテーブルから確認します。6行目と7行目にVPNクライアントのIPアドレス宛てのルーティングが自動でインストールされます。

FGT60D # get router info routing-table all

<省略>
S*      0.0.0.0/0 [5/0] via 61.26.68.129, wan1
C       61.26.68.128/25 is directly connected, wan1
S       172.16.20.1/32 [15/0] via 103.90.18.251, VPN-IOS_ADM
S       172.16.20.2/32 [15/0] via 133.236.182.81, VPN-IOS_ADM
C       192.168.0.0/24 is directly connected, internal1
<省略>
FGT60D #

「diagnose vpn ike gateway list」でVPNの状態を確認します。接続できていると『id/spi~DPD』の行までが表示されます。iPhoneとMacの2クライアント接続なので2箇所の表示があります。

FGT60D # diagnose vpn ike gateway list

vd: root/0
name: VPN-IOS_ADM_0
version: 1
interface: wan1 5
addr: 61.26.68.197:4500 -> 103.90.18.251:4500
created: 167s ago
xauth-user: kantaro
assigned IPv4 address: 172.16.20.1/255.255.255.255
nat: peer
IKE SA: created 1/1  established 1/1  time 750/750/750 ms
IPsec SA: created 1/1  established 1/1  time 190/190/190 ms

  id/spi: 38 f242281e7e0259e3/8ced04dcf1496ab0
  direction: responder
  status: established 167-166s ago = 750ms
  proposal: aes256-sha256
  key: 4c7307b983602429-74b29495d234f857-3fcb7a14416fbe7e-413697009f75842e
  lifetime/rekey: 3600/3163
  DPD sent/recv: 00000000/00000000

vd: root/0
name: VPN-IOS_ADM_1
version: 1
interface: wan1 5
addr: 61.26.68.197:4500 -> 133.236.182.81:4500
created: 153s ago
xauth-user: kantaro
assigned IPv4 address: 172.16.20.2/255.255.255.255
nat: peer
IKE SA: created 1/1  established 1/1  time 170/170/170 ms
IPsec SA: created 1/1  established 1/1  time 50/50/50 ms

  id/spi: 39 19108fe28a941efa/45a1a4f91743747e
  direction: responder
  status: established 153-152s ago = 170ms
  proposal: aes256-sha256
  key: 7132aa60d555ffdd-d022a726858699b3-21ad5a5e03eca8fe-212977a94be348c2
  lifetime/rekey: 3600/3177
  DPD sent/recv: 00000000/00000000

FGT60D #

「diagnose vpn tunnel list」でVPNの状態を確認します。接続できていると『src~npu』の行までが表示されます。iPhoneとMacの2クライアント接続なので2箇所表示されます。

FGT60D # diagnose vpn tunnel list
list all ipsec tunnel in vd 0
------------------------------------------------------
name=VPN-IOS_ADM_0 ver=1 serial=e 61.26.68.197:4500->103.90.18.251:4500
bound_if=5 lgwy=static/1 tun=intf/0 mode=dial_inst/3 encap=none/392 options[0188]=npu rgwy-chg rport-chg
 parent=VPN-IOS_ADM index=0
proxyid_num=1 child_num=0 refcnt=5 ilast=13 olast=173 ad=/0
stat: rxp=0 txp=0 rxb=0 txb=0
dpd: mode=on-demand on=1 idle=20000ms retry=3 count=0 seqno=0
natt: mode=silent draft=32 interval=10 remote_port=4500
proxyid=VPN-IOS_ADM proto=0 sa=1 ref=2 serial=1 add-route
  src: 0:192.168.0.0-192.168.255.255:0
  dst: 0:172.16.20.1-172.16.20.1:0
  SA:  ref=3 options=a7 type=00 soft=0 mtu=1280 expire=3419/0B replaywin=1024
       seqno=1 esn=0 replaywin_lastseq=00000000 itn=0
  life: type=01 bytes=0/0 timeout=3591/3600
  dec: spi=3120eb96 esp=aes key=32 8530977043eda45ccb8b8d28a8f49a2772cfaad0942553379f50271488264579
       ah=sha256 key=32 46506b1b2e0074f87da7b90c3a32f3f053cf446d625cd0561993996160c7cf67
  enc: spi=0d6c134f esp=aes key=32 62df97d280a03a7201fad634e7c2f36f5d1f2fab2edc6ff133557b198c654ea6
       ah=sha256 key=32 066a1d359caeb55d6672c926ea1dfda6cb9fb523565bc76fc004e27fe2d68a61
  dec:pkts/bytes=0/0, enc:pkts/bytes=0/0
  npu_flag=00 npu_rgwy=103.90.18.251 npu_lgwy=61.26.68.197 npu_selid=a
------------------------------------------------------
name=VPN-IOS_ADM_1 ver=1 serial=f 61.26.68.197:4500->133.236.182.81:4500
bound_if=5 lgwy=static/1 tun=intf/0 mode=dial_inst/3 encap=none/392 options[0188]=npu rgwy-chg rport-chg
 parent=VPN-IOS_ADM index=1
proxyid_num=1 child_num=0 refcnt=6 ilast=0 olast=0 ad=/0
stat: rxp=5250 txp=5377 rxb=2228688 txb=3276890
dpd: mode=on-demand on=1 idle=20000ms retry=3 count=0 seqno=0
natt: mode=silent draft=32 interval=10 remote_port=4500
proxyid=VPN-IOS_ADM proto=0 sa=1 ref=2 serial=1 add-route
  src: 0:192.168.0.0-192.168.255.255:0
  dst: 0:172.16.20.2-172.16.20.2:0
  SA:  ref=6 options=a7 type=00 soft=0 mtu=1422 expire=3426/0B replaywin=1024
       seqno=1500 esn=0 replaywin_lastseq=00001480 itn=0
  life: type=01 bytes=0/0 timeout=3585/3600
  dec: spi=3120eb97 esp=aes key=32 c8b94ab8f527c0ba74be17b37ac16b3bc362b221e482182b0ccb303bd2059881
       ah=sha256 key=32 d269c8b8a477df069edb769d599ab74f69eb04bfa39585b479a37ea41c7b7709
  enc: spi=0422d225 esp=aes key=32 f1744aa4cb34ec44aaeda1af216b936171fd7fe16d167eb1fc66b3f3921df182
       ah=sha256 key=32 7b7c3b4fe39adf2c323542ded69e5f477847285f8a0cd292f1f941ef406314dd
  dec:pkts/bytes=5250/2228520, enc:pkts/bytes=5382/3277622
  npu_flag=03 npu_rgwy=133.236.182.81 npu_lgwy=61.26.68.197 npu_selid=b

FGT60D #

動作確認

iPhoneを使って動作確認します。観点は二つ。一つはVPNトンネルを通りLAN側にあるWebサーバへ接続できることを確認します。もう一つはインターネットへ直接抜けているかを確認する為Facebookへアクセスします。(スプリットトンネル機能の確認です)
どちらもFortigateでパケットキャプチャを仕掛けた状態で実施します。

VPNトンネルを通りLAN側Webサーバへ接続

まずはFortigateでパケットキャプチャをします。

FGT60D # diagnose sniffer packet VPN-IOS_ADM

次にiPhoneから内部のサーバに接続します。https://192.168.100.10(ESXiの管理ページ)

接続したところ上記の通り表示されました。また下記ではVPNインタフェースでパケットが流れてきていることが確認できます。

FGT60D # diagnose sniffer packet VPN-IOS_ADM
interfaces=[VPN-IOS_ADM]
filters=[none]
pcap_lookupnet: VPN-IOS_ADM: no IPv4 address assigned
11.957006 172.16.20.1.49716 -> 192.168.100.10.443: syn 757645711
12.008369 192.168.100.10.443 -> 172.16.20.1.49716: syn 1935264203 ack 757645712
12.056945 172.16.20.1.49716 -> 192.168.100.10.443: ack 1935264204
12.145957 192.168.100.10.443 -> 172.16.20.1.49716: 1935264204 ack 757646229
12.146109 192.168.100.10.443 -> 172.16.20.1.49716: psh 1935265432 ack 757646229
<以下、省略>

LAN側のVPNトンネル通信の確認は以上です。

インターネットへ直接抜ける確認

次にインターネットへ直接抜ける通信確認をします。確認方法として、Fortigateでパケットキャプチャをした状態でFacebookへ接続し、パケットキャプチャ上に何も表示されないことを確認します。

FGT60D # diagnose sniffer packet VPN-IOS_ADM

Facebookのログイン画面に接続してみました。

インターネット側のFacebookも正常に表示されます。また想定通り下記のパケットキャプチャでは何も表示されません。このことからVPNトンネルは通っておらず直接インターネットへ抜けスプリットトンネル機能が働いていることが分かります。

FGT60D # diagnose sniffer packet VPN-IOS_ADM
interfaces=[VPN-IOS_ADM]
filters=[none]
pcap_lookupnet: VPN-IOS_ADM: no IPv4 address assigned

以上です。