Ubunu16.04でOpenVPNサーバーを作る

■概要

今回は図のような構成でVPNサーバーを立て、外のネットワークから、自宅のネットワークに安全に接続できるようにします。 サーバーOS : Ubuntu16.04 クライアントOS : Ubuntu16.04

f:id:k-midorikawa:20161103211545j:plain


■参考資料


ルーターの設定

外部ネットワークから、自宅のネットワークへの接続を許可するためにグローバルIPの1194番ポート宛の通信をVPNサーバーの1194番ポート(192.168.10.11:1194)にフォワーディングする必要があります。
※設定の仕方はルーターによって異なりますが、私が使っているルーターだと下のような感じになりました。

f:id:k-midorikawa:20161103212119p:plain


VPNサーバーの設定

OpenVPNのインストール

openvpnとeasy-rsaをインストールします。

$ sudo -i
# apt update
# apt install -y openvpn easy-rsa

設定ファイルを準備します。

# mkdir /etc/openvpn/easy-rsa/
# cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
# cd /etc/openvpn/easy-rsa

認証局の準備

今回は自己認証局を利用するので、VPNサーバー内で認証局証明書と認証局秘密鍵を作成します。

はじめに、認証局の所在地や組織名を決めます。(任意の値で良いです)

# vim vars

以下の内容を設定します。

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Saitama"
export KEY_CITY="Niiza"
export KEY_ORG="Example Company"
export KEY_EMAIL="hoge@example.com"
export KEY_OU="MyVPN"
export KEY_NAME="MyVPN"
export KEY_CN="MyVPN"
export KEY_ALTNAMES="MyVPN"

環境変数を読み込み、認証局証明書(ca.crt)、認証局秘密鍵(ca.key)作成します。
(/etc/openvpn/easy-rsa/keysにca.crtとca.keyが生成されます。)

# source vars
# ./clean-all
# ./build-ca

./build-caを実行するといくつか質問されますが、すべてEnterを押してください。

Generating a 2048 bit RSA private key
(中略)
Country Name (2 letter code) [JP]: ★Enter
State or Province Name (full name) [Saitama]: ★Enter
Locality Name (eg, city) [Niiza]: ★Enter
Organization Name (eg, company) [Example Company]: ★Enter
Organizational Unit Name (eg, section) [MyVPN]: ★Enter
Common Name (eg, your name or your server's hostname) [MyVPN]: ★Enter
Name [MyVPN]: ★Enter
Email Address [hoge@example.com]: ★Enter

サーバーで必要な鍵の作成

サーバー秘密鍵(server.key)、サーバー証明書(server.crt)を作成します。
(/etc/openvpn/easy-rsa/keysにserver.crtとserver.keyが生成されます。)

# ./build-key-server server

実行するといろいろ聞かれますが、すべてEnterを押してください。[y/n]の質問にはyと答えてください。

Generating a 2048 bit RSA private key
(中略)
Country Name (2 letter code) [JP]: ★Enter
State or Province Name (full name) [Saitama]: ★Enter
Locality Name (eg, city) [Niiza]: ★Enter
Organization Name (eg, company) [Example Company]: ★Enter
Organizational Unit Name (eg, section) [MyVPN]: ★Enter
Common Name (eg, your name or your server's hostname) [server]: ★Enter
Name [MyVPN]: ★Enter
Email Address [hoge@example.com]: ★Enter

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ★Enter
An optional company name []: ★Enter
(中略)
Sign the certificate? [y/n]: ★y


1 out of 1 certificate requests certified, commit? [y/n] ★y
Write out database with 1 new entries
Data Base Updated

DH鍵を作成します。※時間がかかります
(/etc/openvpn/easy-rsa/keysにdh2048.pemが生成されます。)

# ./build-dh

tls-auth鍵を作成します。
(/etc/openvpn/easy-rsa/keysにta.keyが生成されます。)

# cd keys
# openvpn --genkey --secret ta.key

サーバー証明書、サーバー秘密鍵認証局証明書、DH鍵、tls-auth鍵を/etc/openvpnにコピーします。

# cp server.crt server.key ca.crt dh2048.pem ta.key /etc/openvpn

クライアントで必要な鍵の作成

クライアント秘密鍵(client.key)、クライアント証明書(client.crt)を作成します。
(/etc/openvpn/easy-rsa/keysにclient1.crtとclient1.keyが生成されます。)

# cd /etc/openvpn/easy-rsa
# source vars
# ./build-key client1

実行するといろいろ聞かれますが、すべてEnterを押してください。[y/n]の質問にはyと答えてください。

Generating a 2048 bit RSA private key
(中略)
Country Name (2 letter code) [JP]: ★Enter
State or Province Name (full name) [Saitama]: ★Enter
Locality Name (eg, city) [Niiza]: ★Enter
Organization Name (eg, company) [Example Company]: ★Enter
Organizational Unit Name (eg, section) [MyVPN]: ★Enter
Common Name (eg, your name or your server's hostname) [server]: ★Enter
Name [MyVPN]: ★Enter
Email Address [hoge@example.com]: ★Enter

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ★Enter
An optional company name []: ★Enter
(中略)
Sign the certificate? [y/n]: ★y


1 out of 1 certificate requests certified, commit? [y/n] ★y
Write out database with 1 new entries
Data Base Updated

ここまで完了したら、/etc/openvpn/easy-rsa/keys配下のca.crt, ta.key, client1.key, client1.crtを安全な方法でクライアントとなる端末に転送してください。

コンフィグファイルの編集

# cd /etc/openvpn/
# vim /etc/openvpn/server.conf

下記を設定

port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
mode server
tls-server
tls-auth ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

その他設定

ipv4のフォワーディングを有効にします。

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p

ログの初期設定を行います。

# journalctl --identifier ovpn-server

OpenVPNサーバー起動

openvpnサービスを起動します。

# systemctl start openvpn
# systemctl start openvpn@server

サービスが正常に起動しているか確認します。

# systemctl status openvpn
# systemctl status openvpn@server

トンネルデバイスが生成されているか確認します。

# ifconfig tun0

VPNクライアントの設定

OpenVPNのインストール

openvpnとeasy-rsaをインストールします。

$ sudo -i
# apt update
# apt install -y openvpn

先ほどサーバーから転送したca.crt, ta.key, client1.crt, client1.keyを/etc/openvpn配下に配置します。
※下記パーミッションとなっていることを確認してください。

-rw-r--r--   1 root root  1704 11月  3 19:19 ca.crt
-rw-r--r--   1 root root  5437 11月  3 22:09 client1.crt
-rw-------   1 root root  1704 11月  3 22:09 client1.key
-rw-------   1 root root   636 11月  3 21:42 ta.key

コンフィグファイルの編集

# cd /etc/openvpn/
# vim /etc/openvpn/client.conf

下記を設定

client
dev tun
proto tcp
remote xx.xx.xx.xx 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-128-CBC
comp-lzo
verb 3

※xx.xx.xx.xxにはVPNサーバーがあるネットワークのグローバルIPを設定してください。
グローバルIPを調べるにはVPNサーバーで下記コマンドを実行してください。

$ curl inet-ip.info

OpenVPNの起動

VPNサーバーとは異なるネットワークで起動してください。 openvpnを起動します。

# systemctl start openvpn
# systemctl start openvpn@client

サービスが正常に起動しているか確認します。

# systemctl status openvpn
# systemctl status openvpn@client

トンネルデバイスが生成されているか確認します。

$ ifconfig tun0

VPNサーバーにpingが通るか確認します。

pign 10.8.0.1

■おまけ

上記の設定だと、VPNサーバー以外のノードにアクセスするには、一旦VPNサーバーにログインしたあとにアクセスしなければいけません。 以下の設定に変更すると、クライアントから、VPNサーバー以外のノードに直接アクセスできるようになります。

f:id:k-midorikawa:20161103235854j:plain

サーバー側の設定

サーバー側の設定ファイルを下記のように変更します。

# vim /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.10.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.10.1"
keepalive 10 120
mode server
tls-server
tls-auth ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
fragment 1280
mssfix 1280
link-mtu 1400

IPマスカレードの設定を行います。※この設定は再起動すると揮発します。

下記はソースアドレスが10.8.0.0/24で、eth0(vpnで直接繋ぎたいセグメント)を通過するパケットのソースアドレスをeth0に設定されているアドレスに書き換える設定です。 これによって、vpnクライアントから内部ネットワークへのパケットはvpnサーバーを経由してクライアント返ってくるようになります。

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

openvpnサービスを起動します。

# systemctl start openvpn
# systemctl start openvpn@server

サービスが正常に起動しているか確認します。

# systemctl status openvpn
# systemctl status openvpn@server

トンネルデバイスが生成されているか確認します。

# ifconfig tun0

クライアント側の設定

サーバー側の設定ファイルを下記のように変更します。
※xx.xx.xx.xxにはVPNサーバーがあるネットワークのグローバルIPを設定してください。

# vim /etc/openvpn/client.conf
client
proto udp
dev tun
remote xx.xx.xx.xx 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
remote-cert-tls server
tls-auth ta.key 1
cipher AES-128-CBC
comp-lzo
verb 3
fragment 1280
mssfix 1280
link-mtu 1400

※下記はVPNサーバーとは異なるネットワークで行ってください。

openvpnを起動します。

# systemctl start openvpn
# systemctl start openvpn@client

サービスが正常に起動しているか確認します。

# systemctl status openvpn
# systemctl status openvpn@client

トンネルデバイスが生成されているか確認します。

$ ifconfig tun0

VPNサーバーにpingが通るか確認します。

pign 192.168.10.11

VPNサーバー以外のノードにpingが通るか確認します。

pign 192.168.10.12