OpenWrtにOpenVPNをセットアップ

概要

OpenWrtにOpenVPNをセットアップする方法です。 下記が参考になります。

[OpenWrt Wiki] OpenVPN server

こちらの手順では、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接続自体はできました。 (下記のページはかなり古いですが、現在もやり方としては基本的に同じです)

OpenVPN .ovpn ファイルをiPhoneへ転送

TUNモードで接続する場合の課題

私の場合、主に iPhone から接続するため、TUNモードで接続するようにセットアップしました。 TUN/TAPモードについては下記で詳細が解説されています。

https://cube309b.hatenablog.com/entry/2023/04/30/123029#TUN-%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A8-TAP-%E3%83%A2%E3%83%BC%E3%83%89]

ただ、TUNモードで接続する場合、ネットワークセグメントが異なるため、そのままではLAN上のPCなどにアクセスできません。 ネットワークに接続できても、LAN上のクライアントにアクセスできないのであれば意味がありません。

このあたりについては下記に詳細が記載されています。こちらはDD-WRTの場合ですが、考え方は同じと思われます。

『DD-WRTとiPhone5sでVPNの構築(OpenVPN)』
DD-WRT化したルーター(WZR-HP-G300NH)とDocomoのiPhone5sでOpenVPNを利用したVPN通信を設定したのでその記録。これまでA…

下記、引用します。

しか~し!!

そのネットワーク内にアクセスできたのはいいけど、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 (トンネル/ブリッジ/クライアント) を設定する

図示して詳細に説明されており、TUN/TAPモードについても解説されています。

サーバー CentOS、クライアント Ubuntu での事例

TUNモードで設定されているようなので、下記の記載がありますね。

10.8.0.0/24 宛のパケットを 192.168.11.10 へ転送する。

その他

参考になりそうに見えたのですが、有効な手段は見つかっていません。

Copied title and URL