Ubuntu18.04 で OpenVPNサーバーの設定( ID/パスワード認証)

Ubuntu18.04 での OpenVPNサーバーの設定です。
VPN(L2TP/IPsec)サーバの場合は、次の記事を参照して下さい。

VPN(L2TP/IPsec)サーバの設定 パソコン鳥のブログ/ウェブリブログ(CentOS)
UbuntuでのVPN(L2TP/IPsec)サーバの設定 パソコン鳥のブログ/ウェブリブログ


ここで構築するVPN


・VPNサーバは Ubuntu18.04
・VPNサーバのVPN側アドレスは 10.8.0.1
・VPNクライアントのアドレスは 10.8.0.XX
・VPN接続後、クライアントの全ての通信は VPNサーバ経由で行われます。
・VPN接続のユーザ/パスワードは、サーバ上のアカウントのユーザ/パスワード
・Windows,スマホ(Android)から接続可能


サーバーの設定


インストール


OpenVPN をインストールします。


apt install openvpn


openssl をインストールします。
この後の手順で、証明書を作成する際に必要です。


apt install openssl



証明書の用意


認証に必要なファイルを用意します。

「サーバ秘密鍵」、「サーバ証明書」、「サーバ証明書を発行した認証局のCA証明書」を用意します。
各ファイルを次の箇所に置きます。以降、このファイル名で説明します。

サーバ秘密鍵:/etc/openvpn/server.key
サーバ証明書:/etc/openvpn/server.crt
サーバ証明書を発行した認証局のCA証明書:/etc/openvpn/ca.crt


下記記事の「プライベート認証局(オレオレ認証局)による作成方法」の手順に従うと、ca.crt , server.crt , server.key を作成できます。
その他、ca.csr , ca.key , server.csr等も出来ますが、今回の OpenVPNの設定では指定しません。

CentOS6/CentOS7/Ubuntu14.04 でのサーバ証明書の作成方法 パソコン鳥のブログ/ウェブリブログ


dh2048.pem を /etc/openvpn/下に作成します。


openssl dhparam -out /etc/openvpn/dh2048.pem 2048


ta.key を /etc/openvpn/下に作成します。


openvpn --genkey --secret /etc/openvpn/ta.key



OpenVPNサーバーの設定


OpenVPNサーバの server.conf の設定です。
下記の通りに、server.conf を作成します。


/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

keepalive 10 120

tls-auth ta.key 0

comp-lzo

user nobody
group nogroup

persist-key
persist-tun

status openvpn-status.log
log-append  /var/log/openvpn.log
verb 3

management localhost 7505

plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so login
verify-client-cert none
username-as-common-name

push "redirect-gateway def1 bypass-dhcp"


いくつかの項目については、以下の通りです。

port 1194
OpenVPN で使用するポート番号です。
このポートを ufw等のファイアウォールでブロックしないようにする必要があります。


proto udp
OpenVPN で使用するプロトコルを tcp / udp いずれかで指定します。
VPNサーバ、接続するクライアントが共に日本国内ならば、udp の指定で問題ないと思います。


ca ca.crt
cert server.crt
key server.key

「サーバ秘密鍵」、「サーバ証明書」、「サーバ証明書を発行した認証局のCA証明書」を指定します。
これらのファイルは /etc/openvpn に置く必要があります。


dh dh2048.pem
Diffie Hellmanパラメータを含むファイルを指定します。
dh2048.pem は /etc/openvpn に置きます。


server 10.8.0.0 255.255.255.0
VPN で使用されるネットワークアドレスを指定します。
接続してきたVPNクライアントのアドレスは、この範囲から割り当てられます。
VPNサーバ自身は 10.8.0.1 になります。


tls-auth ta.key 0
この機能はオプションなので、指定しなくても OpenVPN は動作しますが、DoS攻撃対策として設定することをお勧めします。
ta.key は /etc/openvpn に置きます。
詳細は以下を参照して下さい。
How To | OpenVPN.JP
OpenVPN TLS-Auth とは?


user nobody
group nogroup

OpenVPN が動作するユーザ・グループを指定します。


log-append /var/log/openvpn.log
ログ出力先を指定します。
なお、この設定ではログに延々出力されますので、ログローテートの設定をしておいた方が良いです。
ログローテートの設定は以降で記載しています。


plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so login
client-cert-not-required
username-as-common-name

サーバ上のユーザID/パスワード認証する為には、この3行が必要です。
pluginオプションで、openvpn-plugin-auth-pam.so へのパスを指定します。
Ubuntu18.04 ではこのパスになります。
また login と指定していますが、これは認証モジュール login を指定しています。
/etc/pam.d/login が存在することを確認しておいて下さい。


push "redirect-gateway def1 bypass-dhcp"
クライアントの通信は、VPNサーバ経由で行います。


ログのローテートの設定を行います。

/etc/logrotate.d/openvpn

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



OpenVPNを起動します。


/etc/init.d/openvpn start




ファイアウォールの設定


OpenVPNでのVPN接続が可能になるように、ネットワークに関するカーネルパラメータを設定します。

/etc/sysctl.conf の末尾に以下の内容を追加します。

/etc/sysctl.conf

net.ipv4.ip_forward = 1



次のコマンドで設定を反映します。


sysctl -p



ファイアウォールの設定を行います。


ufw enable
ufw allow proto udp to any port 1194
ufw allow in on tun+



before.rules の末尾に下記を追加します
既に *nat がある場合は、*nat と COMMIT の間に、-A POSTROUTING~ の行を追加します。

/etc/ufw/before.rules

*nat
-A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
COMMIT


/etc/default/ufw

DEFAULT_FORWARD_POLICY を ACCEPT にします。


設定を反映させます。


ufw reload



これで、OpenVPNサーバーの設定は完了です。


クライアントの設定


Windowsマシンの場合は、次を参照して下さい。
OpenVPNで ID/パスワード認証する為のクライアントの設定方法

スマホ(Android)の場合は、次を参照して下さい。
なお、手順中、次の操作は不要です。
「[カスタムオプション]にチェックし、fragment 1280,mssfix,link-mtu 1400 の3行を設定します。」

Androidスマホでセキュアな通信をOpenVPNで行う


動作確認は、クライアントで接続した後、下記のサイトにアクセスしてみて下さい。
現在の接続元IPアドレスを表示するサイトですが、「現在接続している場所(現IP)」と「プロバイダー名」の個所が、クライアントPCのアドレスではなく、OpenVPNサーバのアドレスになります。

安全な確認くん (検索エンジンにキャッシュされない)



この記事へのコメント

この記事へのトラックバック