Ubunu16.04でOpenVPNサーバーを作る
■概要
今回は図のような構成でVPNサーバーを立て、外のネットワークから、自宅のネットワークに安全に接続できるようにします。 サーバーOS : Ubuntu16.04 クライアントOS : Ubuntu16.04
■参考資料
■ルーターの設定
外部ネットワークから、自宅のネットワークへの接続を許可するためにグローバルIPの1194番ポート宛の通信をVPNサーバーの1194番ポート(192.168.10.11:1194)にフォワーディングする必要があります。
※設定の仕方はルーターによって異なりますが、私が使っているルーターだと下のような感じになりました。
■VPNサーバーの設定
OpenVPNのインストール
$ 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のインストール
$ 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
pign 10.8.0.1
■おまけ
上記の設定だと、VPNサーバー以外のノードにアクセスするには、一旦VPNサーバーにログインしたあとにアクセスしなければいけません。 以下の設定に変更すると、クライアントから、VPNサーバー以外のノードに直接アクセスできるようになります。
サーバー側の設定
サーバー側の設定ファイルを下記のように変更します。
# 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
pign 192.168.10.11
pign 192.168.10.12