序章

OpenVPNは、オープンソースの仮想プライベートネットワーク(VPN)サーバー/クライアントアプリケーションであり、仮想ネットワーク(LANと同様)に安全に参加できます。

このチュートリアルでは、IPv4NATとルーティングを使用してFreeBSD10.1マシンにOpenVPNサーバーをインストールして構成する方法について説明します。 さまざまな構成オプションの簡単な説明が含まれています。

このチュートリアルの終わりまでに、独自のOpenVPNサーバーを実行し、このネットワークに接続するためにダウンロードできるクライアント構成ファイルを用意します。

前提条件

  • FreeBSD10.1ドロップレット。 ドロップレットのサイズは、VPNに接続する予定のクライアントの数によって異なります。 519 MBは、少数のクライアントには問題ありません
  • ルートアクセス。 sudoはDigitalOceanにプリインストールされているので、特別なことは何もありません

このチュートリアルでは、rootアクセスが必要です。 DigitalOceanで、デフォルトの freebsd ユーザーとしてサーバーにアクセスしてから、rootシェルにアクセスします。

sudo tcsh

ステップ1—OpenVPNのインストール

pkgシステムでOpenVPNをインストールするのはとても簡単です。 次のコマンドを実行するだけで、パッケージリストを更新し、VPNソフトウェアをインストールできます。

pkg update
pkg install openvpn

これにより、SSLキーペアの生成に使用されるeasy-rsaパッケージもインストールされます。

ステップ2—OpenVPNサーバーの設定

このチュートリアルでは、OpenVPNが提供するサンプルファイルに基づいて構成ファイルを作成します。 OpenVPNの構成フォルダーを作成します。

mkdir /usr/local/etc/openvpn

サンプルのserver.confファイルを新しいディレクトリにコピーします。

cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/server.conf

nanoまたはお気に入りのテキストエディタをインストールします。

pkg install nano

編集用に構成ファイルを開きます。

nano /usr/local/etc/openvpn/server.conf

注: OpenVPN構成ファイル形式は、コメントの前にセミコロン(;)またはハッシュ(#)を付けます。 この例では、構成オプションをコメント化(無効化)するためにセミコロンが使用され、コメントにハッシュが使用されています。

変更する構成オプションがわかっている場合は、この時点で変更できます。

  • オプション port: The default port is 1194, but you can change this to anything you like
  • オプション proto: Choose either tcp or udp; the default is fine
  • userおよびgroup:行のコメントを解除して、これらをnobodyに設定します。 これにより、セキュリティのために、OpenVPNをより少ない特権で実行できるようになります
user nobody
group nobody

注:各構成は、一度に1つのポートとプロトコルのみを実行できます。

最後に、必ず変更を保存してください。

ステップ3—サーバー証明書とキーの生成

easy-rsaを使用すると、証明書とキーを簡単に生成できます。

まず、値を変更するため、プログラムを構成ディレクトリにコピーします。

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

varsファイルを開いて編集します。

nano /usr/local/etc/openvpn/easy-rsa/vars

次の行を変更して、キーサイズを変更します。

export KEY_SIZE=2048

最近の標準は2048ビットのキーですが、4096ビットを使用することもできます。これは、より安全ですが、ネゴシエーションの速度が低下します。

必要に応じて、このファイルにデフォルトの証明書とキーの値を設定して、後で入力する必要がないようにすることもできます。

使用しているシェルはtcshであるため、exportの行をsetenvに置き換える必要があります。 これは、sourceの前にsedを使用して実行されます。 easy-rsaディレクトリに移動します(必須)。

cd /usr/local/etc/openvpn/easy-rsa/

行を置き換えます:

cat ./vars | sed -e 's/export /setenv /g' -e 's/=/ /g' | source /dev/stdin

/usr/local/etc/openvpn/easy-rsa/ディレクトリから、最初にディレクトリをクリーンアップしてから、認証局(CA)を構築します。

./clean-all
./build-ca

CAオプションを設定するように求められます。 これらにあなたの詳細を記入してください:

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [changeme]:vpn.example.com
Name [changeme]:Callum's VPN CA
Email Address [[email protected]]:[email protected]

次に、サーバーキーを作成します。

./build-key-server server

ここでも、オプションを設定します。 パスワードやオプションの会社名は必要ありません。

yと入力して、キーに署名してコミットします。

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [server]:vpn.example.com
Name [changeme]:Callum's VPN Server
Email Address [[email protected]]:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ENTER
An optional company name []: ENTER

Certificate is to be certified until Feb  5 14:40:15 2025 GMT (3650 days)
Sign the certificate? [y/n]: y

1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated

最後に、Diffie-Hellman鍵を生成する必要があります。 キーのサイズによっては、これには時間がかかる場合があります。

./build-dh

すべてのサーバーキーと証明書が生成されたので、それらをOpenVPN構成ディレクトリにコピーする必要があります。

cd /usr/local/etc/openvpn/easy-rsa/keys/
cp dh*.pem ca.crt server.crt server.key /usr/local/etc/openvpn/

サーバー証明書はこれで完了です。 次に、クライアント証明書に移ります。

ステップ4—クライアント証明書の生成

各クライアントは、VPNを認証して接続するために、それぞれ証明書とキーも必要になります。 /usr/local/etc/openvpn/easy-rsa/ディレクトリにいることを確認してください。

cd /usr/local/etc/openvpn/easy-rsa/

次のコマンドを実行します。ここで、clientNameは、この特定のクライアント証明書に使用する名前です。

./build-key clientName

国名、都市名などを入力するように求められます。 また。 プロセスはサーバーキーの生成と同じです。 これはクライアントの情報であることが意図されていますが、実際には重要ではありません。

パスフレーズや会社名は必要ありません。 yと入力して、証明書に署名してコミットします。

注:クライアントごとに異なる証明書を使用することをお勧めします。これは、デフォルトでOpenVPNによって適用されます。 ただし、必要に応じて、OpenVPN構成でこれを無効にすることができます(後で説明します)。

2048とは異なるキーサイズを使用した場合は、使用したキーサイズのファイル名と一致するようにOpenVPN構成を変更する必要があります。 覚えていない場合は、次のコマンドでdhファイルの正しいファイル名を表示できます。

ls /usr/local/etc/openvpn/easy-rsa/keys/dh*.pem

server.confを編集します。

nano /usr/local/etc/openvpn/server.conf

dh dh2048.pemを次のように置き換えます。

dh dhSIZE.pem

以前に2048ビットキーの推奨事項に従った場合は、変更を加える必要はありません。

作成する個別のクライアント証明書ごとに、このセクションを繰り返します。

ステップ5—IPv4NATルーティングの構成

FreeBSDには、ipfwファイアウォールの一部としてnatdが含まれています。これにより、NATルーティングが可能になり、OpenVPNで使用できるようになります。 これを使用するには、/etc/rc.confを編集します。

nano /etc/rc.conf

これらのコンテンツを下部に追加します。

firewall_enable="YES"
firewall_type="open"

gateway_enable="YES"
natd_enable="YES"
natd_interface="vtnet0"
natd_flags="-dynamic -m"
  • firewall_enableは、natdに必要なipfwファイアウォールを有効にします。
  • firewall_type="open"は、ファイアウォールがデフォルトでトラフィックを許可するようにします
  • gateway_enableは、net.inet.ip.forwarding1に設定します。これにより、システムでのIPv4ルーティングが可能になります。
  • natd_enableは、実際のNATルーターを有効にします
  • natd_interfaceはインターネットへの外部インターフェースです。 vtnet0はDigitalOceanに使用されます
  • natd_flagsはNATを動的にし、-mはポート番号を保持します

サーバーを再起動して、ipfwnatdをロードします。

reboot

再度ログインします。 再起動後、sudo tcshを再度実行して、まだrootになることを忘れないでください。

ステップ6-OpenVPNルーティング構成とDNSの構成

デフォルトでは、OpenVPNは、VPNを介してインターネットトラフィックをルーティングするようにクライアントに指示するように構成されていません。 /usr/local/etc/openvpn/server.confの一部の回線のコメントを解除することで、OpenVPNを介してトラフィックをルーティングするようにします。

nano /usr/local/etc/openvpn/server.conf

次の3行を見つけてコメントを外します。

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

プリセットDNSサーバーはOpenDNS用ですが、任意のDNS(8.8.8.8および8.8.4.4を使用するGoogleDNSなど)に設定できます。

オプション設定:

コメントを外すことで、クライアントが互いのIPと直接通信できるようにすることもできます。

client-to-client

前述のように、複数のクライアントに同じキーと証明書を使用する場合(これは少し安全性が低くなります)、次の行のコメントを解除します。

duplicate-cn

圧縮は、次の行で有効または無効にできます。

comp-lzo

次のいずれかの行のコメントを解除することにより、暗号を手動で設定できます。

cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
cipher DES-EDE3-CBC  # Triple-DES

注:使用する暗号は、後で作成するクライアント構成ファイルでも定義する必要があります。

aes-256-cbcなどの追加の暗号も利用できます。

ステップ7—OpenVPNを開始する

/etc/rc.confに次の行を追加して、OpenVPNが起動時にロードし、serviceコマンドでロードできるようにします。

nano /etc/rc.conf

ファイルの最後に次の行を追加します。

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"

これでOpenVPNサーバーが完全に構成され、起動時に読み込まれます。

次のコマンドを使用してサーバーを手動で起動します。

service openvpn start

期待される出力:

add net 10.8.0.0: gateway 10.8.0.2

これでOpenVPNサーバーが実行されます。

ステップ8—クライアントファイルの設定

サーバーで、各クライアントの構成ファイルを作成します。

まず、作業するフォルダを作成します。

mkdir -p /usr/local/etc/openvpn/clients/clientName

clientNameを、証明書の生成時に以前に設定したクライアント名にします。 (これは作業ディレクトリにすぎないため、これをどのように設定するかは正確には関係ありません。)

新しいディレクトリに移動します。

cd /usr/local/etc/openvpn/clients/clientName/

easy-rsaで生成したクライアントキーと証明書、およびサンプルclient.confファイルをコピーします。 clientNameを、.keyおよび.crtファイルに以前に使用した名前に置き換えてください。

cp /usr/local/etc/openvpn/easy-rsa/keys/clientName.crt /usr/local/etc/openvpn/easy-rsa/keys/clientName.key ./
cp /usr/local/share/examples/openvpn/sample-config-files/client.conf ./client.conf
cp /usr/local/etc/openvpn/ca.crt ./

繰り返しになりますが、clientNameは以前に使用したものです。

client.confファイルを編集します。

nano ./client.conf

remote行を更新して、DropletのIPアドレス(ifconfigで取得可能)とポート番号を含めます。 1194がデフォルトです。

remote your_server_ip 1194

注:サーバーのcipherまたはcomp-lzo設定を変更した場合は、これをclient.confファイルに反映する必要があります。 以前に行ったのと同じ設定を使用します。 例えば:

cipher aes-256-cbc
;comp-lzo

この設定では、aes-256-cbc暗号を使用し、圧縮を無効にします。

サーバー構成でproto行を変更した場合は、これもクライアントに反映する必要があります。

これらの行が前に設定したものと一致していることを確認してください。 サーバー側で何も変更しなかった場合は、ここで変更しないでください。

今少しハウスキーピング。 証明書とキーを単一の構成ファイルに埋め込みます。 これにより、個々のクライアントへの転送が簡単になります。 または、構成ファイルとキーおよび2つの証明書ファイルを個別にクライアントにダウンロードすることもできます。

同じclient.confファイルで、証明書とキーファイル名をコメントアウトします。

;ca ca.crt
;cert client.crt
;key client.key

変更を保存します。

最後に、ca.crtclientName.crt、およびclientName.keyファイルを構成ファイルに埋め込む必要があります。 catまたはnanoまたは最も使いやすいものと、OpenVPNの適切な変数を使用してコンテンツをコピーして貼り付けるか、以下に示す1行のスクリプトを使用できます。

このスクリプトを実行し、プロンプトが表示されたらclientNameを入力します。 スクリプトは、証明書とキーファイルをclient.confファイルに追加し、OpenVPNが期待する適切な変数名と改行を追加します。

echo "Enter clientName:" && set CLIENTNAME = $< && printf "\n<ca>\n" >> ./client.conf && cat ./ca.crt >> ./client.conf && printf "</ca>\n" >> ./client.conf && printf "\n<cert>" >> ./client.conf && grep -v '^ ' ./$CLIENTNAME.crt | grep -v 'Certificate' >> ./client.conf && printf "</cert>\n" >> ./client.conf && printf "\n<key>\n" >> ./client.conf && cat ./$CLIENTNAME.key >> ./client.conf && printf "</key>\n" >> ./client.conf

これは長いコマンドなので、必ず右端までスクロールしてください。

nanoまたはcatを含む完成したclient.confファイルを見てください。 下部のファイルに追加されたキーと証明書が表示されます。

完了です。 ここで行う必要があるのは、client.confファイルをクライアントに配布することだけです。 ほとんどのクライアントは、拡張子.ovpn.confよりも好むため、ファイルの名前をローカルでmy_digitalocean_vpn.ovpnなどに変更する必要があります。

クライアントごとにこのセクションを繰り返します。 デフォルトでは個別の証明書を使用するか、必要に応じて各クライアントで同じクライアント証明書を使用します。

結論とクライアントのセットアップ

これで、OpenVPNサーバーが機能するはずです。

前の手順で作成したクライアント構成ファイル(/usr/local/etc/openvpn/clients/clientName/client.conf)をローカルマシンにダウンロードします。 SCPやSFTPなどの安全な方法を使用して、ファイルをダウンロードします。

また、ローカルマシンに、OpenVPNクライアントをインストールします。 TunnelblickはMacOSXでうまく機能し、OpenVPNにはWindowsクライアントがあります。

クライアント構成ファイルに期待どおりの名前が付けられていることを確認してください。 これは通常、my_digitalocean_vpn.ovpnのような名前です。

ファイルをダブルクリックするか、クライアントの予想されるディレクトリに移動します。

クライアントを起動し、適切なOpenVPNサーバーに接続します。

VPNが機能していることを確認するには、http://www.whatismyip.com/などのIPアドレスチェッカーを使用します。 表示されるIPは、OpenVPNサーバーのIPと一致している必要があります。

おめでとう! 新しいOpenVPNサーバーに接続しました。