VPNをご存知ですか?海外では公衆Wi-Fiには必需品と考えられている地域もあるほどの必須インフラですが、日本ではあまり知られていないのも実情。
VPNとはVirtual Private Networkの略で、仮想的な専用線をひくイメージです。仮想的にセキュリティの高い回線を用意するというもので、暗号化技術により成り立っています。
最近ではルータにこの機能が付属しているものも増えてきています。ルータをVPNサーバーとすれば、省エネ低コストで専用線なみのセキュリティを確保できなかなか素敵な選択肢となっています。
Table of Contents(目次)
VPNのメリットとは
・フリーWi-Fiを利用するときの安全性が上がる
・自宅のLAN内のサーバーに外からアクセスできる
・海外から日本限定の動画サービスなどにアクセスできる
・旅行先で関東のRadikoが聞ける
などが挙げられます。
VPNの種類(プロトコルなど)
・PPTP
・IPSec
・L2TP/IPsec
・OpenVPN
この内PPTPとL2TPはトンネリングのみを行い、暗号化などは別の仕組みを利用するようになっています。PPTPであればRC4と組み合わせることが多く、Windowsに標準装備となっているそうです。またL2TPであればIPSecと組み合わせてセキュリティを確保することが多いようです。この中で一番セキュリティが高いのはOpenVPNのようです。それもSHA-2に対応しているものがよいとのことです。今からVPNを選べる環境なら最新のOpenVPNを選びましょう。
Raspberry PiでVPNサーバーを構築する
VPNルータを持ってない?それならRaspberry Piで代用ができるかもしれません。セキュリティに関して強固にできるかどうかわかりませんが一応やってみました。多分Raspberry PiであってもOpenVPNのドキュメント通り正確に正しく構築すればそれなりにセキュリティの高いものができるでしょう。ただし知識が必要なのでなんちゃってVPNくらいのセキュリティでVPNを使ってみました。ちゃんとするならVPNルータを使ったほうがセキュリティは高いかもしれません。
RaspberryPi & Open Vpn構築手順
#パッケージリストの更新
sudo apt-get update
#パッケージの更新
sudo apt-get upgrade
#ロケールの更新
sudo update-locale LANG=ja_JP.UTF-8
#タイムゾーン設定
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
sudo dpkg-reconfigure –frontend noninteractive tzdata
#オープンVPNのインストール
sudo apt install openvpn
#EasyRSAのインストール(コンパイル等はいらない模様)
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
sudo mv EasyRSA-v3.0.6 /usr/local/EasyRSA
#環境変数?の設定 cd /usr/local/EasyRSA/ cp -p vars.example vars vi vars
vi varsで認証局証明書の期限(2000日に設定)
set_var EASYRSA_CA_EXPIRE 2000 set_var EASYRSA_CERT_EXPIRE 2000
cd /usr/local/EasyRSA/
#初期化
./easyrsa init-pki
#認証局作成 パスフレーズが聞かれるので任意に入力 CommonNameも同様
./easyrsa build-ca
#DHパラメータを設定(結構時間がかかる)
./easyrsa gen-dh
#サーバー用証明書キーペア生成(パスワードは先程入力したものと同じ)
./easyrsa build-server-full server nopass
#クライアント用キーペア生成(パスワードは先程と同じ)
./easyrsa build-client-full client1 nopass
#サーバ設定
cd /usr/local/EasyRSA/
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
#設定雛形を解凍
sudo gzip -d /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
sudo cp -p /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server.conf
#TAキーを作成
sudo openvpn –genkey –secret /etc/openvpn/ta.key
サーバー設定をいかになるように編集
port 1194 | 接続を受け付けるポート、外に開放するためのポートなのでデフォルト以外でもよいと思う。ovpnファイルに埋め込めるため使い勝手は変わらず |
proto udp | udpの他 tcpが選べる |
push “dhcp-option DNS 8.8.8.8” | 名前解決のためのDNSサーバ |
dev tun | ルーティングモードでの設定だと思う |
ca ca.crt | Caファイルのファイル名 |
cert server.crt | certファイルのファイル名 |
key server.key | サーバ用鍵のファイル名 |
dh dh2048.pem | dhパラメータで出力したファイル |
server 10.8.0.0 255.255.255.0 | VPN接続したクライアントに割り当てられる仮想アドレス範囲 |
ifconfig-pool-persist ipp.txt | よくわからん |
push “route 192.168.1.0 255.255.255.0” | サーバと同じサブネット。このサブネットにVPN経由でアクセスできるんだと思う |
push “redirect-gateway def1” | VPNのトラフィックをすべてここに通す |
client-config-dir ccd | クライアントに固定IPをわりあてる |
keepalive 10 120 | 生存期間 |
tls-auth ta.key 0 # This file is secret | |
cipher AES-256-CBC | 暗号化方式 |
persist-key | |
persist-tun | |
status openvpn-status.log | |
explicit-exit-notify 1 |
IPマスカレードの設定に苦労した
IPマスカレードの設定をしないとVPN経由でネットに繋がらない。私はUFWが好きなのでufwを使っている人向けの設定を行う
sudo vi /etc/default/ufw ##DEFAULT_FORWARD_POLICY="DROP"を以下に変える DEFAULT_FORWARD_POLICY="ACCEPT" #sysctl.conf ファイルはufwだと以下 vi /etc/ufw/sysctl.conf #以下を有効化コメントを外す net/ipv4/ip_forward=1 #iptablesの設定を直接叩くらしい sudo vi /etc/ufw/before.rules #十行目あたりに書く :POSTROUTING ACCEPT [0:0] # Forward traffic from eth0 through eth1. #10.0.0.0/24 からのパケットを eth1 に転送するという意味 -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE #ufwの再起動 sudo ufw reloadでも良いか? sudo ufw disable && sudo ufw enable
クライアント用設定などをまとめたファイルovpnを作る。キーなどを埋め込むことができるので便利に使える。
簡単に作れるシェルスクリプトがあるのでこちらを使うと楽
このブログは以下の記事を参考にさせて頂いた上自環境でテストして加筆していったものです。
Qiita OpenVPNサーバの作り方
これで接続自体は一発でアンドロイドなどから行えました。マスカレード設定の解決に時間を要しましたので、参考になれば幸いです。今後ルータを買う方はopenvpnが使えるものを選ぶとよいでしょう。皆様快適ライフを!
20200622追記 設定がうまく行かない場合
sudo vi /etc/ufw/before.rules にて設定がうまく行かない場合は10行目付近でなく、COMMITの後に以下を追加したらうまく行きました。 *nat :POSTROUTING ACCEPT [0:0] -F -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE COMMIT