Ubuntu上にOpenVPNサーバを構築する

2023年12月06日
 
2023年12月04日

こんにちはゆーろんです。
今回はAWSのEC2に入れたUbuntuサーバにOpenVPNサーバを構築しようと思います。

個人的には外部のLANからインターネットアクセスした場合ののプロキシサーバとして利用するために設定を行いました。

プロフィール画像

ぺんろん

頑張って書いたのでぜひご覧ください!

OpenVPNとは

サムネイル

OpenVPNはGPL Lisenceで公開されているOSSのインターネットVPNのこと。
具体的にはSSL/TLSプロトコルを利用したSSL VPNといえます。
特徴は以下の通りです。

  • 堅牢なセキュリティと安全性
  • 設定がテキストベース
  • 様々なOSに対応している

VPNが低コストで実現できるため、個人や小規模事業者がVPNを構築する際の選択肢の1つとなっています。

OpenVPNとは | OpenVPN.JP

OpenVPNの設定手順

EC2の用意や基本設定は既に済んでいる前提で手順を進めていきます。

OpenVPNとeasy-rsaのインストール

まずOpenVPNとeasy-rsaをインストールします。

sudo apt install openvpn easy-rsa

ルート認証局の作成

ルート認証局は自己証明をしただけで信頼性のない証明書を作る認証局です。
オレオレ認証局とも呼ばれます。

cd /usr/share/easy-rsa/
cp -p vars.example vars
vi vars

varsのパラメータで以下の部分で証明書の有効期限を設定できます。

cd /usr/share/easy-rsa/
cp -p vars.example vars
vi vars

varsのパラメータで以下の部分で証明書の有効期限を設定できます。

set_var EASYRSA_CA_EXPIRE       3650
set_var EASYRSA_CERT_EXPIRE     3650

varsファイルへの入力が終わったら、PKIディレクトリの作成に進みます。それにはinit-pkiオプションを指定して、easyrsaスクリプト実行します。

./easyrsa init-pki

認証局/DHパラメータの作成

まず以下コマンドで認証局を作成します。

./easyrsa build-ca

「Enter PEM pass phrase:」と表示されますが、任意のパスフレーズを決めて入力します(パスフレーズは後で使うので覚えておいてください)。
「Common Name (eg: your user, host, or server name) [Easy-RSA CA]:」も名前は任意で大丈夫です。

次にDHパラメータを作成します。
生成に3分ほどかかります。

./easyrsa gen-dh

サーバ用の秘密鍵/証明書の作成

途中のパスフレーズは「認証局/DHパラメータの作成」で入力したものと同じものを入力します。
サーバ名は適当に決めてください。

./easyrsa build-server-full <サーバ名> nopass

クライアント用秘密鍵/証明書の作成

途中のパスフレーズは「認証局/DHパラメータの作成」で入力したものと同じものを入力します。
クライアント名は適当に決めてください。

./easyrsa build-client-full <クライアント名> nopass

OpenVPNの設定

/usr/share/easy-rsa/pki以下に生成されたCA証明書(ca.crt)、サーバ用証明書(issued/server.crt)、サーバ用秘密鍵(private/server.key)、DHパラメータ(dh.pem)を/etc/openvpn以下にコピーします。

sudo cp pki/ca.crt /etc/openvpn/
sudo cp pki/issued/server.crt /etc/openvpn/
sudo cp pki/private/server.key /etc/openvpn/
sudo cp pki/dh.pem /etc/openvpn/dh2048.pem

またサーバのconfigファイルを/etc/openvpn以下にコピーします。

sudo cp -p /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server.conf

コピーしたconfigファイルを設定します。
設定のためのパラメータの一部を記載します。

パラメータ 説明
port 1194 VPN接続する際のポート。変更する場合はここを書き換えます。
proto udp VPN接続する際のプロトコル。変更する場合はここを書き換えます
push “dhcp-option DNS 8.8.8.8” VPNサーバとして通信が外部に行く際に名前解決を行うDNSサーバ(デフォルトでは記載されていない)
server 10.8.0.0 255.255.255.0 VPN接続したクライアントに割り当てられるアドレス範囲。
push “route xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx” サブネットのIPv4 CIDRアドレス範囲。
push “redirect-gateway def1” トラフィックがVPNサーバ経由にするための記述(デフォルトでは記載されていない)。
client-config-dir ccd クライアントに固定IPを割り当てる設定を読み込む記述(読み込むディレクトリはccd)

またta.keyを生成します。

sudo openvpn --genkey --secret /etc/openvpn/ta.key

パケット転送の有効化

パケットの転送を有効化します。

sudo vi /etc/sysctl.conf

#net.ipv4.ip_forward=1の記述個所の#を外し保存します。

sudo sysctl -p

VPNクライアントに固定IPを割り当てる

まずOpenVPNのserver.configでclient-config-dir ccdと設定したことを確認し、以下を実施します。
なおクライアント名はクライアント用秘密鍵/証明書の作成で実施した同じ名称で設定します。

sudo mkdir /etc/openvpn/ccd
cd /etc/openvpn/ccd
sudo touch <クライアント名>
echo "ifconfig-push 10.8.0.5 10.8.0.6" > client1

echo部の書式は以下の通りで、第4オクテットは1から始まり4ずつインクリメントする必要があります。
また次のクライアントとは3つずつ間をあける必要があります。

ifconfig-push <クライアントIPアドレス> <対のサーバ側IPアドレス>

OpenVPNの起動

OpenVPNを起動します。

sudo systemctl start openvpn
sudo systemctl enable openvpn
sudo systemctl status openvpn

VPNクライアントの通信をOpenVPNサーバに経由させる

IPマスカレードを有効にすることで、IGWからきたVPNクライアントのアクセスをOpenVPNサーバからのアクセスに見えるように設定します。

まずifconfigで外部とつながるインターフェイスを確認します。
次にIPマスカレードと設定保持のためのパッケージをインストールします。
なおインターフェイスは今回eth0が外部とつながるものとして設定しますので適宜確認してください。

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # IPマスカレード設定
sudo iptables -t nat -n -L # ルートテーブルの確認
sudo apt install iptables-persistent # 永続化設定用パッケージのインストール

以上でOpenVPNサーバの基本的な設定は終了です。
なおEC2を使用している場合は最終的にはEC2のENIの「Source/Dest Check」の無効化やSSH用のポートを塞ぐなども行うことをおススめします。

OpenVPNクライアントの設定

以下ファイルをダウンロードして「.ovpn」を作成します。

/usr/share/easy-rsa/pki/ca.crt
/usr/share/easy-rsa/pki/private/client1.key
/usr/share/easy-rsa/pki/issued/client1.crt
/etc/openvpn/ta.key
よろしければシェアしてくださいね!
タグ: VPNEC2

関連記事