概要
このページはvpnとddnsを使用してリモートアクセス環境を構築の「1.centOS8でVPNサーバーを構築」となります。
openVPNのサーバー側構築を行います。クライアント側設定は別途投稿します。
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に割り当てているとダメらしいですね。