何度かやっているのですが、毎回手順を忘れてしまうので、備忘として記録。
必要ソフトウェアのインストール
必要なソフトウェア、ソース・パッケージをインストール・作成していきます。
wgetのインストール
デフォルトのCentOSにはwgetが入っていないのでまずはそちらのインストールから
# yum install wget
OpenVPNソースファイルのダウンロード
OpenVPNの公式サイトからソースファイルをダウンロードします。(ここではバージョン2.4.2)
https://openvpn.net/community-downloads/
# wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.2.tar.gz
RPMパッケージの作成
最初に必要なパッケージをインストール
# yum install gcc
# yum install gcc-c++
# yum install autoconf
# yum install automake
# yum install rpm-build
# yum install openssl-devel
# yum install lzo-devel
# yum install pam-devel
rpmbuildでRPMパッケージを作成
# rpm build -tb openvpn-2.4.2.tar.gz
・・・しばらく待つ
ホームディレクトリのrpmbuildフォルダにRPMパッケージが作成されているので、インストールする(sirius:ユーザ名)
# cd /home/sirius/rpmbuild/RPMS/armv7hl
# rpm -ivh openvpn-2.4.2-1.armv7hl.rpm
easy-rsaのダウンロード
以下のコマンドで保存する
# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
openvpnフォルダに格納し、zipを解凍する
# mv master.zip /etc/openvpn
# unzip master.zip
証明書作成
ここからはVPJN接続に必要な証明書を作成していきます。
証明書作成の流れ
初期化とca証明書の作成
# cd /etc/openvpn/easy-rsa-master/easyrsa3/
# ./easyrsa init-pki
# ./easyrsa build-ca
パスフレーズなど応答
ca証明書をopenvpn直下にコピー
# cp ./pki/ca.crt /etc/openvpn/
サーバ証明書と秘密鍵の作成
# ./easyrsa build-server-full server nopass
ca証明書作成時のパスフレーズを応答
サーバ証明書をopenvpn直下にコピー
# cp ./pki/issued/server.crt /etc/openvpn/
サーバ秘密鍵をopenvpn直下にコピー
# cp ./pki/private/server.key /etc/openvpn/
DHパラメータ作成
# ./easyrsa gen-dh
・・・しばらく待つ(本当に長い!)
DHパラメータをopenvpn直下にコピー
# cp ./pki/dh.pem /etc/openvpn/
クライアント証明書の作成 クライアント名は適宜修正
# ./easyrsa build-client-full client1 nopass
ca証明書作成時のパスフレーズを応答
OpenVPN設定
ここからはいよいよOpenVPNの設定に入っていきます。
OpenVPN設定の流れ
設定ファイルのテンプレートをコピーする
# cd /etc/openvpn
# cp /usr/share/doc/openvpn-2.4.2/sample/sample-config-files/server.conf ./
TLS鍵の作成
# openvpn --genkey --secret ta.key
IPフォワードの設定
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4.forward.conf
Firewall穴あけ
/* ゾーン名は環境に合わせて適宜変える */
# firewall-cmd --add-port=1194/udp --zone=public --permanent
# firewall-cmd --add-masquerade --zone=public --permanent
# firewall-cmd --reload
/* 設定確認 */
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports: 22/tcp 1194/udp
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
SELinuxの設定確認
# getenforce
Enforcing
Enforcingなら起動状態なので、通信が許可されているか確認する。
# semanage port -l | grep openvpn
openvpn_port_t tcp 1194
openvpn_port_t udp 1194
デフォルト(UDP 1194)以外の場合は対象ポートを許可する。
# semanage port -a -t openvpn_port_t -p udp xxxxxx
server.confの設定
# vi server.conf
以下を設定する
/* port指定 デフォルト1194 */
port 1194
/* プロトコル指定 デフォルトUDP */
proto udp
/* DHパラメータのファイル名、パス変更 */
- dh dh2048.pem
dh /etc/openvpn/dh.pem
/* 証明書関係のパス変更 */
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
tls-auth /etc/openvpn/ta.key 0
/* VPNアドレス範囲指定 デフォルト10.8.0.0/24 */
- server 10.8.0.0 255.255.255.0
server 10.9.0.0 255.255.255.0
/* LAN内のルーティング追加 */
push "route 192.168.1.0 255.255.255.0"
/* DNSの設定 */
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
/* クライアントの通信をサーバ経由にする */
- ;push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway def1 bypass-dhcp"
/* クライアント間の通信を許可 */
- ;client-to-client
client-to-client
/* コメント記号 ; を削除(実行権限を下げる) */
- ;user nobody
- ;group nobody
user nobody
group nobody
/* ログ出力先の設定 */
- ;log-append openvpn.log
log-append /var/log/openvpn.log
- ;status openvpn-status.log
status /var/log/openvpn-status.log
ここまで設定したら保存して閉じる
:wq!
起動スクリプト作成
# vi /etc/systemd/system/openvpn-server.service
[Unit]
Description=OpenVPN service
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
Type=simple
PrivateTmp=true
ExecStart=/sbin/openvpn --config /etc/openvpn/server.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
保存して閉じる
:wq!
OpenVPN起動
# systemctl start openvpn-server
自動起動設定
# systemctl enable openvpn-server
クライアント設定
ここからは、接続するクライアント向けの設定になります。
クライアント設定の流れ
以下のコマンドでクライアント毎の証明書を作成します。
# cd /etc/openvpn/easy-rsa-master/easyrsa3
# ./easyrsa build-client-full xxxx nopass
CA証明書作成時のパスフレーズを応答(xxxx:クライアント名)
クライアント側のプロファイル(*.ovpn)作成
こちらを参考に、作成用のスクリプトを使うと楽です。
(以下のコードは上記リンクからの転載となります)
# vi mkovpn.sh
#!/bin/bash
# サーバ証明書のパス
ca_path="/etc/openvpn/easy-rsa-master/easyrsa3/pki"
# クライアント用秘密鍵のパス
key_path="/etc/openvpn/easy-rsa-master/easyrsa3/pki/private"
# クライアント用証明書のパス
crt_path="/etc/openvpn/easy-rsa-master/easyrsa3/pki/issued"
# ta鍵のパス
ta_path="/etc/openvpn"
# 引数チェック
if [ $# -ne 2 ]; then
echo "実行するにはヘッダーと対象のクライアントを引数にする必要があります。" 1>&2
exit 1
fi
# 引数取得
header=$1
target=$2
# 作成開始
cat $header
echo '<ca>'
grep -A 30 'BEGIN CERTIFICATE' "$ca_path/ca.crt"
echo '</ca>'
echo '<key>'
cat "$key_path/$target.key"
echo '</key>'
echo '<cert>'
grep -A 30 'BEGIN CERTIFICATE' "$crt_path/$target.crt"
echo '</cert>'
echo '<tls-auth>'
cat "$ta_path/ta.key"
echo '</tls-auth>'
適当に755あたりで実行権限を付与します
# chmod 755 mkovpn.sh
ヘッダファイルも一緒に作成します。(xxxx.xxxはIPアドレスもしくはドメイン名)
# vi ovpn_header
client
dev tun
proto udp
remote xxxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-client
key-direction 1
cipher AES-256-CBC
verb 3
tun-mtu 1500
ここまで作成したら、早速シェルスクリプトを実行します。リダイレクトしないと画面に出力されるだけなので、.ovpnファイルにリダイレクトする。
# ./mkovpn.sh ovpn_header xxxx > xxxx.ovpn
(xxxx:クライアント名 ※↑で指定したもの)
出来上がったovpnファイルは、何かしらの方法(SCPとかSFTPとか)でクライアント側の端末に転送する。
これで接続出来るようになるはず。(ルータのポート開放はやっている前提)
【参考にさせていただいたサイト】
https://qiita.com/juiblex/items/27611ee42bfee740c0cb
http://dotnsf.blog.jp/archives/1020442249.html
https://qiita.com/SSMU3/items/bf82f76af9534b21da8c
https://qiita.com/horus19761108/items/9c7879149218d9325c5e
https://centossrv.com/openvpn.shtml
https://www.unknownengineer.net/entry/2017/07/22/195204
https://callcenter-trend.com/2017/06/21/centos6-で構築%E3%80%80openvpn-2-4-2-1-インストール
著者について