OpenVPNサーバを構築

OS: Ubuntu Server 16.04
OpenVPN 2.4.5
easy-rsa v3.0.5

高度で複雑な仕組みと専門用語におそれをなして及び腰になってしまってから数年間ペンディングしていたOpenVPNの導入であるけれども、世論の高まりを受けていよいよ実施するから記録を残しておくものである。まずはソースをダウンロードする。

$ wget -c https://swupdate.openvpn.org/community/releases/openvpn-2.4.5.tar.gz
$ wget -c https://swupdate.openvpn.org/community/releases/openvpn-2.4.5.tar.gz.asc

$ gpg --recv-key AF131CAE
$ gpg --verify openvpn-2.4.5.tar.gz.asc

$ tar zxvf openvpn-2.4.5.tar.gz
$ cd openvpn-2.4.5/

configureを実施する前に必要なパッケージを準備しておかねばならない。さもなくば立て続けにエラーメッセージを頂戴して終いである。

なおUbuntu Server 18.04のベータ版では「configure: error: route utility is required but missing」と表示されたのでnet-toolsを要するようであった。iproute2への移行が進んでいることを感ずる。

メッセージ必要なパッケージ
usable LZ4 library or header not found,
using version in src/compat/compat-lz4.*
liblz4-dev
openssl check failedlibssl-dev
lzo enabled but missingliblzo2-dev
libpam required but missinglibpam0g-dev
route utility is required but missingnet-tools
$ sudo apt install libssl-dev liblz4-dev liblzo2-dev libpam0g-dev
$ ./configure
$ make
$ sudo make install

次はeasy-rsaを用意する。此れで以って認証局を構築したりサーバ、クライアントの証明書や秘密鍵を作成してゆくようである。

$ cd ..
$ wget -c https://github.com/OpenVPN/easy-rsa/archive/v3.0.5.zip -O easy-rsa-v3.0.5.zip
$ unzip -x easy-rsa-v3.0.5.zip
$ cd easy-rsa-3.0.5/easyrsa3/

事始めにinit-pkiコマンドによってpkiディレクトリとprivate、reqsサブディレクトリを作成する。

$ ./easyrsa init-pki

認証局の構築

OpenVPNサーバとは別のマシンに認証局を構築するのがほんとうのところであるとの事であったが、余分に割くリソースがちょっとないのでやむなく同じマシンに作り上げるものである。認証局のパスフレーズをここで定めるのであるが、これを忘れると証明書の発行に差し障りがでるので大切に管理しなければならない。

$ ./easyrsa build-ca
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
(snip)

/etc/openvpnディレクトリを作成してここへOpenVPNに関連するファイルや設定ファイルを放り込んでゆく方針にする。先ずはさきに作成した認証局の証明書をコピーする。

$ sudo mkdir /etc/openvpn
$ sudo cp pki/ca.crt /etc/openvpn/

サーバの証明書と秘密鍵作成

サーバの証明書と秘密鍵をこさえる。./easyrsa build-server-full server nopassのserverの箇所はファイル名の一部になるようである。例えばここをopenvpnに変更すればopenvpn.keyとopenvpn.crtが出来上がるというわけである。

nopassはサーバの秘密鍵を暗号化せずに運用するものである。暗号化するとOpenVPN起動のたびにパスフレーズを入力する必要に迫られる。

$ ./easyrsa build-server-full server nopass
(snip)
Enter pass phrase for /home/guro/src/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/ca.key:

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

作成には認証局のパスフレーズが問われるので正確に入力する。これを間違えるとエラーが出て終いであるが、改めて作成を試みると前回の証明書署名要求ファイルと秘密鍵が置き去りのままである為に「Request file already exists.」というエラーメッセージが現れて先へ進まないからこれらを削除してしまうのが良いようである。

$ rm pki/reqs/server.req pki/private/server.key

Diffie-Hellmanパラメータの生成

一体どういうパラメータなのかちょっと知れないが前方秘匿性という性質で以って持て囃されているようである。マシンパワーもさることながら巡り合わせによってはまことに暇のかかる処理であるから、コマンドを実行したらしばらくお茶にでも出掛けるのが良かろうと思う。

$ ./easyrsa gen-dh
$ sudo cp pki/dh.pem /etc/openvpn/

中身をつぶさに見てゆくならこうである。2048bitもの巨大な素数primeとgeneratorが鍵交換のために使われるようである。これらの値は悪いやつに知られてしまっても構わないようである。

$ sudo openssl dh -text -in /etc/openvpn/dh.pem
    DH Parameters: (2048 bit)
        prime:
            00:fd:fe:1c:09:f4:03:49:3e:69:e5:45:4a:51:ff:
            7f:2b:c9:3b:59:18:e0:7e:86:79:e8:d6:09:15:3a:
            dc:8e:27:7f:f2:6b:e1:08:21:33:ba:71:4e:54:d3:
(snip)
            05:c5:b0:e3:ef:1b:1b:d0:58:1e:bc:88:8f:4e:be:
            f9:3f:2e:45:d7:7e:0e:e4:5e:80:e6:3e:d1:9c:d8:
            d9:fd:5b:a7:10:2a:d9:9f:f3:c2:45:a7:48:a6:0d:
            7c:4b
        generator: 2 (0x2)

HMACキーの作成

HMACとはHash-based Message Authentication Codeの略称のようである。大変長い。目がまわる。これはUDPポートフラッディング攻撃のようなDoS攻撃などを未然に防ぐために役立つという。むつかしい。目がまわる。

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

設定ファイルの編集

サンプルの設定ファイルが準備されているのでこれをコピーし、環境に合わせて設定を施してゆくのが良かろうと思う。

$ cd ../../openvpn-2.4.5/sample/sample-config-files/
$ sudo cp server.conf /etc/openvpn/

多くの設定項目があるので大変難儀したけれども概ねこういう具合に落ち着いた。

$ sudo vi /etc/openvpn/server.conf
port                  1194
proto                 udp
dev                   tun
ca                    /etc/openvpn/ca.crt
cert                  /etc/openvpn/server.crt
key                   /etc/openvpn/server.key
dh                    /etc/openvpn/dh.pem
tls-auth              /etc/openvpn/ta.key 0
server                10.8.0.0 255.255.255.0
push                  "route 10.8.0.0 255.255.255.0"
push                  "redirect-gateway def1 bypass-dhcp"
push                  "dhcp-option DNS 8.8.4.4"
push                  "compress lz4-v2"
compress              lz4-v2
client-to-client
keepalive             10 120
cipher                AES-256-GCM
ncp-ciphers           AES-256-GCM
tls-version-min       1.2
tls-cipher            TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
user                  openvpn
group                 openvpn
persist-key
persist-tun
status                /var/log/openvpn-status.log
log-append            /var/log/openvpn.log
ifconfig-pool-persist /var/log/ipp.txt
verb                  4

OpenVPNの実行ユーザとグループをopenvpnにセットしたので実際に作成しておく。

$ sudo useradd -s /bin/false openvpn

ipフォワードを有効にしてiptablesで以ってIPマスカレードの設定をする。こうすることでクライアントがサーバ側のセグメントにあるマシンとやり取りできるようになるようである。

$ sudo vi /etc/sysctl.conf
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

$ sudo sysctl -p
net.ipv4.ip_forward = 1

$ sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -o ens33 -j MASQUERADE

あとは起動を試みてエラーがでなければサーバの構築は完了である。

$ sudo openvpn --config /etc/openvpn/server.conf --daemon

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください