centOS8.1にOpenVPNを構築

  • by

概要

このページはvpnとddnsを使用してリモートアクセス環境を構築の「1.centOS8でVPNサーバーを構築」となります。
openVPNのサーバー側構築を行います。クライアント側設定は別途投稿します。

目次に戻る

「2.VPNサーバー用DNSサーバーの立ち上げ」ページはこちら

OpenVPNのインストールと証明書作成

参考ページ

基本的には下記ページを参考に設定を行いました。違う点として、clientを2つ設定し、1つはパスワード無しでログイン、もう一つはパスワードが無いとログイン出来ないように設定します。

CentOS 8 : OpenVPN : VPN サーバーの設定 : Server World

ファイアーウォールの設定はこちらのページを参考にしました。

VPS(centos7)にopenvpnを立てる(tun版)

[1]インストール

# EPELからインストール
[root@host user]# dnf --enablerepo=epel -y install openvpn easy-rsa net-tools

[2]認証局、証明書の作成

[root@host user]# cd /usr/share/easy-rsa/3
# 初期化
[root@host 3]# ./easyrsa init-pki
# 認証局を作成
[root@host 3]# ./easyrsa build-ca
...
# 認証局用のパスフレーズを設定
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
...
# これでca.crtが作成された

# サーバー証明書 作成
[root@host 3]# ./easyrsa build-server-full server1 nopass
...
# 認証局の作成で設定したパスフレーズで応答
Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key:
...

# クライアント証明書の作成
# client1:パスワード無し認証
# client2:パスワード有り認証
[root@host 3]# ./easyrsa build-client-full client1 nopass
...
# 認証局の作成で設定したパスフレーズで応答
Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key:
...
[root@host 3]# ./easyrsa build-client-full client2
...
# client2用のパスフレーズを設定
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
# 認証局の作成で設定したパスフレーズで応答
Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key:
...

# Diffie Hellman ( DH ) パラメーター生成
[root@host 3]# ./easyrsa gen-dh
...

# TLSキー作成
[root@host 3]# openvpn --genkey --secret ./pki/ta.key

# 証明書をコピー
[root@host 3]# cp -pR /usr/share/easy-rsa/3/pki/{issued,private,ca.crt,dh.pem,ta.key} /etc/openvpn/server/

コピーした証明書等はクライアント設定で使用します。下記ファイルをクライアント端末に送信しておきましょう。

※client1,client2共通
/etc/openvpn/server/ca.crt
/etc/openvpn/server/ta.key

※client1を使用する場合
/etc/openvpn/server/issued/client1.crt
/etc/openvpn/server/private/client1.key

※client2を使用する場合
/etc/openvpn/server/issued/client2.crt
/etc/openvpn/server/private/client2.key

IPフォワード設定

データをサブネットからサブネットに送るため、IPフォワード設定を有効にする必要がある。後でファイヤーウォール設定にてマスカレード設定を行う際に自動的に有効になるという情報もあるから要らないかも。

[root@host ~]# vim /etc/sysctl.d/10-ipv4_forward.conf
# 新規作成
net.ipv4.ip_forward = 1
[root@host ~]# sysctl --system

 

OpenVPNの設定ファイル編集と起動

[1]サーバーのサンプル設定ファイルをコピー

[root@host ~]# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
[root@host ~]# vim /etc/openvpn/server/server.conf

[2]環境に合わせて設定

# tunモードを指定
 52 ;dev tap
 53 dev tun
# 認証局、証明書、キーファイルを指定
 78 ca ca.crt
 79 cert issued/server1.crt
 80 key private/server1.key  # This file should be kept secret
# dhファイルを指定
 85 dh dh.pem
# VPN内で使用するサブネットを指定
101 server 10.8.0.0 255.255.255.0
# サーバー側のロカールネットワークを指定
142 push "route 192.168.xyz.0 255.255.255.0"
# tls鍵を指定
245 tls-auth ta.key 0 # This file is secret
# 圧縮を有効
264 comp-lzo
# presistオプション有効
282 persist-key
283 persist-tun
# logの保管場所を変更
288 status /var/log/openvpn-status.log
# logの保管場所を指定
297 log         /var/log/openvpn.log
298 log-append  /var/log/openvpn.log
# ログレベル0~9、数字が大きい方が細かく残す
307 verb 3

[3]OpenVPNの起動

[root@host ~]# systemctl enable --now openvpn-server@server

ここで設定ミスが無ければ正常に起動する。実際の通信を行うにはfirewall設定が必要。

Firewallの設定

[1]ゾーン確認

# NICリストを確認しておく
nmcli d

# すべてのゾーンを確認する
[root@host ~]# firewall-cmd --list-all-zones
# home,trusted,publicが存在することを確認する

# サービスの許可(home,public両方)
[root@host ~]# firewall-cmd --permanent --zone=home --add-service=openvpn
[root@host ~]# firewall-cmd --permanent --zone=public --add-service=openvpn

# IPマスカレード設定([enp*]はインターネット側のNIC)
[root@host ~]# firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o [enp*] -j MASQUERADE

# 仮想NICをtrustedに紐づけ、VPN用サブネット許可、trustedにOpenVPNサービス許可
[root@host ~]# firewall-cmd --permanent --zone=trusted --add-interface=tun+
[root@host ~]# firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24
[root@host ~]# firewall-cmd --permanent --zone=trusted --add-service=openvpn

# 1194/udpを許可(home,publicどっちも)
[root@host ~]# firewall-cmd --permanent --add-port=1194/udp --zone=home
[root@host ~]# firewall-cmd --permanent --add-port=1194/udp --zone=public

# リロード
[root@host ~]# firewall-cmd --reload

# ゾーンの確認
[root@host ~]# firewall-cmd --list-all-zones
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp[abc]
  sources:
  services: cockpit dhcp dns http https ntp openvpn ssh
  ports: 8080/tcp 80/tcp 53/tcp 67/udp 1194/udp
  protocols:
  masquerade: no
  forward-ports: port=1194:proto=udp:toport=1194:toaddr=
  source-ports:
  icmp-blocks:
  rich rules:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp[xyz]
  sources:
  services: dhcpv6-client http https openvpn
  ports: 8200/tcp 1194/udp
  protocols:
  masquerade: yes
  forward-ports: port=1194:proto=udp:toport=1194:toaddr=
  source-ports:
  icmp-blocks:
  rich rules:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: tun+
  sources: 10.8.0.0/24
  services: openvpn
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

これで接続出来るようになったはず。

つまづいたところ

firewall設定が曲者

サービス許可とポート許可だけした状態で繋げられると思っていましたが、pingしか通らずfirewallが原因だと分かるまで2~3時間かかりました。原因が分かった後もどのように設定すれば良いか分からず、色々試していたら設定に半日くらいかかりました。firewall設定についてはネット上にしっかりとした情報が少なく、最終的には冒頭のリンクに助けられました。tun+をpublicやhomeに割り当てているとダメらしいですね。

 

目次に戻る

「2.VPNサーバー用DNSサーバーの立ち上げ」ページはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

2 + 8 =