とりあえずVPNサーバを構築する
VPNサーバがどういう仕組なのかという解説はさておいて、とりあえず構築してみましょう。手順は多かったですが意外と単純です。
一応イメージ的には上の図の様にVPNサーバを立てることで、鍵を持っている端末だけが外部のネットワークからインターネットを介して目的のプライベートネットワークに接続することを可能にします。
VPNサーバ構築にはOpenVPNを採用します。
証明書と鍵の生成
まずはOpenVPNのインストールから行います。レポジトリのURLが変わっていたら適宜対応をお願い致します。
$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm --upgrade --verbose --hash epel-release-6-8.noarch.rpm
$ yum --enablerepo=epel -y install openvpn easy-rsa net-tools
次に認証局の初期化を行います。pkiディレクトリが作成されてここに色々なファイルが置かれていきます。
※引数なしで実行するとusageが確認できる。
$ cd /usr/share/easy-rsa/3.0.6
$ ./easyrsa init-pki
認証局の作成です。途中CA秘密鍵用のパスフレーズを聞かれるので2回入力して下さい。
作成された証明書と鍵は適当な場所にまとめて管理しましょう。
$ ./easyrsa build-ca
$ cp pki/ca.crt /etc/openvpn/keys
$ cp pki/private/ca.key /etc/openvpn/keys
サーバ証明書の作成。server1は証明書と鍵のファイル名。途中パスフレーズを聞かれるので2回入力。
$ ./easyrsa build-server-full server1(任意の名前)
$ cp pki/private/server1.key /etc/openvpn/keys
$ cp pki/issued/server1.crt /etc/openvpn/keys
クライアント証明書の作成。
$ ./easyrsa build-client-full client1(任意の名前)
$ cp pki/private/client1.key /etc/openvpn/keys
$ cp pki/issued/client1.crt /etc/openvpn/keys
DHパラメータの作成。SSLを利用するので共通鍵を安全に交換するアルゴリズムが必要なんだとか。
$ ./easyrsa gen-dh
$ cp pki/dh.pem /etc/openvpn/keys
ta鍵の作成。tls-auth認証(データ改竄検知)用。必須ではありません。
これはopenvpnコマンドで作成します。
$ openvpn --genkey --secret ta.key
$ cp ta.key /etc/openvpn/keys
これで証明書と鍵の生成は完了です。
サーバ側の設定
コンフィグサンプルが用意されているのでそちらを使います。
$ cp /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/
今回のVPN方式はルーティング方式で行います。ブリッジ方式はクライアントのipがホームネットワークのipになるという違いがあります(ホームネットワークが伸びるという表現が使われます)。
複数人で利用する場合にaclでNW毎にアクセス制限をかけられるルーティング方式の方が将来的に良い気がしました。
port 1194
proto udp
# udpのほうが高速。
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server1.crt
key /etc/openvpn/keys/server1.key
dh /etc/openvpn/keys/dh.pem
server 192.168.0.0 255.255.255.0
# VPNクライアントに割り振るNWのセグメント。
ifconfig-pool-persist ipp.txt
push "route 192.168.2.0 255.255.255.0"
# ルーティングテーブルに追加する設定。
# ホームネットワークのセグメントを記載。
tls-auth /etc/openvpn/keys/ta.key 0
# サーバ側は 0 クライアント側は 1 を指定。
keepalive 10 120
cipher AES-256-CBC
# クライアントと合わせる。
status openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
# ログ出力先の指定。ディレクトリはあらかじめ作成しておく。
verb 3
explicit-exit-notify 1
# UDP接続方式のみ設定できる項目
ファイアウォールの設定。
# firewall-cmd --add-port=1194/udp --permanent
# firewall-cmd --add-masquerade --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
サービス起動。プロセスが動いていることを確認。
# openvpn server.conf
# ps -ef | grep openvpn | grep -v grep
パケットフォワードを有効にする。
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 末尾に追記。保存して再起動。下記コマンドで 1 が帰ってくればOK。
/sbin/sysctl net.ipv4.ip_forward
ルータにてポートフォワーディンぐを行う。コマンドはルータによりますが、1194/udpをホームネットワークアドレスに向けるだけだと思います。
ひとまずサーバ側の設定は完了。エラーがある場合は標準出力には出ないので、指定した出力先のログを確認する。
クライアント側の設定
さっき作成した鍵などを丸々コピーして下さい。scpでもftpでも何でもいいです。
クライアント側のコンフィぐ設定ではクライアント側のパスを記述して下さい。
クライアント側の設定もクライアント用のコンフィグサンプルがあるのでそれを利用。
$ cp /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/client.conf .
基本的にはサーバの設定に合わせる。
client
dev tun
proto udp
remote 10.1.1.1 1194
# サーバのアドレスを入力。
# (自宅のルータのWAN側ip)
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
# サーバと揃える verb 3
クライアントから下記コマンドでVPN接続。クライアントはDebian系Linuxのみ想定。(検証機がubuntuだったため)
GUIが良ければOpenVPNやCiscoVPN当たりのVPNクライアントソフトが直感的です。
成功すると仮想NWインタフェースが作成されているはず。
# sudo apt install openvpn
# openvpn client.conf
# ifconfig
とりあえず外部からリモートデスクを試してみて、接続出来たことを確認しました。またiPhoneにもOpenVPNアプリを入れて接続出来ました。iPhoneの場合コンフィグファイルはiTunesでファイル共有する方法が楽です。
備忘録
自宅のルータはCisco 1812jを使用しているのですが、何度か停電やブレーカーが落ちるなどの理由でポートフォワーディングのコンフィグを入れ直す事が起こるので、その方法を残しておきます。configモードで下記コマンドを実行します。
#(config) ip nat inside source static udp 【VPN IP】 【VPN Port】 interface 【IN Interface (Dialer0)】 【client configで指定したPort】