Linux
 Computer >> コンピューター >  >> システム >> Linux

Linux CentOS/RHEL 7/8へのOpenVPNサーバーのインストールと構成ガイド

本記事では、OpenVPNサーバーをLinux CentOS/RHEL(7/8)上にインストールして構成する手順を解説します。さらに、NATの背後にある2つのリモートコンピューター(またはオフィス)を、構築したOpenVPNサーバー経由で1つのネットワークに統合する方法もご紹介します。VPNクライアントの認証には証明書を使用します。

VPN(Virtual Private Network)は、公衆ネットワークやインターネット上に安全なネットワークを構築するための技術群です。VPNを利用すれば、インターネット越しにさまざまなデバイスやネットワークを、単一の安全なローカルネットワークとして接続できます。

OpenVPNは、OpenSSLをベースとしたオープンソースのSSL/TLS型VPN実装の一つです。OpenVPNを使えば、遠隔地のオフィス同士だけでなく、NAT機器の背後にある個々のコンピューターも1つのネットワークにまとめることが可能です。

OpenVPNとEasy-RSAのインストール

まず最初に、EPELリポジトリを追加し、システムを最新の状態に更新します。

# yum install epel-release -y
# yum update -y

システムの更新が完了したら、yumパッケージマネージャーを使用してOpenVPNとEasy-RSAをインストールします。Easy-RSAは、VPNサーバー上にPKI(公開鍵基盤)を構築するために必要なツールです。

# yum install openvpn easy-rsa -y

Easy-RSAの設定とX.509証明書の生成方法

すべてのeasy-rsaスクリプトを/etc/openvpn/ディレクトリへコピーします。

# cp -r /usr/share/easy-rsa /etc/openvpn/

/etc/openvpn/easy-rsa/3/ディレクトリに移動し、varsファイルを作成します。

# cd /etc/openvpn/easy-rsa/3/
# nano vars

以下の内容をファイルに記述してください(必要に応じて値は変更可能です)。

set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "MUN"
set_var EASYRSA_REQ_CITY "BY"
set_var EASYRSA_REQ_ORG "WOSHUB"
set_var EASYRSA_REQ_EMAIL "vpnadmin@woshub.com"
set_var EASYRSA_REQ_OU "IT dept"
set_var EASYRSA_KEY_SIZE 4096
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST "sha512"

このファイル内の情報は任意のものであり、サーバーの構成やその後の動作に影響を与えることはありません。ただし、国名(COUNTRY)や組織名(ORG)などは自社の環境に合わせて適切な値を設定することをおすすめします。

varsファイルには実行権限が必要です。次のコマンドを実行しましょう。

# chmod +x vars

OpenVPNの証明書と鍵の生成

鍵を作成する前に、PKIディレクトリを初期化し、CA(認証局)の鍵を作成します。

# cd /etc/openvpn/easy-rsa/3/
# ./easyrsa init-pki

Note: using Easy-RSA configuration from: ./vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/3/pki

続いてCA鍵を作成します。

# ./easyrsa build-ca

コマンド実行後、鍵と証明書の生成用パスワードの入力を求められます。このパスワードは後ほど証明書に署名する際にも必要になるため、忘れないように管理してください。

次にサーバー鍵を作成します(ここではサーバー名をvpn.woshub.comとします)。nopassオプションを付けると、秘密鍵のパスワード保護が無効になります。

# ./easyrsa gen-req vpn.woshub.com nopass

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 4096 bit RSA private key
.........................++
writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key.R4IYCbD1zP'
-----
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) [vpn.woshub.com]:
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/3/pki/reqs/vpn.woshub.com.req
key: /etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key

証明書を発行する際、Common Name欄ではそのままEnterキーを押してデフォルト値を受け入れます。

作成したvpn.woshub.comの鍵を、CA証明書で署名します。

# ./easyrsa sign-req server vpn.woshub.com

署名には、CA証明書を発行した際に設定したパスワードが必要です。処理中にyesの入力とCAパスワードの入力を求められるので、順に入力してください。

証明書がエラーなく生成されたことを確認するには、次のコマンドを実行します。

# openssl verify -CAfile pki/ca.crt pki/issued/vpn.woshub.com.crt

pki/issued/vpn.woshub.com.crt: OK

これでOpenVPNサーバーに必要な証明書類がすべて作成されました。

  • ルート証明書:pki/ca.crt
  • サーバー秘密鍵:pki/private/vpn.woshub.com.key
  • サーバー証明書:pki/issued/vpn.woshub.com.crt

クライアント鍵を生成するには、次のコマンドを実行します。

# ./easyrsa gen-req client_name nopass

ここではadmin1というクライアント鍵を生成してみましょう。

# ./easyrsa gen-req admin1 nopass

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 4096 bit RSA private key
..........++
writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/admin1.key.R5OY6reT2e'
-----
Common Name (eg: your user, host, or server name) [admin1]:
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/3/pki/reqs/admin1.req
key: /etc/openvpn/easy-rsa/3/pki/private/admin1.key

サーバー鍵と同様に、CA証明書で署名する必要があります。

# ./easyrsa sign-req client admin1

これでユーザーadmin1用の証明書が作成されました。

さらに、鍵交換に使用するDiffie-Hellman鍵を生成します。この処理にはある程度時間がかかります。

# ./easyrsa gen-dh

続いてTLS認証用の証明書を生成します。

# openvpn --genkey --secret ta.key

将来的にクライアント証明書を失効させる可能性がある場合は、CRL(証明書失効リスト)も生成しておきましょう。

# ./easyrsa gen-crl

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Using configuration from /etc/openvpn/easy-rsa/3/pki/safessl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key:
An updated CRL has been created.
CRL file: /etc/openvpn/easy-rsa/3/pki/crl.pem

証明書を失効させたい場合は、次のコマンドを実行します(admin1は証明書名です)。

./easyrsa revoke admin1

必要な証明書がすべて揃ったら、作業用ディレクトリへコピーします。

まずはサーバー用の証明書です。

# cp pki/ca.crt /etc/openvpn/server/
# cp pki/issued/vpn.woshub.com.crt /etc/openvpn/server/
# cp pki/private/vpn.woshub.com.key /etc/openvpn/server/
# cp pki/private/dh.pem /etc/openvpn/server/
# cp pki/private/ta.key /etc/openvpn/server/
# cp pki/crl.pem /etc/openvpn/server/

次にクライアント用の証明書です。

# cp pki/issued/admin1.crt /etc/openvpn/client/
# cp pki/private/admin1.key /etc/openvpn/client/

OpenVPNサーバー設定ファイルとファイアウォールルール

次に、OpenVPNの設定ファイルを作成します。まずserver.confという設定ファイルを新規作成しましょう。

# cd /etc/openvpn/ && nano server.conf

ファイルの内容を以下のように編集します。

# ポート・プロトコル・デバイスの指定
port 1194
proto udp
dev tun
# サーバー証明書へのパス
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn.woshub.com.crt
key /etc/openvpn/server/vpn.woshub.com.key
# CRLとDH鍵へのパス
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
# VPNクライアントに割り当てるネットワークの指定
server 10.1.2.0 255.255.255.0
push "redirect-gateway def1"
# クライアントに配布するDNSサーバーの指定
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# 同じ鍵を持つ複数クライアントの接続を許可
duplicate-cn
# TLS保護の設定
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
# その他の設定
keepalive 20 60
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody
# ログファイルのパス
log-append /var/log/openvpn.log
verb 3

編集が完了したらファイルを保存します。本例ではVPNサーバーにデフォルトのUDPポート1194を指定していますが、サーバー上で空いている任意のポートをOpenVPN用に指定しても問題ありません。

続いて、接続の許可とセグメント間のルーティングを有効にするためのファイアウォール設定を行います。

firewalldを使用している場合は、まずカーネルモジュールのフォワーディング(IP転送)を有効化します。

# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
# sysctl -p

net.ipv4.ip_forward = 1

firewalldにopenvpnサービスを追加し、tun0インターフェースをtrustedゾーンに登録します。

# firewall-cmd --permanent --add-service=openvpn
# firewall-cmd --permanent --zone=trusted --add-interface=tun0

trustedゾーンに対してMASQUERADE(IPマスカレード)を有効化します。

# firewall-cmd --permanent --zone=trusted --add-masquerade

NATを有効にします(Server_IPは実際のサーバーIPアドレスに置き換えてください)。

# firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.1.2.0/24 -o Server_IP -j MASQUERADE
# firewall-cmd –reload

firewalldを使わずiptablesのみを使用している場合は、代わりに次のコマンドを実行します。

# iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o eth0 -j MASQUERADE
# iptables -A INPUT -p udp –dport 1194 -j ACCEPT
# service iptables save

最後に、OpenVPNサービスを起動し、自動起動を有効にします。

# systemctl start openvpn@server
# systemctl enable openvpn@server

openvpnサービスがudp/1194ポートでリッスンしていることを確認しましょう。

# lsof -i:1194

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openvpn 12327 nobody 5u IPv4 45122 0t0 UDP *:openvpn

ネットワークインターフェースのIP設定も確認しておきます。

# ip a

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.1.2.1 peer 10.1.2.2/32 scope global tun0
valid_lft forever preferred_lft forever

このように、設定時に指定したネットワークがtun0デバイスに割り当てられていれば成功です。以上がOpenVPNを動作させるための最低限の設定です。

OpenVPNで複数拠点(コンピューター)を接続する方法

それでは、NAT経由でインターネットにアクセスしている2台のリモートコンピューターからOpenVPNサーバーに接続し、1つのネットワークに統合する手順を見ていきましょう。WindowsマシンからOpenVPNサーバーへ接続するには、公式サイトからダウンロードできる公式クライアントを使用します。インストール手順の詳細は省略し、すぐに設定方法へ進みます。

クライアントのインストール後、次のフォルダに設定ファイルを作成します。

C:\Program Files\OpenVPN\config\

ここでは「client」という名前のファイルを作成し、以下の内容を記述しました。

client
dev tun
proto udp
remote 112.113.114.15 1194
resolv-retry infinite
nobind
block-outside-dns
persist-key
persist-tun
mute-replay-warnings
remote-cert-tls server
tls-client
auth SHA512
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
remote-cert-eku "TLS Web Server Authentication"
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\admin1.crt"
key "C:\\Program Files\\OpenVPN\\config\\admin1.key"
cipher AES-256-CBC
comp-lzo
verb 3

設定には、事前に作成したクライアント証明書・セキュリティ証明書(ta.key)・サーバー証明書(ca.crt)が必要です。これらをサーバーからダウンロードしてローカルフォルダに配置し、設定ファイル内でそれぞれのパスを指定してください。なお、「remote」行のIPアドレスは、ご自身のOpenVPNサーバーのグローバルIPアドレスに置き換える必要があります。

設定完了後、トレイアイコンのOpenVPNアイコンをクリックするとサーバーに接続できます。

接続後、このデバイスには次のIPアドレスが割り当てられました。

IPv4 address. . . . . . . . . . . . : 10.1.2.14
Subnet mask . . . . . . . . . . : 255.255.255.0

2台目のコンピューター(NATの背後)でも同じ手順を実行します。事前に2人目のユーザー用証明書を作成しておきましょう。接続後、2台目のPCにもVPNネットワークからIPアドレスが割り当てられます。

IPv4 address. . . . . . . . . . . . : 10.1.2.16
Subnet mask . . . . . . . . . . : 255.255.255.0

接続後、両方のコンピューターは同一ネットワーク上に存在し、互いを認識できる状態になります。

1台目のPCから2台目のPCへpingを実行してみます。

Pinging 10.1.2.16 with 32 bytes of data:
Reply from 10.1.2.16: bytes=32 time=73ms TTL=127

逆方向のpingも確認してみましょう。

Pinging 10.1.2.14 with 32 bytes of data:
Reply from 10.1.2.14: bytes=32 time=79ms TTL=127

接続された両方のVPNクライアントは、互いに直接パケットを送受信したりファイルを転送したりできます。つまり、物理的に離れた場所にある2台のデバイスを、単一のローカルネットワークに統合できたことになります。

OpenVPNサーバー上では、ユーザー向けの鍵や証明書をいくつでも作成できます。新しい証明書が必要になった場合は、/etc/openvpn/easy-rsa/3ディレクトリで次のコマンドを実行してください。

# ./easyrsa gen-req clientname nopass
# ./easyrsa sign-req client clientname

また、使用しなくなったクライアント証明書は必ず失効(revoke)させて、ネットワークのセキュリティを維持するようにしましょう。

  1. Linux VPSでCS:GOサーバーを構築する方法【初心者向け完全ガイド】

    Steam公式のCS:GOゲームサーバーは多くの用途に十分対応していますが、細かい設定は自分でコントロールできません。自前のサーバーを立てれば、次のようなことが可能になります。 マッチ時間、フリーズタイム、最大プレイヤー数、フレンドリーファイアなど、独自のルールを自由に設定できる 友人だけのプライベートマッチを開催できる 大会やトーナメントを主催できる カスタムマップでプレイできる なぜLinuxでゲームサーバーを構築するのか? 「Windowsの方が簡単なのでは? 自分のPCでもできるのでは?」と考える方もいるかもしれません。まず、自宅のPCでサーバーをホストする場合、一般的に

  2. Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

    LAMPスタック(Linux、Apache、MySQL、PHP)のインストール手順を解説するチュートリアルのほとんどは、PHPスクリプトの処理にApacheの組み込みモジュールを使うことを推奨しています。例えばUbuntuでは、sudo apt install libapache2-mod-phpというコマンドでパッケージをインストールした時点でこの設定が有効になります。その結果、Apacheはmpm_preforkを使用せざるを得なくなり、訪問者がサイトにアクセスするたびに新しいプロセスが起動されて接続を処理することになります。トラフィックが少ないうちはこれでも十分に機能します。しかし、アク