はじめに
外出先や野良wifiから安全に通信できるように、VPNサーバを構築します。
設定するファイルが多く、構築が大変だったのでAnsible Role化しました。
お手持ちのPlaybookに組み込むことで、簡単にVPNサーバーを構築できます。
また、L2TPクライアントはたいていのOSで標準サポートされているので、特にアプリをインストールすることなく利用可能です。
VPNの概要
L2TPは、ネットワーク間でのVPN (Virtual Private Network) 接続を実現するトンネリングプロトコルです。L2TP自体は暗号化の仕組みを持ちませんが、IPsecを併用することでデータの機密性や完全性を確保したVPN接続を実現するL2TP/IPsecがあります。スマートフォンなどに搭載されているL2TPクライアントからインターネット越しに構築したVPNサーバーとのセキュアな通信を可能にします。
環境
今回作ったAnsible Roleは以下の環境で動作確認を行っています。
ローカル
- Ansible 2.6.5
サーバー側
ConoHa VPSのCPU1コア、メモり512M
- CentOS 7
- Ubuntu 16.04 LTS
- Ubuntu 18.04 LTS
クライアント側
- macOS
- Android 10
- iOS 13
注意事項
- このRoleは、firewalld(CentOS) / ufw(Ubuntu)を有効にします。事前にSSHポートを開けておいてください。
- 事前共有鍵やログイン情報は機密情報なのでAnsible Vaultを利用するなどして管理してください。
手順
Roleの取得
今回作ったAnsible RoleはAnsible Galaxy内に配置していますので、ansible-galaxy
コマンドから取得できます。
requirements.yml
ファイルに以下を追加します。
- shomatan.l2tp-ipsec-server
その後、以下のコマンドでRoleを取得します。
ansible-galaxy install -p roles -r requirements.yml
Playbookの作成
必要最低限のパラメータを示します。
今回はvpn.yml
としてPlaybookを作成します。
- name: Run the vpn server group of hosts.
hosts: all
become: true
roles:
- role: shomatan.l2tp-ipsec-server
l2tp_ipsec_server_host: vpn.example.com # ServerのPublic IPまたはdomain
l2tp_ipsec_PSK: presharedkey # 事前共有鍵
l2tp_ipsec_server_bind_interface: eth0 # Public側のネットワークインターフェース
l2tp_ipsec_server_users:
- { username: user, password: pass, ipaddress: "*" # ログイン情報
実行
inventoryファイルは適宜作成してください。
以下のコマンドを実行して、VPNサーバーを構築します。
ansible-playbook vpn.yml
クライアントの設定
- サーバー:
l2tp_ipsec_server_host
の値 - 事前共有鍵:
l2tp_ipsec_PSK
の値 - ユーザー名:
l2tp_ipsec_server_users
のusername
- パスワード:
l2tp_ipsec_server_users
のpassword
終わりに
CentOSとUbuntuでIPsecのライブラリが異なるので、設定に苦労しました... Androidから繋がらないとか...