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 failed | libssl-dev |
lzo enabled but missing | liblzo2-dev |
libpam required but missing | libpam0g-dev |
route utility is required but missing | net-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