概要
OpenWrtにOpenVPNをセットアップする方法です。 下記が参考になります。
こちらの手順では、openvpn-easy-rsa を使うことで、コマンドを実行するだけで簡単にセットアップすることができます。 鍵や証明書についてほとんど意識する必要はありません。
私の場合、主に iPhone から接続するため、TUNモードで接続するようにセットアップしました。 ここでは、実際にセットアップした内容について共有します。
実際にiPhoneからVPN接続することができました。
ただし、後述の「TUNモードで接続する場合の課題」の通り、LAN上のクライアントにアクセスするためには、IPマスカレードなど、ネットワークセグメントを超える設定が必要になります。
現状、私はOpenWrtでのやり方がわかっていません。
よって、現在のところはDD-WRTにてOpenVPNを使用しています。
Setup OpenVPN
Preparation
opkg update
opkg install openvpn-openssl
opkg install openvpn-easy-rsa
NET_FQDN は環境に合わせて書き換えます。
VPN_PROTO=”tcp” にしました。(注:udpでも接続できました)
# Configuration parameters VPN_DIR="/etc/openvpn" VPN_PKI="/etc/easy-rsa/pki" VPN_PORT="1194" VPN_PROTO="tcp" VPN_POOL="192.168.9.0 255.255.255.0" VPN_DNS="${VPN_POOL%.* *}.1" VPN_DN="$(uci -q get dhcp.@dnsmasq[0].domain)" # Fetch server address #NET_FQDN="$(uci -q get ddns.@service[0].lookup_host)" NET_FQDN=hoge.dip.jp . /lib/functions/network.sh network_flush_cache network_find_wan NET_IF network_get_ipaddr NET_ADDR "${NET_IF}" if [ -n "${NET_FQDN}" ] then VPN_SERV="${NET_FQDN}" else VPN_SERV="${NET_ADDR}" fi
Key management
wget -U "" -O /tmp/easyrsa.tar.gz https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz
tar -z -x -f /tmp/easyrsa.tar.gz
# Configuration parameters cat << EOF > /etc/profile.d/easy-rsa.sh export EASYRSA_PKI="${VPN_PKI}" export EASYRSA_TEMP_DIR="/tmp" export EASYRSA_CERT_EXPIRE="3650" export EASYRSA_BATCH="1" alias easyrsa="/root/EasyRSA-3.1.7/easyrsa" EOF
. /etc/profile.d/easy-rsa.sh
easyrsa init-pki
下記は環境によっては非常に時間がかかります。(17:13-18:13,1h)
easyrsa gen-dh
easyrsa build-ca nopass
easyrsa build-server-full server nopass
openvpn --genkey tls-crypt-v2-server ${EASYRSA_PKI}/private/server.pem
easyrsa build-client-full client nopass openvpn --tls-crypt-v2 ${EASYRSA_PKI}/private/server.pem --genkey tls-crypt-v2-client ${EASYRSA_PKI}/private/client.pem
Firewall
VPN service
# Configure VPN service and generate client profiles umask go= VPN_DH="$(cat ${VPN_PKI}/dh.pem)" VPN_CA="$(openssl x509 -in ${VPN_PKI}/ca.crt)" ls ${VPN_PKI}/issued \ | sed -e "s/\.\w*$//" \ | while read -r VPN_ID do VPN_TC="$(cat ${VPN_PKI}/private/${VPN_ID}.pem)" VPN_KEY="$(cat ${VPN_PKI}/private/${VPN_ID}.key)" VPN_CERT="$(openssl x509 -in ${VPN_PKI}/issued/${VPN_ID}.crt)" VPN_EKU="$(echo "${VPN_CERT}" | openssl x509 -noout -purpose)" case ${VPN_EKU} in (*"SSL server : Yes"*) VPN_CONF="${VPN_DIR}/${VPN_ID}.conf" cat << EOF > ${VPN_CONF} ;; user nobody group nogroup dev tun port ${VPN_PORT} proto ${VPN_PROTO} server ${VPN_POOL} topology subnet client-to-client keepalive 10 60 persist-tun persist-key push "dhcp-option DNS ${VPN_DNS}" push "dhcp-option DOMAIN ${VPN_DN}" push "redirect-gateway def1" push "persist-tun" push "persist-key" <dh> ${VPN_DH} </dh> EOF (*"SSL client : Yes"*) VPN_CONF="${VPN_DIR}/${VPN_ID}.ovpn" cat << EOF > ${VPN_CONF} ;; user nobody group nogroup dev tun nobind client remote ${VPN_SERV} ${VPN_PORT} ${VPN_PROTO} auth-nocache remote-cert-tls server EOF esac cat << EOF >> ${VPN_CONF} <tls-crypt-v2> ${VPN_TC} </tls-crypt-v2> <key> ${VPN_KEY} </key> <cert> ${VPN_CERT} </cert> <ca> ${VPN_CA} </ca> EOF done
service openvpn restart
ls ${VPN_DIR}/*.ovpn
server.conf の変更
root@OpenWrt:~# cat /etc/openvpn/server.conf user nobody group nogroup dev tun port 1194 proto tcp server 192.168.9.0 255.255.255.0 topology subnet client-to-client keepalive 10 60 persist-tun persist-key push "dhcp-option DNS 192.168.9.1" push "dhcp-option DOMAIN lan" push "redirect-gateway def1" push "persist-tun" push "persist-key"
下記を追加して再起動する。
push "redirect-gateway def1" push "route 192.168.1.0 255.255.255.0" status /tmp/openvpn-status.log
service openvpn restart
OpenVPNクライアントの設定(iPhone)
OpenVPNクライアントの設定ファイルも自動生成されます。
/etc/openvpn/client.ovpn を使用します。
下記の手順にてiPhoneに設定ファイルを転送することで、VPN接続自体はできました。 (下記のページはかなり古いですが、現在もやり方としては基本的に同じです)
TUNモードで接続する場合の課題
私の場合、主に iPhone から接続するため、TUNモードで接続するようにセットアップしました。 TUN/TAPモードについては下記で詳細が解説されています。
ただ、TUNモードで接続する場合、ネットワークセグメントが異なるため、そのままではLAN上のPCなどにアクセスできません。 ネットワークに接続できても、LAN上のクライアントにアクセスできないのであれば意味がありません。
このあたりについては下記に詳細が記載されています。こちらはDD-WRTの場合ですが、考え方は同じと思われます。
下記、引用します。
しか~し!!
そのネットワーク内にアクセスできたのはいいけど、iPhoneに割り当てられているipアドレス(10.8.0.x)が目的のネットワーク内のアドレス(192.168.10.x)と違うため個々のパソコンFireWallに引っかかってリモートデスクトップなどができないという問題が発生・・・
FireWallの許可設定をすればいいだけなんだけどなんかスッキリしない。
iPhoneに割り当てられるipアドレスを目的のネットワーク内のアドレスと同じにするためにはVPNのモードをBridge(TAP)モードにすればいいんだけど、残念ながらiPhoneは対応していないらしい。
そこでいろいろ調べた結果ipマスカレードを使用することにした。これは通常はローカルからグローバルにアクセスするときに使用されるものなんだけど、それをこんな使い方していいのか・・・よくわからないけどとにかくこれで解決できたので良しとしよう! ってことで設定してみる。
管理 → コマンド実行 とたどって以下の内容を起動時スクリプトとして保存する
↓↓↓↓↓↓この下から↓↓↓↓↓↓
iptables -t nat -A POSTROUTING -o br0 -s 10.8.0.0/255.255.255.0 -j MASQUERADE
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
設定したらルーターを再起動。
OpenWrtにおいても、上記の iptablesコマンドでのIPマスカレードの設定と同等のことを行えばよいはずですが、私は現状はやり方がわかっていません。
参考ページ
OpenWrt公式(OpenVPN)
OpenWrt公式(その他)
OpenWrtで OpenVPN (DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ)
こちら、参考になりますが、前述の通り、openvpn-easy-rsa を使う場合は鍵や証明書についてほとんど意識することなく、簡単にセットアップできます。
- OpenWrtで OpenVPN(1) 動作環境 – DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ – atwiki(アットウィキ)
- OpenWrtで OpenVPN(2) 証明書などの準備 – DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ – atwiki(アットウィキ)
- OpenWrtで OpenVPN(3) OpenVPNのインストールと環境設定 – DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ – atwiki(アットウィキ)
- OpenWrtで OpenVPN(4) Firewallの設定 – DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ – atwiki(アットウィキ)
- OpenWrtで OpenVPN(5) VPNクライアントの設定 – DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ – atwiki(アットウィキ)
OpenWrt で OpenVPN (トンネル/ブリッジ/クライアント) を設定する
図示して詳細に説明されており、TUN/TAPモードについても解説されています。
easy-rsa3 について
サーバー CentOS、クライアント Ubuntu での事例
TUNモードで設定されているようなので、下記の記載がありますね。
10.8.0.0/24 宛のパケットを 192.168.11.10 へ転送する。
その他
参考になりそうに見えたのですが、有効な手段は見つかっていません。