はじめに
こんにちは荻野です。連投で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接続が可能になりましたが、接続元に関しては制限を設けていないため運用するには不安が残ります。
そこで、以下の仕組みを導入し接続元に対する制限を設けてみたいと思います。
- 特定のエンドポイントFQDNからのみトンネル確立を許可するようにRTXの設定を変更する
- VPNクライアントはエンドポイントFQDNに対して自分のグローバルIPをDNSに登録する
- VPNクライアントがVPNコネクションの接続要求を行う
- RTXはDNSに対してFQDNのAレコードを問い合わせる
- 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ライフをお送りください!