スズハドットコム

IT関連や3Dプリンタの記事、たまに生活のメモを書いていきます。

EdgeRouterX ER-X でOpenVPN環境を構築

今更感半端ないテーマですが、証明書期限切れにより思い切ってOpenVPN環境を再構築したので記録を残します。

 

【1】証明書の有効期限を延長する

 

デフォルトでは証明書の有効期限がCA証明書は3年、サーバ証明書は1年です。

これをCA証明書10年、サーバ証明書5年に延ばします

 

ググった結果によると、以下2ファイルを修正すればいけそうです。

  • /usr/lib/ssl/misc/CA.pl
  • /etc/ssl/openssl.cnf

 

それぞれ、念のためコピーを取ってから修正していきます。

$ cd /usr/lib/ssl/misc
$ cp -p CA.pl CA.pl.bak
$ sudo vi CA.pl

下記のところを修正します。

CADAYSがCA証明書の有効期限、DAYSがサーバ証明書の有効期限と思われます。

my $DAYS = "-days 1827"; # 5 years
my $CADAYS = "-days 3653"; # 10 years

 

$ cd /etc/ssl
$ cp -p openssl.cnf openssl.cnf.bak
$ sudo vi openssl.cnf

下記のところを修正します。

default_daysがサーバ証明書の有効期限と思われます。CA.plのDAYSとの関係性は不明ですが両方直しました。

default_days = 1827 # how long to certify for

 

【2】OpenVPNサーバのセットアップ

 

公式の以下のページに従って構成していきます。

https://help.ubnt.com/hc/en-us/articles/115015971688-EdgeRouter-OpenVPN-Server

 

【2-1】認証用の証明書の生成

 

rootになります。

$ sudo su

 

DH鍵を生成します。

# openssl dhparam -out /config/auth/dh.pem -2 2048

⇒5分くらいかかりました。

 

CA証明書を作成します。

# cd /usr/lib/ssl/misc
# ./CA.pl -newca
CA certificate filename (or enter to create)
⇒CA証明書を新規作成するのでENTERを押します。

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒CA証明書秘密鍵に設定するパスフレーズを指定します。

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section)
:fugafuga
Common Name (e.g. server FQDN or YOUR name) :root
Email Address
:.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name
:

⇒証明書のパラメータを入力します。(自分しか使わないのでテキトーな値でも構わないと思います)

Certificate Details:
Validity
Not Before: Mar 18 05:22:10 2020 GMT
Not After : Mar 19 05:22:10 2030 GMT

⇒有効期限10年のCA証明書が出来上がりました。

 

cacert.pemとcakey.pemを/config/auth/にコピーします。

# cp demoCA/cacert.pem /config/auth/
# cp demoCA/private/cakey.pem /config/auth/

 

サーバ証明書を作成します。

まずは証明書発行リクエストを作成。

# ./CA.pl -newreq

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒サーバ証明書秘密鍵に設定するパスフレーズを指定します。(後で消してしまうので何ても良いです。)

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section)
:fugafuga
Common Name (e.g. server FQDN or YOUR name) :server
Email Address
:.

⇒証明書のパラメータを入力します。

 

次に証明書発行リクエストに署名して、サーバ証明書を作成。

# ./CA.pl -sign

Enter pass phrase for ./demoCA/private/cakey.pem:
⇒CA証明書秘密鍵のパスフレーズを入力します。

Certificate Details:
Validity
Not Before: Mar 18 06:00:14 2020 GMT
Not After : Mar 19 06:00:14 2025 GMT

⇒有効期限5年のサーバ証明書であることが確認できます。

 

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

 

サーバ証明書と鍵ファイルをリネームして/config/auth/にコピーします。

# mv newcert.pem /config/auth/server.pem
# mv newkey.pem /config/auth/server.key

 

クライアント証明書を作成します

やってることはサーバ証明書と全く同じです。

証明書発行リクエストを作成するときのCommon Nameと、サーバ証明書と鍵ファイルをリネームするときの名前が違うだけ。

# ./CA.pl -newreq

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒サーバ証明書秘密鍵に設定するパスフレーズを指定します。(後で消してしまうので何ても良いです。)

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section)
:fugafuga
Common Name (e.g. server FQDN or YOUR name) :client1
Email Address
:.

  

# ./CA.pl -sign

Enter pass phrase for ./demoCA/private/cakey.pem:
⇒CA証明書秘密鍵のパスフレーズを入力します。

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

 

# mv newcert.pem /config/auth/client1.pem
# mv newkey.pem /config/auth/client1.key

 

サーバ証明書、クライアント証明書の鍵ファイルのパスフレーズを消去します。

# openssl rsa -in /config/auth/server.key -outt /config/auth/server-no-pass.key
Enter pass phrase for /config/auth/server.key:
⇒サーバ証明書秘密鍵のパスフレーズを入力します。

# openssl rsa -in /config/auth/client1.key -oout /config/auth/client1. -no-pass.key
Enter pass phrase for /config/auth/client1.key:
⇒クライアント証明書秘密鍵のパスフレーズを入力します。

 

鍵ファイルをパスフレーズなし版で上書きします。

# mv /config/auth/server-no-pass.key /config/aauth/server.key
# mv /config/auth/client1-no-pass.key /configg/auth/client1.key

 

クライアント証明書の鍵ファイルに非rootユーザの読み取り権限を付けます。

# chmod 644 /config/auth/er-x-client01.key

 

最終的に、/config/authディレクトリ内はこのようになります。

# ls -l /config/auth
total 40
-rw-r--r-- 1 root vyattacf 4398 Mar 18 05:56 cacert.pem
-rw------- 1 root vyattacf 1854 Mar 18 05:56 cakey.pem
-rw-r--r-- 1 root vyattacf 424 Mar 18 05:12 dh.pem
-rw-r--r-- 1 root vyattacf 1675 Mar 18 06:27 client1.key
-rw-r--r-- 1 root root 4576 Mar 18 06:04 client1.pem
-rw------- 1 root vyattacf 1675 Mar 18 06:26 server.key
-rw-r--r-- 1 root root 4570 Mar 18 06:00 server.pem

 

rootから抜けて通常ユーザに戻ります。

# exit

 

ここまで出来たら、SCPなどを使って以下のファイルをEdgeRouterからPCにダウンロードしておいてください。

  • cacert.pem
  • client1.pem
  • client1.key

 

 

【2-2】EdgeRouter側の設定

 

configモードに入ります。

以降、ENTERを押すたびに「[edit]」と表示されますが本文中では省略します。

$ configure

 

WAN_LOCALファイアウォールポリシーを設定します。

# set firewall name WAN_LOCAL rule 30 action accept
# set firewall name WAN_LOCAL rule 30 description openvpn
# set firewall name WAN_LOCAL rule 30 destination port 1194
# set firewall name WAN_LOCAL rule 30 protocol udp

 

バーチャルトンネルインターフェースvtun0 を設定します。

# set interfaces openvpn vtun0 mode server
# set interfaces openvpn vtun0 server subnet 192.168.100.0/24
# set interfaces openvpn vtun0 server push-route 192.168.1.0/24
# set interfaces openvpn vtun0 server name-server 192.168.1.1

#2022/01/26追記

# set interfaces openvpn vtun0 server subnet 192.168.100.0/24

で指定したセグメントから、VPNクライアントへIPアドレスが割り当てられます。

 

# set interfaces openvpn vtun0 server push-route 192.168.1.0/24

で指定したセグメントへの通信が、VPNを通るようになります。

 

証明書、鍵ファイル、DHファイルをvtun0 に関連付けます。

# set interfaces openvpn vtun0 tls ca-cert-file /config/auth/cacert.pem
# set interfaces openvpn vtun0 tls cert-file /config/auth/server.pem
# set interfaces openvpn vtun0 tls key-file /config/auth/server.key
# set interfaces openvpn vtun0 tls dh-file /config/auth/dh.pem

 

DNSフォワーディングインターフェースリストにvtun0 を追加します。

# set service dns forwarding listen-on vtun0

 

変更をコミットして、configモードから抜けます。

# commit
# save
# exit

 

【3】OpenVPN用のプロファイルを作成する

Android向けです。他機種では確認してません。

 

以下のテキストを client1.ovpn などの名前で保存します。

client
dev tun
proto udp
remote インターネット側からアクセス可能なIPアドレスまたはホスト名 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca cacert.pem
cert client1.pem
key client1.key
verb 3

 

さらに

redirect-gateway def1

を追加すると、push-routeで指定したセグメントだけでなくすべての通信がVPN経由になります。

 

以下のファイルをまとめてAndroid端末にコピーし、「OpenVPN Connect」アプリでプロファイルを読み込みます。

  • client1.ovpn
  • cacert.pem
  • client1.pem
  • client1.key

 

以上!