跳转至

OpenWrt 安装 OpenVPN

1. 前言

尽管 OpenVPN 这种异地组网方式有些许远古,但是还是有使用 OpenVPN 的必要,譬如说它支持 TCP 协议。因此本文会建立一个 OpenVPN 服务器,前置条件如下:

  • OpenWrt 有公网 IPv6 ,且高位 TCP 端口可稳定连接。
  • 私网网段 10.8.1.0/24 没有被使用,将会被作为 OpenVPN 私网网段。

2. 安装软件包

使用 opkg 安装软件:

1
2
3
# Install packages
opkg update
opkg install openvpn-openssl openvpn-easy-rsa

3. 设置环境变量

以下为安装需要的环境变量:

# Configuration parameters
VPN_DIR="/etc/openvpn"
VPN_PKI="/etc/easy-rsa/pki"
VPN_PORT="11940"
VPN_PROTO="tcp6"
VPN_POOL="10.8.1.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)"
. /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

如果中途退出,需要重新设置。

4. 使用 EasyRSA 生成密钥

一键下载并生成密钥:

cd ~
# Work around EasyRSA issues
wget -U "" -O /tmp/easyrsa.tar.gz https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.0/EasyRSA-3.2.0.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.2.0/easyrsa"
EOF
. /etc/profile.d/easy-rsa.sh

# Remove and re-initialize PKI directory
easyrsa init-pki

# Generate DH parameters
easyrsa gen-dh

# Create a new CA
easyrsa build-ca nopass

# Generate server keys and certificate
easyrsa build-server-full server nopass
openvpn --genkey tls-crypt-v2-server ${EASYRSA_PKI}/private/server.pem

# Generate client keys and certificate
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

5. 生成 OpenVPN 配置并启动服务

生成客户端与服务器配置文件:

# 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
comp-lzo yes
allow-compression yes
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

生成的客户端配置在 /etc/openvpn/client.ovpn ,服务器配置在 /etc/openvpn/server.conf

6. 配置防火墙

Network -> Firewall -> Traffic Rules 配置防火墙,放行 OpenVPN 端口:

Network -> Interfaces 中添加 tun0 网络接口:

将该网络接口放入 vpn 防火墙区域:

同时,在 Network -> Firewall -> Zones 中,设置 vpn 区域对所有区域可转发,开启 Masquerading ,Input 、 Output 、 Forward 全部 Accept :

至此一个最基本的 OpenVPN 配置完成。

7. luci-app-openvpn 的配置

如果要使用图形化管理 OpenVPN ,首先需要安装 luci-app-openvpn ,之后根据 /etc/openvpn/server.conf 进行配置文件迁移。首先先在 /etc/openvpn/server.conf 中提取证书,并存放到相应位置:

server.conf 中证书 存放地点
ca /etc/openvpn/pki/ca.crt
dh /etc/openvpn/pki/dh.pem
cert /etc/openvpn/pki/server.crt
key /etc/openvpn/pki/server.key
tls-crypt-v2 /etc/openvpn/pki/server.pem

之后将 /etc/openvpn/server.conf 重命名为 server.conf.bak ,开始在 VPN -> OpenVPN 界面点击 Edit 对默认的 myvpn 进行配置:

实测最终的配置如下:

8. 参考资料

https://openwrt.org/docs/guide-user/services/vpn/openvpn/server