Cisco1812J VPN Settings

VPN の設定のしかたがよくわからないので試していた。Cisco VPN Client を使って 1812J に Remote Access VPN をする (EZVPN) ときの設定のメモ。おおむねマニュアル通りで良いのだけど、NAT(PAT/Static NAT) との組み合わせでちょっとはまったのでざっと残しておく。

参考はこの辺

Ciscoのページは、Site-to-Site と Remote access VPN の設定とを混ぜて書いてあるものが多いので注意…。最初 VPN の設定とかよくわからないまま見て混乱してしまった。

Diagram/NAT

テスト環境をこんな感じで作った。

VPN Client (192.168.1.102)
    |
----+----------------+------------------- 192.168.1.0/24
                     |
                 1812J, Fa0/outside (192.168.1.32)
                 1812J, Fa1/inside  (172.16.1.2)
                     |
----+----------------+------------------- 172.16.1.0/24
    |
Web Server (172.16.1.16)

NAT 設定

  • 1812J は Internet 接続用ルータとして使用するので、inside to outside に関しては NAT (pat) をする。
  • Web Server は Internet から接続させるために Static NAT を設定する。
interface FastEthernet0
 ip address 192.168.1.32 255.255.255.0
 ip nat outside
!
interface FastEthernet1
 ip address 172.16.1.2 255.255.255.0
 ip nat inside
!
ip nat inside source list 100 interface FastEthernet0 overload
ip nat inside source static tcp 172.16.1.16 80 interface FastEthernet0 80
!
access-list 100 permit icmp 172.16.0.0 0.0.127.255 any
access-list 100 permit ip 172.16.0.0 0.0.127.255 any
access-list 100 deny   ip any any log

VPN

AAAとユーザアカウント

ユーザ情報はローカルで。

aaa new-model
aaa authentication login USERAUTH local
aaa authorization network GROUPAUTH local
aaa session-id common
ISAKMPポリシの設定
crypto isakmp policy 1
 encr aes 256
 hash sha
 authentication pre-share
 group 2
VPN クライアントのグループ定義
crypto isakmp client configuration group VPNCLIENT
 key xxxxxxxxx
 dns 192.168.2.16
 pool VPN_POOL
 acl 110
 save-password
 pfs
 netmask 255.255.255.0
!
access-list 110 permit ip 172.16.0.0 0.0.127.255 any
!
ip local pool VPN_POOL 172.16.255.1 172.16.255.254
  • configuration group name (VPNCLIENT): VPN Client で "グループ認証" で指定する名前
  • key: 事前共有キー (pre-shared key)
  • pool: VPN Client の IP プール
  • acl: VPN Split-Tunneling を指定するための ACL
VPN クライアントの ISAKMP プロファイル

VPNグループ定義と人称設定の関連づけ。

crypto isakmp profile VPNCLIENT_PROFILE
   match identity group VPNCLIENT
   client authentication list USERAUTH
   isakmp authorization list GROUPAUTH
   client configuration address respond
!
IPSec 暗号セットの定義
crypto ipsec transform-set VPN_SET esp-aes 256 esp-sha-hmac
EzVPN Dynamic Map の定義

アクセス元 (VPN Client) は固定 IP ではなく動的に変化するので Dynamic Map を使用する。

crypto dynamic-map DYNMAP 1
 set transform-set VPN_SET
 set isakmp-profile VPNCLIENT_PROFILE
 reverse-route
!

reverse-route を入れておくとルーティングテーブルに VPN Pool の情報が追加される。内部で動的ルーティングにより経路制御を行っている場合は VPN 機器のルーティングテーブルに入れた上で再配布させる。

暗号マップの定義
crypto map EZVPN-MAP 1 ipsec-isakmp dynamic DYNMAP
インタフェースへの適用
interface FastEthernet0
 crypto map EZVPN-MAP
!

VPN Client Setting

リモートアクセスVPN - Ciscoコンフィグ (EzVPNリモート) 参照。

接続できたら確認する。

  • VPN Client
    • [ステータス]-[統計情報]
      • "ルートの詳細" タブで Split Tunneling の情報がわかる。cmd.exe で "route PRINT" でもいいけど。
  • Router
Router#sh crypto session detail
Crypto session current status

Code: C - IKE Configuration mode, D - Dead Peer Detection
K - Keepalives, N - NAT-traversal, X - IKE Extended Authentication

Interface: FastEthernet0
Session status: UP-ACTIVE
Peer: 192.168.1.102 port 53366 fvrf: (none) ivrf: (none)
      Phase1_id: VPNCLIENT
      Desc: (none)
  IKE SA: local 192.168.1.32/500 remote 192.168.1.102/53366 Active
          Capabilities:CDX connid:2011 lifetime:22:48:26
  IPSEC FLOW: permit ip 0.0.0.0/0.0.0.0 host 172.16.255.10
        Active SAs: 2, origin: dynamic crypto map
        Inbound:  #pkts dec'ed 43 drop 0 life (KB/Sec) 4555253/24509
        Outbound: #pkts enc'ed 68 drop 0 life (KB/Sec) 4555248/24509

Router#

NAT設定

PAT

上の設定で VPN 接続はできるのだけど、そのままだと PAT 設定と干渉してしまう。VPN接続後、VPN Client から Web Server への ping をしてみると

vpn client (pool: 172.16.255.x)  --------- 1812J -------------  Web server (172.16.1.16)

  src: 172.16.255.x
  dst: 172.16.1.16  -------------- icmp request --------------->

  src: 192.168.1.32                                               src: 172.16.1.16
  dst: 172.16.255.x <------------- icmp response <--------------  dst: 172.16.255.x

このように戻りのパケットに NAT がかかった状態になってしまうため通信が成立しない。PAT を併用する場合は VPN Pool に対しては PAT から除外する必要がある。

PAT 対象を指定している ACL で pool ip range を deny してやる。

access-list 100 deny   icmp any 172.16.255.0 0.0.0.255
access-list 100 deny   ip any 172.16.255.0 0.0.0.255
access-list 100 permit icmp 172.16.0.0 0.0.127.255 any
access-list 100 permit ip 172.16.0.0 0.0.127.255 any
access-list 100 deny   ip any any log
Static NAT

この上でさらに VPN Client から Web Server に対して内部のアドレス HTTP アクセスする (tcp/80, src:172.16.255.x, dst:172.16.1.16) とやはりうまくいかない。現象としては同様で、戻りのパケットに対して NAT がかかってしまう。

これも static nat の設定に引っかかってしまうためで、外から tcp/80 のアクセスをさせるための設定が VPN で接続したときのトラフィックに引っかかってしまうようだ。

とりあえずいまは Web (apache) で VirtualHost でポートを変えて Listen させ、内部接続用と外部接続用でポート使い分けるようにして回避しておく。



というようなあたりで、NAT と併用しないのであればそれほど難しくはないのだけど、NAT 併用し始めたときにどういう順序で何が処理されるのかを把握できていないとハマる。(この辺の話はハマっていて Twitter でぼやいたら @H_Shinonome さんに教えていただきました。)

VPN やってみたときにうまくいかない場合 (VPNトンネル張れて接続できているのに通信ができない場合) はルーティングか NAT 設定あたりの確認が必要ということで。今回コケたのは

  • "reverse-route" + 再配布していなくて経路が足りなかった (最初は L3 Switch が Router/Web 間にある環境で試していたのだけど、VPN pool へのルートがなかったのでパケットが Web Server に届いていなかった。ややこしいので上の図のように間に hop がない環境でやり直した。)
  • 上記の通り NAT 設定との干渉。VPN Client にどういうパケットが届いているかは、VPN Client でパケットキャプチャして確認する: Wireshark で "Cisco Systems VPN Adapter" というインタフェースを指定すると、トンネル内に流しているパケットが確認できる。