Amazon Ec2

EC2でOpenVPNサーバを構築してみて詰まったポイント

はじめに

こんにちは、omkです。
今回はEC2でOpenVPNサーバを立てて、VPNサーバの同一VPC内の別サーバにVPNからSSHしてみました。

その中で詰まったポイントを説明します。

VPNサーバにはCentOS7を使用し、Windowsの端末から接続します。

↓きれいに接続できるようにした構築手順がこちらになります。
https://blog.denet.co.jp/ec2openvpnserver/

詰まったポイント

前提

VPNサーバのセキュリティグループではUDPの1194番で自分のIPからのアクセスを許可しています。SSHも許可しています。
SSH先のEC2のセキュリティグループではTCPの22番をVPNサーバのIPとVPN接続後に割り当てられるIP(10.8.0.0/24)に対して許可しています。

ルートテーブルはローカルとインターネットゲートウェイのみを設定したものをVPNサーバとSSH先のサーバのサブネットに割り当てています。

①VPNに接続できない

当初、「TLS key negotiation failed to occur within 60 seconds(check your network connectivity)」とエラーが出てVPNに接続できない問題が生じていました。
調べてみたところ鍵の作り間違えやファイヤーウォールの設定等で接続できない方が見つかりましたが、私の場合は起動するサービスを間違えていたため接続できませんでした。

元々起動していたのが

openvpn.service

起動しなければいけなかったのが

openvpn@server.service

でした。後者を起動したところ接続できました。

systemdの環境ではサービスの定義ファイルは

/usr/lib/systemd/system

にあります。定義があるか確認するには

ls /usr/lib/systemd/system

systemctl list-unit-files --type=service

のコマンドが有用です。
起動しているサービスは

systemctl list-units --type=service

で確認できます。

繋がらない場合は他にもセキュリティグループのプロトコルやポート番号、許可するIPがあっているか、等も考えられます。

②VPNには接続できたがSSHがつながらない

VPNに接続してIPアドレスが割り当てられてから別のサーバにSSHしようとしましたが、認証できませんでした。
SSH先のセキュリティグループではVPNサーバのIPとVPN接続後に割り当てられるIPの範囲を許可していました。

ipconfig /All

で確認したところ元々の設定とVPNの設定の両方が存在していましたが以下のサイトで確認したところVPNを通して通信していないことが確認できました。
https://www.ugtop.com/spill.shtml

この問題に対してはこちらのサイトを参考にして進めました。
https://dev.classmethod.jp/articles/openvpn-vpn-traffic/

通信をすべてVPN経由に設定するにはVPNサーバで

push "redirect-gateway def1"

の設定を有効にしてサービスをリスタートします。
これでVPN経由で通信できますが、このままではSSH接続は出来ません。
IPマスカレードを設定することでVPNサーバのIPを使用して外に通信することが可能になります。

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

VPNサーバからのSSHを許可しているとこれでSSHすることが可能になりますがVPNのIPで接続することになります。

割り当てられたIPで接続する場合はIPマスカレードの設定を切る必要があります。
私の場合はVPN接続後にVPNサーバを通してインターネットにアクセスできる状態が要件として好ましくなかったので、この設定は使用できませんでした。

③割り当てられたローカルIPでSSHする

②でVPN経由で通信するように設定しましたがIPマスカレードの設定を消すと相変わらず接続できません。

これの原因は戻りのトラフィックのルートが設定されていないためでした。
10.0.0.0/16と0.0.0.0/0しか設定していないためにVPNで割り当てたIP(10.8.0.0/24)に帰ってこられず、接続できないようになっていました。

対策としてはこちらのENIの設定を参考にしました。
https://dev.classmethod.jp/articles/openvpn24-aws/

まず、VPNサーバに使用しているEC2インスタンスを選択し、「アクション」から「送信元/送信先チェック変更」で「ソース/宛先チェックを無効化」します。
次に、ルートテーブルで、送信先にVPNに割り当てられているIPを入力してターゲットとしてVPCサーバのEC2に割り当てられているネットワークインターフェースを設定します。
これでVPC内でVPNとの通信ルートが確立されます。

これによってVPNで割り当てられたローカルIPを使用してSSHすることが可能になります。

まとめ

以上3点で詰まりました。この経験が誰かの助けになれば幸いです。