[toc:faq]
はじめに
AnyConnect Client等のRemote AccessにおけるVPN Filterの設定は、VPN Clientから接続可能なIP/Portを制限するために使われます。
本記事では一般的なInbound方向(VPN Client->サイト内)のVPN Filter設定方法に加えて、Outbound方向(サイト内->VPN Client)へのVPN Filterの適用で注意すべき点について説明します。
前提条件
- ASA 9.1(6)及びAnyConnect3.1にて動作確認をしております。
- VPN Filterを使っていないAnyConnectの設定については本記事では扱っておりません。AnyConnectの基本的な設定が入っている前提で、説明します。
- 文中にて、Inbound方向を「VPN Client->VPN接続先のServer」Outbound方向を逆の「VPN接続先のServer->VPN Client」とします。
設定方法
一般的にはVPN Filterは、VPN Clientで接続した先のサイトにある、サーバ等へのアクセス制御(Inbound方向)のために使われます。仮に以下のような設定をしたいとします。
その場合、VPN Clientからサイト内のServerへのRDP(TCP3389)にのみアクセスを設定する場合のVPN Filterはgroup-policy attributeもしくは、username attribute内に以下のように設定します。
Access-list
access-list vpn-acl extended permit tcp host 192.168.1.100 host 172.16.1.100 eq 3389
Group policyのattributeでvpn-filterを設定
group-policy test-anyconnect-gp attributes
vpn-filter value vpn-acl
もしくはusernameのattributeとしてvpn-filterを設定
username xxx attribute
vpn-filter value vpn-acl
この場合は、ACLは直感的であり、特に問題はありませんが、逆に、以下のように接続先サイトのServerが発信元でVPN ClientのRDP(TCP3389)の通信(Outbound方向)を制御したい場合は注意が必要です。
この場合、ACLは、以下のようなClientが発信元となるような設定を行う必要があります。
access-list vpn-acl extended permit tcp host 192.168.1.100 eq 3389 host 172.16.1.100
このような設定が必要となる理由を以降、説明します。
VPN Filterの挙動について
VPN FilterはInbound(VPN Client->サイト)のACLを書くことで設定されます。その際、Inboundだけでなく、自動的にOutbound(サイト内->VPN Client)の方向への許可をする挙動となります。逆に言うと、通常のAccess-listの設定のようにOutbound方向のACLを直感的に書いても設定することができません。
また、大前提として、VPN Filterは設定なしの状態であれば、Inbound/Outboundの制限はありません。
Inbound方向の通信制御をする場合
まずは、簡単なInbound方向のVPN Filterの設定について説明します。
Inbound方向に対して、接続先Serverに対するRDP(TCP3389)を許可したい場合、直感的にVPN FilterのACLを設定すれば、自動的に戻り方向の通信が許可されることになります。この場合は特に難しいことを考える必要はありません。
参考までに、以下の通り、show asp table filterコマンドにてASAの内部的にはどのように見えるかを確認することができます。
Global Filter Table:
in id=0x75c7d1b0, priority=13, domain=filter-aaa, deny=false
hits=0, user_data=0x70febdc0, filter_id=0x6(vpn-acl), protocol=6
src ip=192.168.1.100, mask=255.255.255.255, port=0
dst ip=172.16.1.100, mask=255.255.255.255, port=3389<<直観通りの設定が反映
in id=0x74d5d1f0, priority=12, domain=filter-aaa, deny=true
hits=50, user_data=0x70fec540, filter_id=0x0(-implicit deny-)<<暗黙のdeny, protocol=0
src ip=0.0.0.0, mask=0.0.0.0, port=0
dst ip=0.0.0.0, mask=0.0.0.0, port=0
in id=0x74d5d6c0, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec440, filter_id=0x0(-implicit deny-), protocol=0
src ip=::/0, port=0
dst ip=::/0, port=0
out id=0x75c7d108, priority=13, domain=filter-aaa, deny=false
hits=0, user_data=0x70feb340, filter_id=0x6(vpn-acl), protocol=6
src ip=172.16.1.100, mask=255.255.255.255, port=3389
dst ip=192.168.1.100, mask=255.255.255.255, port=0<<意識しなくてもいいがOutboundも自動的に許可
out id=0x74d5d458, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec4c0, filter_id=0x0(-implicit deny-)<<暗黙のdeny, protocol=0
src ip=0.0.0.0, mask=0.0.0.0, port=0
dst ip=0.0.0.0, mask=0.0.0.0, port=0
out id=0x74d5d958, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec3c0, filter_id=0x0(-implicit deny-), protocol=0
src ip=::/0, port=0
dst ip=::/0, port=0
上記ASP Tableを見ると、Inboundと同時にOutbound側が設定されていることが確認出来ると思います。
同時に上記出力から、VPN Filterを一旦設定すると、Inbound/Outbound共に暗黙のDenyが作られることもご確認いただけますが、この性質であるため、一旦Inbound方向の通信を制御するFilterを設定すると、同時にOutbound側のDenyも設定されることになるため、Outbound側の通信制御のためのACLを明示的に記述する必要が出てきますので、その点はご注意ください。
Outbound方向の通信制御をする場合
次に、Outbound方向の場合ですが、直感的なOutbound方向のACLを書くことがで出来ません。そして、先ほども説明したように、VPN Filterは、Inbound方向のACLを設定することで、Outbound方向の通信が自動的に許可される挙動であるため、制御したいOutbound方向の通信を、Inbound方向からの視点でACLを記述します。
つまり、ServerからClientに向けたOutboundのRDP(TCP3389)を許可したい場合、Inbound方向から見ると、ClientのSource Port 3389からServerのAny portに対してPermitするというACLを記述すればよいことになります。
この結果、Outbound方向の通信が許可されることになります。この場合のASP Tableは以下になります。
asa5520-10(config)# sh asp table filter
Global Filter Table:
in id=0x7624e5f0, priority=13, domain=filter-aaa, deny=false
hits=0, user_data=0x70febe40, filter_id=0x6(vpn-acl), protocol=6
src ip=192.168.1.100, mask=255.255.255.255, port=3389
dst ip=172.16.1.100, mask=255.255.255.255, port=0 << Inbound側が設定されると
in id=0x74d5d1f0, priority=12, domain=filter-aaa, deny=true
hits=50, user_data=0x70fec540, filter_id=0x0(-implicit deny-)<<暗黙のdeny, protocol=0
src ip=0.0.0.0, mask=0.0.0.0, port=0
dst ip=0.0.0.0, mask=0.0.0.0, port=0
in id=0x74d5d6c0, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec440, filter_id=0x0(-implicit deny-), protocol=0
src ip=::/0, port=0
dst ip=::/0, port=0
out id=0x76248698, priority=13, domain=filter-aaa, deny=false
hits=0, user_data=0x70feb2c0, filter_id=0x6(vpn-acl), protocol=6
src ip=172.16.1.100, mask=255.255.255.255, port=0
dst ip=192.168.1.100, mask=255.255.255.255, port=3389 <<許可したいOutboundが設定される
out id=0x74d5d458, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec4c0, filter_id=0x0(-implicit deny-)<<暗黙のdeny, protocol=0
src ip=0.0.0.0, mask=0.0.0.0, port=0
dst ip=0.0.0.0, mask=0.0.0.0, port=0
out id=0x74d5d958, priority=12, domain=filter-aaa, deny=true
hits=0, user_data=0x70fec3c0, filter_id=0x0(-implicit deny-), protocol=0
src ip=::/0, port=0
dst ip=::/0, port=0
また、先ほども述べたように、一旦、VPN Filterを設定すると、自動的にInbound方向もOutbound方向も暗黙のDenyが設定されることになります。一旦、この方向で、Outbound方向のPermit設定を行った場合、自動的にその他のInbound方向の通信は暗黙のDenyによって落とされることになりますので、その場合は、Inbound方向の通信制御する方法で、明示的に許可することを忘れないでください。