CentOS (Raspberry Pi)へのOpenVPNの導入

投稿者:sirius

CentOS (Raspberry Pi)へのOpenVPNの導入

何度かやっているのですが、毎回手順を忘れてしまうので、備忘として記録。

 必要ソフトウェアのインストール

 必要なソフトウェア、ソース・パッケージをインストール・作成していきます。

 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-インストール

著者について

sirius administrator

コメントを残す