Edited at

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