Tagbangers Blog

RTX1210とRoute53でセキュアで簡単なVPN接続をしてみる

はじめに

こんにちは荻野です。連投でRTXネタです。

現在タグバンガーズではリモートワークの導入を進めています。その一環でメンバーにVPN環境を提供する必要が出てきました。
既存の機材を活かしながら、セキュアに、かつ簡単にVPN環境を構築するにはどうすれば良いのかを考えてみました。

実際に手を動かしながら色々試してみたのでご紹介します。

構成

VPNサーバにはRTX1210を使います。
VPNクライアントには、メンバーの大多数がMacBookProのため、MBP標準のVPNクライアントを利用してもらいます。
また、クライアントは固定グローバルIPを持たないものとします。

Try VPN

手軽に実現できそうでしたので、今回は L2TP/IPsecによるVPN接続を採用してみました。YAMAHAさんのマニュアルは豊富です。
複数のL2TPクライアント(アドレス不定)の接続を受け付ける場合 を参考に設定を進めていくことにします。

すでにプロバイダへの接続設定は済ましていたので、追加した設定だけご紹介します。

# L2TP接続を受け入れるための設定
pp select anonymous
  pp bind tunnel1 tunnel2 tunnel3
  pp auth request (認証方式)
  pp auth username l2tp_user1 l2tp_password1
  ppp ipcp ipaddress on
  ppp ipcp msext on
  ip pp mtu 1258
  pp enable anonymous

# L2TP接続で使用するトンネルの設定
tunnel select 1
  tunnel encapsulation l2tp
  ipsec tunnel 101
   ipsec sa policy 101 1 esp (暗号アルゴリズム) (認証アルゴリズム)
   ipsec ike keepalive use 1 off
   ipsec ike local address 1 xxx.xxx.xxx.xxx
   ipsec ike pre-shared-key 1 text yamaha1
   ipsec ike remote address 1 any
   l2tp tunnel disconnect time off
   l2tp keepalive use on 10 3
   l2tp keepalive log on
   l2tp syslog on
  ip tunnel tcp mss limit auto
  tunnel enable 1

# NAT設定
nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 auto
nat descriptor masquerade static 1 1 ルーターIP esp
nat descriptor masquerade static 1 2 ルーターIP udp 500

# IPsecのトランスポートモード設定
ipsec transport 1 101 udp 1701
ipsec auto refresh on

# L2TP設定
l2tp service on

# 以下のフィルターをプロバイダ用の設定に追加
ip filter 200080 pass * ルーターIP esp * *
ip filter 200081 pass * ルーターIP udp * 500
ip filter 200082 pass * ルーターIP udp * 1701

以上の設定をすませるとMBPからVPN接続が可能になりました。

セキュリティを高める

ここまででVPN接続が可能になりましたが、接続元に関しては制限を設けていないため運用するには不安が残ります。

そこで、以下の仕組みを導入し接続元に対する制限を設けてみたいと思います。

  1. 特定のエンドポイントFQDNからのみトンネル確立を許可するようにRTXの設定を変更する
  2. VPNクライアントはエンドポイントFQDNに対して自分のグローバルIPをDNSに登録する
  3. VPNクライアントがVPNコネクションの接続要求を行う
  4. RTXはDNSに対してFQDNのAレコードを問い合わせる
  5. Aレコードと接続元のIPアドレスが一致した場合VPNコネクションを確立する

接続元をホストで縛ります。要注目なのは1と2の部分ですね。
以下にそれぞれ掘り下げてみたいと思います。

1. 特定のエンドポイントFQDNからのみトンネル確立を許可するようにRTXの設定を変更する

RTXを以下のように設定しました。

# L2TP接続を受け入れるための設定 
pp select 2
 pp name tb-l2tp
 pp bind tunnel3
 pp auth request chap-pap
 pp auth username l2tp_user1 l2tp_password1
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ip pp remote address dhcp
 ip pp mtu 1258
 pp enable 2

# L2TP接続で使用するトンネルの設定
tunnel select 3
 tunnel encapsulation l2tp
 tunnel endpoint name エンドポイントFQDN fqdn
 ipsec tunnel 1
  ipsec sa policy 1 3 esp 3des-cbc md5-hmac
  ipsec ike keepalive log 3 off
  ipsec ike keepalive use 3 off
  ipsec ike nat-traversal 3 on
  ipsec ike pre-shared-key 3 text 事前共有鍵
  ipsec ike remote address 3 エンドポイントFQDN
 l2tp tunnel auth off
 l2tp keepalive use on
 ip tunnel tcp mss limit auto
 tunnel enable 3

ipsec transport 3 1 udp 1701

tunnel endpoint name と ipsec ike remote address でFQDNを指定しているのがポイントです。

2. VPNクライアントはエンドポイントFQDNに対して自分のグローバルIPをDNSに登録する

今回はRoute53をDNSサービスに採用し、DDNSのように動くシェルスクリプトを用意しました。スクリプトはこちらになります。
メンバーにはこのスクリプトを利用してもらい、VPNの接続前にエンドポイントFQDNに相当するレコードを作成・更新してもらいます。
※ 事前にAWSCLIのセットアップが必要なのが少し手間ですが・・・

もしこちらのスクリプトを使われる場合は、事前に以下の値を変更してください。

readonly RECORD_NAME="fuga.example.com" # エンドポイントFQDNに変更
readonly HOSTED_ZONE_ID="XXXXXXXXXXXXXX" # Route53のHostedZoneIDに変更
readonly PROFILE="aws-profile-name" # AWSCLIを実行するプロファイル名に変更

レコードの更新後、クライアントからVPNの接続要求を行います。
正しく設定が行えていればL2TP/IPSecによるVPN接続ができるかと思います。
また、異なるIPアドレスからは同一の接続情報でのVPN接続ができないことも確認できると思います。

以上で、VPN接続元に関する制限を設けることができました。

おわりに

ここまででメンバーがアクセスする場所に縛られず、ある程度のセキュリティが担保されている環境を構築できたと思います。
ですが、RTXはクライアント証明書による認証もできるようなので、さらにセキュリティを高める構成を検討したいと思います。

それでは、よいRTXライフをお送りください!