CentOS7を使用してOpenVPN(2.4.6)サーバを構築する方法です。
構築環境
今回は外出先からVPNで自宅のOpenVPNサーバに接続し、VPN経由でwebサイトを閲覧したり自宅内のネットワークに接続できる環境を構築していきます。
自宅に構築する「OpenVPNサーバ」の設定は下記を想定しています。
- 接続方式はtun(ルーティング)方式
- 認証局(CA)も同じサーバに構築
- 認証方法は証明書認証
- VPN用仮想NIC(tun0)にはIPマスカレード設定
※ 証明書認証は「証明書」と「秘密鍵」で認証する方式で、クライアント毎に個別の「証明書」と「秘密鍵」を生成して配るという方式になります
VPN接続は下記のようなイメージとなります。
- クライアントから自宅ルータのグローバルIPの「UDP/1194番」ポートにVPN接続
- 自宅ルータは「OpenVPNサーバ」へポートフォワーディング
- 「OpenVPNサーバ」と「クラインアント」間でVPNのトンネルが張られる
- クライアントから「自宅ネットワーク」や「Web閲覧」へのアクセスはVPNトンネルを経由
注意点
tun(ルーティング)方式でVPN環境を構築する場合「クライアントネットワーク」と「自宅ネットワーク」の「ネットワークアドレス」は異なるものを用意する必要があります。
どちらも同じネットワークアドレスを使用してしまうと、ルーティングすることができず通信が出来なくなってしまいますので注意してください。
事前準備
OpenVPNをインストールするにあたり、事前に準備が必要な下記項目について簡単に手順を紹介します。
- epelリポジトリ追加
- ファイアウォールでudp/1194番ポート開放
- IPフォワード設定(ルーター化)
epelリポジトリ追加
本手順では「yum」の「epelリポジトリ」を使用して「OpenVPN」のインストールを行うために、事前に「epelリポジトリ」を使用できるように設定しておく必要があります。(既に設定済みの場合はこの作業は必要ありません)
「yum」コマンドで「epel-release」をインストールします。
# yum -y install epel-release
次に、「epel」リポジトリの設定ファイルを編集して、明示的に指定しなければ「epel」リポジトリを使用しないように設定を行います。
# vi /etc/yum.repos.d/epel.repo
編集内容は[epel]項目の「enabled=1」を「enabled=0」に変更します。
変更前 enabled=1 変更後 enabled=0
※ リポジトリの追加についてはこちらのページでもう少し詳しくまとめています。
ファイアウォール設定
OpenVPNで使用するUDP/1194番ポートの開放を行います。
# firewall-cmd --permanent --add-port=1194/udp success # firewall-cmd --reload success
設定内容が正しく反映されているかは「firewall-cmd --list-all」コマンド等で確認できますので、「ports」の部分に「1194/udp」と表示されていてることを確認して下さい。
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 ens37 sources: services: ssh dhcpv6-client http https ports: 1194/udp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
※ OpenVPNの初期設定では「UDP」の「1194」番をポートを使用しますが、ポート番号や「TCP」プロトコルを使用したい場合は適宜変更して作業を行ってください。
一時的にポートを開放したい場合
動作試験等で一時的にポートを開放したい場合は「permanent」オプションを指定せずに設定を行ってください。
# firewall-cmd --add-port=1194/udp success
開放したポートを閉じたい場合は「--remove-port」を使用します。
# firewall-cmd --remove-port=1194/udp success # firewall-cmd --reload
IPマスカレード有効化
クライアントから内部のネットワークに通信を行えるようにするために、IPマスカレードの設定を行います。
# firewall-cmd --permanent --add-masquerade success # firewall-cmd --reload success
IPフォワード設定(ルーター化)
内部のネットワークと通信させるためにはOpenVPNがインストールされているサーバでIPフォワード機能を有効化する必要があります。
今回は「/etc/sysctl.d/」ディレクトリに、IPフォワード用の設定ファイルの作成を行ってIPフォワード機能を有効化していきます。
# vi /etc/sysctl.d/10-ipv4_forward.conf
設定内容は下記の通りとなります。
net.ipv4.ip_forward = 1
「sysctl」コマンドを使用して設定を反映させます。
# sysctl --system
一時的にIPフォワード機能を有効化したい場合
試験等で一時的にIPフォワードの設定を有効化したい場合は、下記のコマンドを実行します。
# sysctl -w net.ipv4.ip_forward=1
IPフォワードの機能を無効化したい場合は「1」の部分を「0」に変えて実行してください。
# sysctl -w net.ipv4.ip_forward=0
OpenVPNとeasy-rsaのインストール
VPNサーバである「OpenVPN」と認証局(CA)、鍵、証明書の作成に必要な「easy-rsa」を「yum」の「epel」リポジトリを使用してインストールします。
# yum --enablerepo=epel install openvpn easy-rsa
「easy-rsa」は「/usr/share/easy-rsa/3.0.3/easyrsa」にインスト―ルされます。
3.0.3の部分はインストールされるバージョンによってことなる場合がありますので、適宜読み替えてください。
認証局(CA)設定
「easyrsa」コマンドを使用して認証局(CA)の作成と、認証局用の「証明書(ca.key)」と「秘密鍵(ca.crt)」を作成していきます。
認証局の初期化
認証局を設置する際には「easyrsa init-pki」コマンドで、認証局の初期化作業をを行います。
# cd /usr/share/easy-rsa/3.0.3 # ./easyrsa init-pki init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /usr/share/easy-rsa/3.0.3/pki
「/usr/share/easy-rsa/3.0.3/pki」ディレクトリが作成され、認証局が生成するデータはここに保存されます。
認証局(CA)の作成
「easyrsa build-ca」コマンドを使用して、認証局(CA)の作成を行っていきます。
途中「pass phrase(パスフレーズ)」と「Common Name(認証局の名前)」を設定する箇所があるので、それぞれ設定を行ってください。
設定したパスフレーズは、認証局やクライアント用の「秘密鍵」や「証明書」を作成する際に必要になりますので忘れないようにしてください。
また、「Common Name」はサーバのホスト名等分かりやすい名前を指定すると良いでしょう。
# ./easyrsa build-ca Generating a 2048 bit RSA private key ...................+++ .............................................................................................................................................................................................................+++ writing new private key to '/usr/share/easy-rsa/3.0.3/pki/private/ca.key.sH2Ilrgw4r' Enter PEM pass phrase: パスフレーズ設定 Verifying - Enter PEM pass phrase: パスフレーズ確認 ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]:認証局の名前を設定 CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /usr/share/easy-rsa/3.0.3/pki/ca.crt
認証局(CA)用秘密鍵と証明書
「easyrsa build-ca」コマンドで認証局を設置すると、認証局用の秘密鍵「ca.key」と証明書「ca.crt」が作成されます。
認証局(CA)用秘密鍵 | /usr/share/easy-rsa/3.0.3/pki/private/ca.key |
認証局(CA)用証明書 | /usr/share/easy-rsa/3.0.3/pki/ca.crt |
OpenVPNサーバ用の証明書と秘密鍵の作成
認証局の設置が完了しましたら、次に「easyrsa build-server-full」コマンドでOpenVPNサーバ用の証明書と秘密鍵を作成していきます。
「nopass」を設定することでサーバの秘密鍵からパスワードを削除することが出来ます。
easyrsa build-server-full 鍵の名前 nopass
OpenVPN用の秘密鍵と証明書を作成する際には、認証局を設置した際に設定したパスフレーズの入力が必要となります。
下記の作成例では、鍵の名前を「server」としています。
# ./easyrsa build-server-full server nopass
Generating a 2048 bit RSA private key
...............................................................+++
.............................................................................................................................................................+++
writing new private key to '/usr/share/easy-rsa/3.0.3/pki/private/server.key.d7mUdbXMQz'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /usr/share/easy-rsa/3.0.3/pki/private/ca.key: パスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Jul 18 05:39:01 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
作成された秘密鍵と証明書は下記に作成されています。
OpenVPNサーバ用秘密鍵 | /usr/share/easy-rsa/3.0.3/pki/private/server.key |
OpenVPNサーバ用証明書 | /usr/share/easy-rsa/3.0.3/pki/issued/server.crt |
※ 鍵と証明書の名前は「easyrsa build-server-full」コマンド実行時に指定した名前になりますので、変更している場合は適宜読み替えてください。
クライアント用秘密鍵と証明書の作成
次に、「easyrsa build-client-full」コマンドを使用して、クライアント配布用の「秘密鍵」と「証明書」を作成していきます。
セキュリティレベルは下がりますが、「nopass」を設定することでOpenVPNサーバに接続する際のパスワード入力を不要にすることができますが、これは「秘密鍵」と「証明書」が流出した場合接続され放題という事なので、「利便性」と「セキュリティ」のどちらを優先するか十分に検討してください。
easyrsa build-client-full クライアント用鍵の名前 nopass
クライアント用の秘密鍵と証明書を作成する際にも、認証局を設置した際に設定したパスフレーズの入力が必要となります。
クライアント用の秘密鍵と証明書は、接続するユーザごとに鍵の名前を変えて作成してください。
下記作成例ではクライアント用の鍵の名前として「user1」を設定しています。
# ./easyrsa build-client-full user1 nopass
Generating a 2048 bit RSA private key
......+++
..................+++
writing new private key to '/usr/share/easy-rsa/3.0.3/pki/private/user1.key.KhzJfDf3Ws'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /usr/share/easy-rsa/3.0.3/pki/private/ca.key: パスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'user1'
Certificate is to be certified until Jul 18 05:43:08 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
クライアント用証明書 | /usr/share/easy-rsa/3.0.3/pki/issued/user1.crt |
クライアント用秘密鍵 | /usr/share/easy-rsa/3.0.3/pki/private/user1.key |
Diffie Hellman (鍵交換方式)パラメータ生成
Diffie Hellman鍵交換式で使用するDHパラメータを作成します。
# ./easyrsa gen-dh
ファイルは「/usr/share/easy-rsa/3.0.3/pki/dh.pem」に作成されます。
TLS-Auth用共有鍵作成
tls-authを設定するために必要な共有鍵「ta.key」を作成します。
# openvpn --genkey --secret ta.key /usr/share/easy-rsa/3.0.3/ta.key
作成された鍵は「/usr/share/easy-rsa/3.0.3/ta.key」に保存されます。
TLS-Authについて
TLS-Authの機能を有効化させることで、VPNの通信開始時にHMACファイアウォールで共有鍵(ta.key)による認証が行われ、認証が通らなかったパケットが破棄されるため「DoS」や「UDP flooding」攻撃に対応することができます。
OpenVPNサーバ設定
OpenVPNサーバの設定を行っていきます。
ファイルのコピー
これまでに作成した「証明書」「秘密鍵」「ファイル」のうち、下記を「/etc/openvpn」ディレクトリにコピーしていきます。
- ca.crt (認証局証明書)
- server.key (OpenVPNサーバ秘密鍵)
- server.crt (OpenVPNサーバ証明書)
- dh.pem(DHパラメータ)
- ta.key (TLS-Auth共有鍵)
# cp -p ta.key /etc/openvpn/ # cd pki # cp -p ca.crt dh.pem private/server.key issued/server.crt /etc/openvpn
設定ファイル作成
設定ファイルのひな型をコピーして、そこから設定ファイルを作成していきます。
# cp -p /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn # cd /etc/openvpn # vi server.conf
注意点
「OpenVPN」の起動時には「/etc/openvpn/」ディレクトリ内の「*.conf」ファイルを自動で読み込むため、使用する設定ファイル以外には「.conf」という名前を使用しないようにしてください。
設定内容
今回は基本的な下記の設定項目を設定しています。
設定内容 | 設定項目 |
---|---|
使用ポート | port 1194 |
使用プロトコル | proto udp |
VPN方式 | dev tun |
認証局証明書 | ca /etc/openvpn/ca.crt |
OpenVPNサーバ証明書 | cert /etc/openvpn/server.crt |
OpenVPNサーバ秘密鍵 | key /etc/openvpn/server.key |
DHパラメータ | dh /etc/openvpn/dh.pem |
サーバ/クライアント割当IP | server 10.8.0.0 255.255.255.0 |
クライアントIP情報ファイル | ifconfig-pool-persist ipp.txt |
ルーティング情報 | push "route 192.168.1.0 255.255.255.0" |
死活監視設定 | keepalive 10 120 |
TLS-auth設定 | tls-auth /etc/openvpn/ta.key 0 |
認証方式 | cipher AES-256-CBC |
圧縮設定 | comp-lzo |
最大接続クライアント数 | max-clients 100 |
実行ユーザ | user nobody |
実行グループ | group nobody |
再接続処理(鍵読込) | persist-key |
再接続処理(tunデバイスオープン) | persist-tun |
statusログファイル | status /var/log/openvpn-status.log |
ログファイル | log /var/log/openvpn.log |
appendログファイル | log-append /var/log/openvpn.log |
ログレベル | verb 3 |
サーバ再起動通知 | explicit-exit-notify 1 |
設定部分抜粋
port 1194 proto udp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 192.168.1.0 255.255.255.0" keepalive 10 120 tls-auth /etc/openvpn/ta.key 0 cipher AES-256-CBC comp-lzo max-clients 100 user nobody group nobody persist-key persist-tun status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3 explicit-exit-notify 1
OpenVPNサーバ起動
設定が完了しましたら、「OpenVPN」サーバが起動できるか確認してください。
# systemctl start openvpn@server
起動や動作に問題がある場合は、ログファイルに情報が出力されていると思いますので、そちらを確認してみてください。
自動起動設定
「OpenVPN」が問題なく起動できましたら、サーバ起動時に自動的に起動させる設定を行っておきましょう。
# systemctl enable openvpn@server Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@server.service to /usr/lib/systemd/system/openvpn@.service.
クライアントの設定
クライアントには「認証局秘密鍵」「クライアン証明書」「クライアント秘密鍵」「TLS-Auth用共有鍵」の情報を渡す必要があります。
- ca.crt 認証局秘密鍵
- user1.crt クライアント証明書
- user1.key クライアント秘密鍵
- ta.key TLS-Auth共有鍵
クライアントの設定については別ページでまとめましたので、そちらを参考してみてください。
Windowsからの接続方法(vpnux Client)
Windows用のVPNクライアント設定方法については下記ページにまとめてありますので、参考にしてみてください。
https://www.server-memo.net/server-setting/openvpn/vpnux-client.html
コメント