何度かやっているのですが、毎回手順を忘れてしまうので、備忘として記録。
必要ソフトウェアのインストール
必要なソフトウェア、ソース・パッケージをインストール・作成していきます。
wgetのインストール
デフォルトのCentOSにはwgetが入っていないのでまずはそちらのインストールから
1 | # yum install wget |
OpenVPNソースファイルのダウンロード
OpenVPNの公式サイトからソースファイルをダウンロードします。(ここではバージョン2.4.2)
https://openvpn.net/community-downloads/
RPMパッケージの作成
最初に必要なパッケージをインストール
1 2 3 4 5 6 7 8 | # 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パッケージを作成
1 | # rpm build -tb openvpn-2.4.2.tar.gz |
・・・しばらく待つ
ホームディレクトリのrpmbuildフォルダにRPMパッケージが作成されているので、インストールする(sirius:ユーザ名)
1 2 | # cd /home/sirius/rpmbuild/RPMS/armv7hl # rpm -ivh openvpn-2.4.2-1.armv7hl.rpm |
easy-rsaのダウンロード
以下のコマンドで保存する
openvpnフォルダに格納し、zipを解凍する
1 2 | # mv master.zip /etc/openvpn # unzip master.zip |
証明書作成
ここからはVPJN接続に必要な証明書を作成していきます。
証明書作成の流れ
初期化とca証明書の作成
1 2 3 4 | # cd /etc/openvpn/easy-rsa-master/easyrsa3/ # ./easyrsa init-pki # ./easyrsa build-ca |
パスフレーズなど応答
ca証明書をopenvpn直下にコピー
1 | # cp ./pki/ca.crt /etc/openvpn/ |
サーバ証明書と秘密鍵の作成
1 | # ./easyrsa build-server-full server nopass |
ca証明書作成時のパスフレーズを応答
サーバ証明書をopenvpn直下にコピー
1 | # cp ./pki/issued/server.crt /etc/openvpn/ |
サーバ秘密鍵をopenvpn直下にコピー
1 | # cp ./pki/private/server.key /etc/openvpn/ |
DHパラメータ作成
1 | # ./easyrsa gen-dh |
・・・しばらく待つ(本当に長い!)
DHパラメータをopenvpn直下にコピー
1 | # cp ./pki/dh.pem /etc/openvpn/ |
クライアント証明書の作成 クライアント名は適宜修正
1 | # ./easyrsa build-client-full client1 nopass |
ca証明書作成時のパスフレーズを応答
OpenVPN設定
ここからはいよいよOpenVPNの設定に入っていきます。
OpenVPN設定の流れ
設定ファイルのテンプレートをコピーする
1 2 | # cd /etc/openvpn # cp /usr/share/doc/openvpn-2.4.2/sample/sample-config-files/server.conf ./ |
TLS鍵の作成
1 | # openvpn --genkey --secret ta.key |
IPフォワードの設定
1 | # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4.forward.conf |
Firewall穴あけ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* ゾーン名は環境に合わせて適宜変える */ # 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の設定確認
1 2 | # getenforce Enforcing |
Enforcingなら起動状態なので、通信が許可されているか確認する。
1 2 3 | # semanage port -l | grep openvpn openvpn_port_t tcp 1194 openvpn_port_t udp 1194 |
デフォルト(UDP 1194)以外の場合は対象ポートを許可する。
1 | # semanage port -a -t openvpn_port_t -p udp xxxxxx |
server.confの設定
1 | # vi server.conf |
以下を設定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /* 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 |
ここまで設定したら保存して閉じる
1 | :wq! |
起動スクリプト作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 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/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 |
保存して閉じる
1 | :wq! |
OpenVPN起動
1 | # systemctl start openvpn-server |
自動起動設定
1 | # systemctl enable openvpn-server |
クライアント設定
ここからは、接続するクライアント向けの設定になります。
クライアント設定の流れ
以下のコマンドでクライアント毎の証明書を作成します。
1 2 | # cd /etc/openvpn/easy-rsa-master/easyrsa3 # ./easyrsa build-client-full xxxx nopass |
CA証明書作成時のパスフレーズを応答(xxxx:クライアント名)
クライアント側のプロファイル(*.ovpn)作成
こちらを参考に、作成用のスクリプトを使うと楽です。
(以下のコードは上記リンクからの転載となります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # 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あたりで実行権限を付与します
1 | # chmod 755 mkovpn.sh |
ヘッダファイルも一緒に作成します。(xxxx.xxxはIPアドレスもしくはドメイン名)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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ファイルにリダイレクトする。
1 | # ./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-インストール
著者について