rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

OpenVPNサーバーをArch系のManjaro Linuxにインストール

2021 May 05.

出典 Arch Linux で OpenVPN サーバをセットアップ - Linearstar Blog

openvpn easy-rsaをインストールする

easy-rsaでのPKI(公開鍵基盤)の構築初期化

# cd /etc/easy-rsa
# easyrsa init-pki

認証局が署名した証明書ファイルca.crtの作成と配置

# cd /etc/easy-rsa
# easyrsa build-ca
# cp pki/ca.crt /etc/openvpn/server/

サーバ証明書の作成

# cd /etc/easy-rsa
# easyrsa gen-req SERVERNAME nopass    ## SERVERNAME部分は任意の文字列

(作成されたファイルの確認)
# ls /etc/easy-rsa/pki/reqs/SERVERNAME.req
# ls /etc/easy-rsa/pki/private/SERVERNAME.key

サーバー証明書への署名

# cd /etc/easy-rsa
# easyrsa sign-req server SERVERNAME

(作成されたサーバー証明書ファイルの確認)
# ls /etc/easy-rsa/pki/issued/SERVERNAME.crt

作成されたサーバー証明書秘密鍵サーバー証明書を配置

# cp /etc/easy-rsa/pki/private/SERVERNAME.key /etc/openvpn/server/
# cp /etc/easy-rsa/pki/issued/SERVERNAME.crt /etc/openvpn/server/

dh.pemとTLS認証鍵ta.keyを作成

dh.pem:セッションの共通鍵を安全に生成するため、暗号鍵を安全に転送するために使用されるDiffie-Hellman鍵交換ファイル

# cd /etc/openvpn/server
# openssl dhparam -out dh.pem 2048
# openvpn --genkey secret ta.key
(旧 # openvpn --genkey --secret ta.key)

OpenVPN設定ファイル作成

サンプルファイルをコピー
# cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf

/etc/openvpn/server/server.confを編集

(失効クライアント証明書リストcrl.pemは設定せず)

port NNNN    ## port 1194 が標準。

# TCP or UDP server?
;proto tcp
proto udp

# network address for OpenVPN client
server 10.8.0.0 255.255.255.0

# encryption
cipher AES-256-CBC
auth SHA512

# For compression compatible with older clients use comp-lzo
# If you enable it here, you must also
# enable it in the client config file.
comp-lzo

# dhcp configuration
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"


/etc/openvpn/server/server.conf

port NNNN    ## port 1194 が標準。

proto udp

dev tun

ca ca.crt
cert SERVERNAME.crt  # Change to YOUR FILE NAME
key SERVERNAME.key  # Change to YOUR FILE NAME. This file should be kept secret

dh dh.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 8.8.8.8"

keepalive 10 120

tls-auth ta.key 0 # This file is secret

cipher AES-256-CBC
data-ciphers AES-256-CBC    # 後述のエラーにより後から追記した
auth SHA512

comp-lzo

persist-key
persist-tun

status openvpn-status.log

verb 3

explicit-exit-notify 1

ファイアウォール設定

IPフォワーディング、IPマスカレードの有効化はsystemd-networkdではなくufw設定ファイルにて行う

# ufw enable
# ufw allow 1194/udp    ## /etc/openvpn/server.confに記述したポート番号
# ufw reload

IPフォワーディング設定

/etc/default/ufwを編集
(DEFAULT_FORWARD_POLICYをDROPからACCEPTに変更する)
- DEFAULT_FORWARD_POLICY="DROP"
+ DEFAULT_FORWARD_POLICY="ACCEPT"

IPフォワーディングを有効化

/etc/ufw/sysctl.confを編集

(net/ipv4/ip_forward=1の一行をアンコメントする)
#net/ipv4/ip_forward=1
net/ipv4/ip_forward=1

旧書式
(net.ipv4.ip_forward=1の一行をアンコメントする)
# net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

IPマスカレード有効化

ifconfigでネットワークポート名を確認する( enp0s7 とか)
/etc/ufw/before.rulesを編集

(一番下の行にCOMMITと書かれているはずなので、この下に以下を追加する)
COMMIT
(このCOMMITは元々書かれているもの。削除しない)

# START OPENVPN RULES
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o enp0s7 -j MASQUERADE
COMMIT
# END OPENVPN RULES


ufw再読み込み

# ufw reload

ファイル属性を下記に変更する。

出典 [SOLVED] OpenVPN fail to start as service with systemd / Networking, Server, and Protection / Arch Linux Forums

# ls -l /etc/openvpn/server/ 
 -r-------- 1 openvpn network  1233  5月  4 23:53 ca.crt
 -r-------- 1 openvpn network   424  5月  4 23:26 dh.pem
 -rw------- 1 openvpn network     0  5月  5 09:12 ipp.txt
 -rw------- 1 openvpn network   526  5月  5 09:12 openvpn-status.log
 -r-------- 1 openvpn network  4699  5月  4 23:23 SERVERNAME.crt
 -r-------- 1 openvpn network  1704  5月  4 23:22 SERVERNAME.key
 -rw------- 1 openvpn network 10911  5月  4 23:50 server.conf
 -r-------- 1 openvpn network   636  5月  4 23:27 ta.key

OpenVPNの一時的起動、エラー出力確認、設定修正

# openvpn /etc/openvpn/server/server.conf

設定へのチェック状況が画面出力される。
無事起動され、
Initialization Sequence Completed
と表示されたら、Ctrl+cでOpenVPNを停止する。
画面出力に従って設定を修正する。

/etc/openvpn/server/server.confの修正

openvpn /etc/openvpn/server/server.confで下記が画面出力された。

DEPRECATED OPTION: --cipher set to 'AES-256-CBC' but missing in --data-ciphers (AES-256-GCM:AES-128-GCM). Future OpenVPN version will ignore --cipher for cipher negotiations. Add 'AES-256-CBC' to --data-ciphers or change --cipher 'AES-256-CBC' to --data-ciphers-fallback 'AES-256-CBC' to silence this warning.


/etc/openvpn/server/server.confに"data-ciphers AES-256-CBC"を追加
参考ページ OpenVPN 2.5 のサイファの互換性 | OpenVPN.JP

cipher AES-256-CBC
data-ciphers AES-256-CBC
auth SHA512

OpenVPN自動起動設定

# systemctl enable openvpn-server@server.service

OpenVPNの起動

# systemctl start openvpn-server@server.service


クライアント用設定

クライアント用秘密鍵の生成
# cd /etc/easy-rsa

# easyrsa build-client-full CLIENTNAME nopass
Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
..............................................................+++++
.................................+++++
writing new private key to '/etc/easy-rsa/pki/easy-rsa-3988.y4aJh1/tmp.T15VkU'
-----
Using configuration from /etc/easy-rsa/pki/easy-rsa-3988.y4aJh1/tmp.9kh5CA
Enter pass phrase for /etc/easy-rsa/pki/private/ca.key: PASS-PHRASE-OF-ca.key-IN-SERVER
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'CLIENTNAME'
Certificate is to be certified until Aug  8 04:47:20 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

(生成されたファイル確認)
# find ./ -name '*CLIENTNAME*'

(クライアントからサーバー接続にパスワードを要する設定にするならば)
# easyrsa build-client-full CLIENTNAME

クライアント内に配置するファイルをSSH通信できる一般ユーザーのディレクトリ(/home/USER/TMP/OVPNCLIENT)にコピーし、属性を設定する
$ mkdir ~/TMP/OVPNCLIENT
$ cd ~/TMP/OVPNCLIENT
$ sudo cp /etc/openvpn/server/ca.crt ./
$ sudo cp /etc/openvpn/server/ta.key ./
$ sudo cp /etc/easy-rsa/pki/issued/CLIENTNAME.crt ./
$ sudo cp /etc/easy-rsa/pki/private/CLIENTNAME.key ./
$ sudo chown USER:USER ca.crt ta.key CLIENTNAME.crt CLIENTNAME.key

~/TMP/OVPNCLIENT/内の4ファイルをクライアント内の所定の場所にコピーする


クライアント内に配置する設定ファイルを作成する

VPNCLIENT.ovpn(拡張子は必ず .ovpn とする)

client
dev    tun
proto  udp
remote YOUR.GLOBAL.ADDRESS.HERE 1194
resolv-retry  infinite
nobind
tls-auth ta.key 1
persist-key
persist-tun
cipher AES-256-CBC
data-ciphers AES-256-CBC

auth SHA512

ca    ca.crt
cert  CLIENTNAME.crt
key   CLIENTNAME.key
comp-lzo
verb 3
  • persist-key, persist-tun, comp-lzo, verbはサーバー側と同じにする。サーバー側に設定してあればこちらにも入力し、設定していない場合は外す。
  • remoteのポート番号はサーバー側と同じにする。

YOUR.GLOBAL.ADDRESS.HEREにはサーバーの属するネットワークのグローバルアドレスを指定。
CLIENTNAME.crt、CLIENTNAME.keyにはクライアントの証明書ファイル名・鍵ファイル名を指定。

VPNCLIENT.ovpnをクライアント内に配置する


クライアントのソフトに従って設定する


クライアントからの接続に成功したら、不要なファイルを削除する
$ rm -rf ~/TMP/OVPNCLIENT