AWS
OpenVPN

AWSにOpenVPN[AmazonLinux]を構築(ユーザー & パスワード認証編)

1. 環境構成

環境はこんな感じ
OpenVPN.png

VPNでトンネルはって、プライベートサブネット上にいるEC2に接続する手順を下記に記載!!

1.1. VPCネットワーク

VPC CIDR:172.24.0.0/16
Public1:172.24.0.0/24
Public2:172.24.1.0/24
Private1:172.24.2.0/24
Private2:172.24.3.0/24

1.1.1. ルートテーブル

【Public】

送信先 ターゲット
172.24.0.0/16 local
0.0.0.0/0 InternetGateway

【Private】

送信先 ターゲット
172.24.0.0/16 local

1.2. VPNサーバー

AmazonLinux
- PublicSubnetに配置
- EIP付与
- 送信元/送信先チェック False(OpenVPNをNATで構成する場合はTrueでもいい)

SG:Inbound TCP 0.0.0.0/443
今回はTCP 443で受け付けます

2. インストール手順

2.1. OpenVPNサーバー

AmazonLinux(OpenVPN)にSSHログイン

以下実施

yum --enablerepo=epel -y install openvpn openssl-devel lzo-devel pam-devel
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
rm -rf easy-rsa-master/
rm -f master.zip

# 認証局初期化
cd /etc/openvpn/easyrsa3/
./easyrsa init-pki
# CA証明書・秘密鍵作成
./easyrsa build-ca
cp pki/ca.crt /etc/openvpn

# サーバー証明書・秘密鍵作成(パスフレーズを2回入力)
./easyrsa build-server-full server nopass

cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/

# DH(Diffie Hellman)パラメータ作成(ちょっと時間かかる)
./easyrsa gen-dh
cp pki/dh.pem /etc/openvpn/

# 証明書廃止リスト作成
./easyrsa build-client-full dmy nopass
./easyrsa revoke dmy

rm -f /etc/openvpn/easyrsa3/pki/issued/dmy.crt
rm -rf /etc/openvpn/easyrsa3/pki/private/dmy.key
rm -rf /etc/openvpn/easyrsa3/pki/reqs/dmy.req

cp vars.example vars

varsファイル編集
vi vars

#set_var EASYRSA_CRL_DAYS       180
set_var EASYRSA_CRL_DAYS       3650

続き

./easyrsa gen-crl

cp /etc/openvpn/easyrsa3/pki/crl.pem /etc/openvpn/
chmod o+r /etc/openvpn/crl.pem
cd

openvpn --genkey --secret /etc/openvpn/ta.key
cp /usr/share/doc/openvpn-2.x.x/sample/sample-config-files/server.conf /etc/openvpn/

/etc/openvpn/server.confファイル編集

server.conf
dev tun
#dh dh2048.pem
dh dh.pem

# OpenVPNからクライアントへ払い出すIPアドレスのレンジ
server 10.8.0.0 255.255.255.0

# クライアントがVPNを経由して、通信させたいネットワーク経路を記載(複数可)
push "route 172.24.0.0 255.255.0.0"

tls-auth ta.key 0

;comp-lzo

user nobody
group nobody

;log-append  openvpn.log
log-append  /var/log/openvpn.log

# TCP通信の場合はコメントアウト(今回はTCPなのでコメントアウト)
#explicit-exit-notify 1

# 最終行へ追加
crl-verify crl.pem

# ユーザー/パスワード認証の場合必要
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-pam.so login
client-cert-not-required
username-as-common-name

ログのローテーションファイル設定
/etc/logrotate.d/openvpn

/var/log/openvpn.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /etc/init.d/openvpn restart 2>&1 > /dev/null || true
    endscript
}

/etc/sysctl.confファイルを編集
IPフォワードの設定

sysctl.conf
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

IPフォワードの設定を反映

sysctl -p

2.1.1. NAT設定の場合

/etc/init.d/iptables start
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

/etc/init.d/iptables save
iptables -L -n -t nat

/etc/init.d/iptables restart

2.1.2. ルーティング構成の場合

送信元/送信先チェック Falseになっていること

AWSコンソールよりルートテーブルを編集
(下記はPrivate用のテーブルです。必要であればPublic用のテーブルにも同様の設定を追記)
【Private ルートテーブル】

送信先 ターゲット
172.24.0.0/16 local
10.8.0.0/24 EC2(OpenVPN)インスタンス

↑ OpenVPNサーバーのインスタンスNICを経由する。というルートテーブルを記載してます。

2.2. openvpn サービス自動起動

chkconfig openvpn on

2.3. openvpn サービス起動

/etc/init.d/openvpn start

3. クライアント設定

3.1. サーバーでVPNユーザー作成

OSのユーザーがVPNユーザーです。
VPNサーバーでユーザーを作成します。
AmazonLinux、CentOSであれば下記です。

■ユーザー / パスワード
useradd vpnuser01
passwd vpnuser01

3.2. サーバーでVPNクライアント用のコンフィグファイルを作成

cp /usr/share/doc/openvpn-2.x.x/sample/sample-config-files/client.conf ~/client.ovpn

client.ovpn
client
# 今回はudpではなくTCPなので変更
;proto udp
proto tcp
remote [VPNサーバのFQDN or IPアドレス] 443

ca ca.crt
# 証明書じゃなくユーザー・パスワードなのでコメントアウト
#cert client.crt
#key client.key

#remote-cert-tls server

tls-auth ta.key 1

#comp-lzo ←圧縮を無効にする。これはサーバーのconfファイルと合わせる必要がある。

auth-user-pass

下記ファイルをクライアント端末に配置する
~/client.ovpn
/etc/openvpn/ca.crt
/etc/openvpn/ta.key

3.3. VPNクライアント(Windows端末の場合)

openvpnクライアントダウンロードしてインストール

~/client.ovpn
/etc/openvpn/ca.crt
/etc/openvpn/ta.key
上記3ファイルを
C:\Program Files\OpenVPN\config配下に配置する

このまま実行して接続すると、ユーザー、パスワードを聞いてくるので
LinuxOS上で作成したユーザーとパスワードを入力し接続する。

OpenVPNクライアントがグリーンになれば接続成功

3.3.1. 通信経路の確認

  1. 家(PC) → OpenVPNに接続
  2. 家(PC)に10.8.0.0 255.255.255.0のIPアドレスが/30で区切られて払い出される[最初に振られるIPはおそらく10.8.0.6/30]
  3. 家(PC) → AWS上のプライベートEC2(Windows、Linux)に接続確認
  • NAT構成の場合、3. は一方通行の通信となり、EC2(Windows、Linux)からみれば送信元IPはOpenVPNサーバーのプライベートIP

OpenVPN_通信1.png

  • ルーティング構成の場合、EC2(Windows、Linux)からみれば送信元IPはOpenVPNサーバーが払い出したクライアントのIPアドレス10.8.0.6/30となる。 [サーバーから家(PC)にも通信可能]

OpenVPN_通信2.png