■CiscoルータでIPSecVPNの設定
一言でVPNといっても種々様々です。まず、インターネットVPNとIP-VPNに大きく分類されます。セキュリティレベルが高いのはIP-VPNですが、その分コストも高く、どちらかというとインターネットVPNの導入率のほうが現場では高いように思います。IP-VPNはキャリアなどが提供するMPLS-VPN網などに接続することにより実現するのに対し、インターネットVPNはルータやファイアウォールなどのソフトウェアの設定で実現するものであり、機器がVPNをサポートしており設定を間違えなければ導入可能です。
またサイト間VPNとリモートアクセスVPNに分類することもできます。サイト間VPNは離れた拠点同士を結ぶルータ同士で設定するものであり、クライアント端末はVPNで通信するということを意識することはありません。それに対しリモートアクセスVPNはクライアント端末に専用のソフトウェアをインストールして接続する方式です。昔はセキュアなリモートアクセスといえばリモートアクセスVPNが主流でしたが、ここ最近 ( 2013年 )では手軽に導入でき敷居が低いことからSSL-VPNのほうが導入率が高いように思います。
ここではCiscoルータ同士でサイト間VPNの設定例をメモ書きします。個人的な考えでは本記事に記載する設定をCiscoルータに設定するのであればCiscoASAでVPNを設定するほうが奨励されます。ルータよりもASAの方がIPSecVPNに関してはパフォーマンスが良いためです。ただ、なんらかの事情でルータに設定せざるを得ないときのことを考えメモ書きを残します。
以下の構成を元にルータを設定します。
このときのR1の設定は以下のようになります。
※IKEポリシー作成。暗号化方式や認証方式、Diffie-Hellmanなどを設定。 crypto isakmp policy 1 encr aes authentication pre-share group 5 ※対向ルータと認証に利用する事前共有キーおよびIPアドレスを指定する。 crypto isakmp key 6 cisco address 10.0.0.2 ! ! ※トランスフォームセットの作成。VPNトンネル内の暗号化方式と認証方式を設定。 crypto ipsec transform-set TS esp-aes 256 esp-sha-hmac ! ※暗号マップファイルの作成。対向のIPアドレスやトランスフォームセットを指定し VPN通信対象となるACLを設定する。これは対向で対になっている必要あり。 crypto map CRYPTO 1 ipsec-isakmp set peer 10.0.0.2 set transform-set TS match address 100 ! ! ! ! ※外部インターフェイスに暗号マップファイルを適用 interface FastEthernet0/0 ip address 10.0.0.1 255.255.255.0 duplex auto speed auto crypto map CRYPTO ! interface FastEthernet0/1 ip address 192.168.1.1 255.255.255.0 duplex auto speed auto ! ip forward-protocol nd ip route 0.0.0.0 0.0.0.0 10.0.0.2 ! ! no ip http server no ip http secure-server ! ※VPN通信対象となるアクセスリストを定義 access-list 100 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 |
VPNに関連する部分を太文字にしています。
上記でACL100で定義しているトラフィックが発生するとVPNトンネルが生成され、パケットは暗号化されて通信します。VPNで正常にトンネルがはられているかどうかを確認するコマンドが以下です。
R1# show crypto isakmp sa dst src state conn-id slot status 10.0.0.2 10.0.0.1 QM_IDLE 3 0 ACTIVE |
上記のようにstateがQM_IDLE、statusがACTIVEとなっていれば第一段階クリアです。IKEは問題なく生成されています。
R1# show crypto ipsec sa interface: FastEthernet0/0 Crypto map tag: CRYPTO, local addr 10.0.0.1 protected vrf: (none) local ident (addr/mask/prot/port): (192.168.1.0/255.255.255.0/0/0) remote ident (addr/mask/prot/port): (192.168.2.0/255.255.255.0/0/0) current_peer 10.0.0.2 port 500 PERMIT, flags={origin_is_acl,} #pkts encaps: 78526, #pkts encrypt: 78526, #pkts digest: 78526 #pkts decaps: 78526, #pkts decrypt: 78526, #pkts verify: 78526 #pkts compressed: 0, #pkts decompressed: 0 #pkts not compressed: 0, #pkts compr. failed: 0 #pkts not decompressed: 0, #pkts decompress failed: 0 #send errors 66, #recv errors 0 <省略> |
上記の太文字の部分でカウンタがリアルタイムに上がっていれば通信も問題ありません。
上記の構成ではルータ同士で広域イーサを使って接続するという図ですが、実際現場では広域イーサ上でVPNをはることはあまりなく、フレッツなどの回線を用いることのほうが多いです。その際pingや一部のアプリは問題なく使えるが、別の一部のアプリのみが使えないといったことがよくあります。これはフレッツ回線ではMTUサイズが1500では使用することができず、1450前後あたりで微調整する必要があり、アプリケーションによってはこれ以上のサイズでパケットを送出してしまうことがあり、フラグメント ( パケット分割 )が設定されていると特定パケットのみ宛先に届かないということが原因で起こりえます。
これを防ぐための手法の一つとしてMTU / MSSサイズの微調整が挙げられます。どの値が正解なのかは回線に依存する部分もあるので実際に通信させながら値を微調整することになります。以下ではMTUを1450、MSSを1410に設定しています。一般的にMTU/MSSはセットで設定し、MTUは外部、MSSは内部インターフェイスに設定し、MSSの値はMTU-40となります。この設定により端末はMSSの値 ( 1410 )よりも大きなパケットは送出しなくなります。
interface FastEthernet0/0 ip mtu 1450 interface FastEthernet0/1 ip tcp adjust-mss 1410 |
別な手法としてフラグメントをそもそも許可するということも可能です。但し、これを設定すると通信は正常なもののスループットが低下することもありますので遅延に敏感なものであれば注意が必要です。フラグメントを許可するにはdfビットを0にセットします。
route-map clear-df permit 10 set ip df 0 interface FastEthernet0/0 ip policy route-map clear-df |