FreeBSD10.1でプライベートOpenVPNサーバーを設定して接続する方法
序章
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 eithertcp
orudp
; 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.forwarding
を1
に設定します。これにより、システムでのIPv4ルーティングが可能になります。natd_enable
は、実際のNATルーターを有効にしますnatd_interface
はインターネットへの外部インターフェースです。vtnet0
はDigitalOceanに使用されますnatd_flags
はNATを動的にし、-m
はポート番号を保持します
サーバーを再起動して、ipfw
とnatd
をロードします。
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.crt
、clientName.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サーバーに接続しました。