OpenWrt に OpenVPN サーバーをインストール

OpenWrt のルーターに OpenVPN サーバーをインストールして、プライベート VPN サーバーを作成しました。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 21.02.1
パッケージ バージョン
openvpn-openssl 2.5.3-3
openvpn-easy-rsa 3.0.8-3

必要なパッケージをインストール

ルーターに SSH でアクセスしてパッケージをインストールします。

opkg update
opkg install openvpn-openssl openvpn-easy-rsa

パラメータを設定

パラメータを設定します。サーバーのアドレスを設定し、ポート番号等を標準から変更する場合はここで変更します。

OVPN_SERV="hogepiyo.com"
OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_PORT="1194"
OVPN_PROTO="udp"
OVPN_POOL="192.168.8.0 255.255.255.0"
OVPN_DNS="${OVPN_POOL%.* *}.1"
OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"

PKI と鍵の作成

easyrsa コマンドで PKI とサーバーとクライアントの鍵を作成します。まずパラメータを設定します。

EASYRSA_KEY_SIZE のデフォルトは2048ですが、以下のように鍵長を長くすることもできます。ただし鍵の生成に時間がかかります。

export EASYRSA_PKI="${OVPN_PKI}"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_BATCH="1"
export EASYRSA_KEY_SIZE="4096"

PKI フォルダを初期化します。

easyrsa init-pki

DH パラメータを生成します。

easyrsa gen-dh

CA を作成します。

easyrsa build-ca nopass

サーバー用の鍵を作成します。

easyrsa build-server-full server nopass
openvpn --genkey tls-crypt-v2-server ${EASYRSA_PKI}/private/server.pem

クライアント用の鍵を作成します。2つのコマンドの “client” 部分を変更して繰り返し実行し必要な数のクライアント用の鍵を作成します。

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

ファイアフォールの設定

OpenVPN のネットワークを lan へ加え、wan から OpenVPN サーバーへのアクセスを許可します。

uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.device="tun+"
uci add_list firewall.lan.device="tun+"
uci -q delete firewall.ovpn
uci set firewall.ovpn="rule"
uci set firewall.ovpn.name="Allow-OpenVPN"
uci set firewall.ovpn.src="wan"
uci set firewall.ovpn.dest_port="${OVPN_PORT}"
uci set firewall.ovpn.proto="${OVPN_PROTO}"
uci set firewall.ovpn.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart

OpenVPN サーバーの設定とクライアント設定ファイルの作成

以下の長いコマンドを実行して、サーバー用の設定ファイルとクライアント用の設定ファイルを作成します。作成されたサーバー用の設定ファイルは *.conf として、クライアント用は *.ovpn として ${OVPN_DIR} 以下に作成されます。

umask go=
OVPN_DH="$(cat ${OVPN_PKI}/dh.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
ls ${OVPN_PKI}/issued \
| sed -e "s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_TC="$(cat ${OVPN_PKI}/private/${OVPN_ID}.pem)"
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_EKU="$(echo "${OVPN_CERT}" | openssl x509 -noout -purpose)"
case ${OVPN_EKU} in
(*"SSL server : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.conf"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 60
persist-tun
persist-key
push "dhcp-option DNS ${OVPN_DNS}"
push "dhcp-option DOMAIN ${OVPN_DOMAIN}"
push "redirect-gateway def1"
push "persist-tun"
push "persist-key"
<dh>
${OVPN_DH}
</dh>
EOF
(*"SSL client : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.ovpn"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server
EOF
esac
cat << EOF >> ${OVPN_CONF}
<tls-crypt-v2>
${OVPN_TC}
</tls-crypt-v2>
<key>
${OVPN_KEY}
</key>
<cert>
${OVPN_CERT}
</cert>
<ca>
${OVPN_CA}
</ca>
EOF
done

OpenVPN サーバーを再起動します。

/etc/init.d/openvpn restart

作成したクライアント用の設定ファイルを確認します。このファイルをダウンロードしてクライアント端末にインポートして接続確認を行います。

ls ${OVPN_DIR}/*.ovpn

参考

コメントを残す

メールアドレスが公開されることはありません。