AWSのClientVPN利用しても良いのですが、接続台数増えると結構高いので、自前でやりたい場合。何個か参考になるサイトはあるのですが、最新のOpenVPNだと設定ファイルのディレクトリ構成微妙に変わっていて、結構ハマるので特記。あとついでに、AWSClientVPN利用の時にイケてないところに対応する方法もついでに記載。
AWS側の設定や細かい内容はこちらのブログを見た方が良いと思います。
EC2はAmazonLinuxで作成する場合、RedHat系なら大体同じじゃないかと。
とりあえず結論のコマンド全部
# EPELを有効にする(AmazonLinuxのデフォのリポジトリにOpenVPNがいないため) sudo amazon-linux-extras install epel -y # OpenVpnのインストール sudo yum -y install openvpn # EasyRSAのインストール(証明書作成用のツール) wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz tar -xvzf EasyRSA-3.0.8.tgz sudo mv EasyRSA-3.0.8 /usr/local/EasyRSA cd /usr/local/EasyRSA/ # 初期化 ./easyrsa init-pki # CA作成 ./easyrsa build-ca ## パスフレーズ聞かれるので入力 ex. hogefuga ## CommonNmae聞かれるので入力 ex. samplename # 暗号アルゴリズムの設定ファイル作成 ./easyrsa gen-dh # サーバキーの作成 ./easyrsa build-server-full server nopass ## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga # クライアントキーの作成 ./easyrsa build-client-full client1 nopass ## パスフレーズ聞かれるのでCA作成と同じフレーズを入力: ex. hogefuga # 作成した各証明書系ファイルをopenvpnの設定ディレクトリにコピー sudo cp pki/ca.crt /etc/openvpn/server/ sudo cp pki/issued/server.crt /etc/openvpn/server/ sudo cp pki/private/server.key /etc/openvpn/server/ sudo cp pki/dh.pem /etc/openvpn/server/dh2048.pem # openvpnのサンプル設定ファイルを所定の場所にコピーしておく(設定ファイルの中身は後述) sudo cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server/server.conf # 2.4以降デフォで必要になったキーの作成 sudo openvpn --genkey --secret /etc/openvpn/server/ta.key # IPフォワーディングの許可 sudo vi /etc/sysctl.d/99-sysctl.conf ## 下記を追記 net.ipv4.ip_forward = 1 # サービスの再読み込み sudo sysctl -p # 設定ファイルを更新後 # openvpnの起動と自動起動 sudo systemctl start openvpn-server@server.service sudo systemctl enable openvpn-server@server.service
サーバの設定ファイル
- 「/etc/openvpn/server/server.conf」
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh2048.pem tls-auth ta.key 0 cipher AES-256-CBC # Clientに振られるIPの範囲 server 10.8.0.0 255.255.255.0 # ここはEC2インスタンスが存在してるサブネットのCidrBlock push "route 172.123.456.789 255.255.0.0" keepalive 10 120 persist-key persist-tun status openvpn-status.log verb 3
クライアントの設定ファイル
client dev tun proto udp remote [EC2のグローバルIP] 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key remote-cert-tls server tls-auth ta.key 1 cipher AES-256-CBC verb 3
クライアントはWindowsの前提。まず、クライアントをここからDLしてインストール。
そしたら、設定のインポートでやってもいいのですが、結局証明書ファイルの格納とかもいるので下記の感じでやる。デフォだと下記フォルダ内に任意のフォルダを作成
「C:\Users\[user-name]\OpenVPN\config\」
例えば、myvpnでやる場合。まず下記フォルダを作成。
「C:\Users\[user-name]\OpenVPN\config\myvpn」
そしたら、myvpn.ovpnを新しいファイルで作成。中身は上記の内容。
サーバで作ってる各種証明書のファイルをクライアントに持って来て、このファイルと同じ場所に格納。
格納するのは下記4つ。
- ca.crt
- client1.crt
- client1.key
- ta.key
オマケ:起動中のログ確認したい場合
sudo cat /etc/openvpn/server/openvpn-status.log`
以下もろもろのやりたいコト別の特記。
プロキシ通してアクセス
会社内の場合はプロキシ通さないとアクセス出来なかったりする。その場合は、
- サーバ側「/etc/openvpn/server/server.conf」
port 443 proto tcp
TCPの443で待ち受け。
- クライアント側の設定ファイル
proto tcp remote [EC2のグローバルIP] 443 http-proxy [proxy server] [proxy port] stdin basic http-proxy-retry
stdinの場合は、接続時に入力プロンプト上げる場合。
予め設定しておきたい場合は、下記でファイル名にしていたいファイルを設定ファイルと同じフォルダに格納する。
http-proxy [proxy server] [proxy port] [file-name]basic
ファイルは1行目がIDで2行目がパスワード。
一つのクライアント証明で複数端末の接続をしたい場合
デフォだと、クライアント毎に証明書用意しないとダメ。これだと大量のクライアントで接続しないといけない場合にかなりつらい。一つの証明書バラまいて終わりにしたい場合は下記。
- サーバ側「/etc/openvpn/server/server.conf」
duplicate-cn
上記で、同じ証明書使って複数端末から接続しても、それぞれにIPふってくれるようになる。
ハマった個所
- 2.4のいつから変わったのか分かりませんが、サーバ側の設定ファイルの場所が変わってる。
/etc/openvpn/ ↓ /etc/openvpn/server/
- systemctlの起動の名称が色々変わってる。
sudo systemctl start openvpn ↓ sudo systemctl start openvpn-server@server.service
ちなみに、↑でserverっていう名前の設定ファイルを見に行くっていう事らしい。
「openvpn-server@[name].service」という事らしい。
オマケでAWSClientVPN使う場合にイケてないところの対応。
まず、イケてない点は下記。
追記
↓はインターネット向けはVPN通したくない場合はスプリットトンネル有効にするだけですね。というか↑の設定が要するにスプリットトンネルした時にサーバから送られてくる設定っぽかった。
- 全ての通信がVPN通るようになる。
サーバから「0.0.0.0」のルートが送り込まれてるらしく、特定CidrのみVPNにしたい場合はコレだと無理。
さらに、AWSClientVPNのAWS提供クライアントだとここの設定サポートされてなくて、対応不可能。
なので、AWSClientVPN利用でも端末側はOpenVPNのクライアントを利用する。
そのうえで設定ファイルで下記を追加。
route 10.123.456.789 255.255.0.0 vpn_gateway 300 route-nopull
route-nopull入れないとサーバからルートが強制されるので、それを回避するために、nopull入れる。
AWS提供のクライアントだとこのnopullを許可してくれない。。。