设置 OpenVPN 服务器

来自 Alpine Linux

本文介绍如何在 Alpine Linux 上设置 OpenVPN 服务器。 这对于允许单个用户或设备远程连接到你的网络来说是一个理想的解决方案。 强烈建议你拥有一个公开可路由的静态 IP 地址以使其工作。 这意味着你的 IP 地址不能是 bogon IP 地址 (IPv4 列表, IPv6 列表)。 如果你的联网机器没有静态 IP 地址,可以使用 No-ip 来将 DNS 名称解析为 IP 地址。

设置 Alpine

初始设置

按照 Installation 来设置 Alpine Linux。

安装程序

安装 openvpn

apk add openvpn

准备 OpenVPN 的自动启动

rc-update add openvpn default

modprobe tun echo "tun" >> /etc/modules-load.d/tun.conf

启用 IP 转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/ipv4.conf

sysctl -p /etc/sysctl.d/ipv4.conf

证书

首先需要完成的事情之一是确保你拥有安全密钥以供使用。 Alpine 通过提供一个 Web 界面来管理证书,从而简化了此操作。 相关文档可以在这里找到:Generating SSL certs with ACF。 最佳实践是不将你的证书服务器与用于远程连接的路由器放在同一台机器上。

你将需要为服务器创建一个服务器证书 (ssl_server_cert),并为每个客户端创建一个客户端证书 (ssl_client_cert)。 要使用证书,你应该下载 .pfx 文件并将其解压。

要提取每个 .pfx 文件的三个部分,请使用以下命令

要取出 ca 证书

openssl pkcs12 -in PFXFILE -cacerts -nokeys -out ca.pem

要取出 cert 文件

openssl pkcs12 -in PFXFILE -nokeys -clcerts -out cert.pem

要取出私钥文件:(确保密钥保持私有)

openssl pkcs12 -in PFXFILE -nocerts -nodes -out key.pem

在 VPN 服务器上,你还可以安装 acf-openvpn 软件包,其中包含一个网页,可以自动上传和提取服务器证书。 还有一个按钮可以自动生成 Diffie-Hellman 参数。

如果你更喜欢使用 OpenVPN 实用程序生成证书,请参阅 #备用证书方法

配置 OpenVPN 服务器

服务器的示例配置文件。 将以下内容放入 /etc/openvpn/openvpn.conf

local "Public Ip address"
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt 
cert /etc/openvpn/easy-rsa/keys/Server.crt # SWAP WITH YOUR CRT NAME
key /etc/openvpn/easy-rsa/keys/Server.key # SWAP WITH YOUR KEY NAME
dh /etc/openvpn/easy-rsa/keys/dh1024.pem # If you changed to 2048, change that here!
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.0.0.0"
push "dhcp-option DNS 10.0.0.1"
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 3

(说明基于 openvpn.net/howto.html#server)

测试你的配置

测试配置和证书

openvpn --config /etc/openvpn/openvpn.conf

配置 OpenVPN 客户端

客户端 client.conf 示例

client
dev tun
proto udp
remote "public IP" 1194
resolv-retry infinite
nobind
ns-cert-type server # This means the certificate on the openvpn server needs to have this field. Prevents MitM attacks
persist-key
persist-tun
ca client-ca.pem
cert client-cert.pem
key client-key.pem
comp-lzo
verb 3

(说明基于 openvpn.net/howto.html#client)

保存设置

如果你正在运行基于 RAM 的系统,请不要忘记保存所有设置。

lbu commit

多个服务器或客户端

如果你想在同一 Alpine 机器上运行多个服务器或客户端,请使用标准的 Multiple Instances of Services 流程。

例如,要创建一个名为 “AlphaBravo” 的配置

  • 创建一个合适的 /etc/openvpn/openvpn.conf 文件,但将其命名为 “/etc/openvpn/AlphaBravo.conf”
  • 创建 init.d 脚本的新符号链接

ln -s openvpn /etc/init.d/openvpn.AlphaBravo

  • 让新服务自动启动

rc-update add openvpn.AlphaBravo

备用证书方法

手动证书命令

(说明基于 openvpn.net/howto.html#pki)

管理证书的初始设置

以下说明假定你想将你的配置、证书和密钥保存在 /etc/openvpn/keys 中。
首先移动到 /usr/share/openvpn/easy-rsa 文件夹以执行命令

apk add easy-rsa # from the community repo cd /usr/share/easy-rsa

如果尚未完成,请创建一个文件夹,你将在其中保存你的证书,并保存一份你的 /usr/share/easy-rsa/vars 的副本以供以后使用。

mkdir /etc/openvpn/keys cp ./vars.example ./vars #easy-rsa v3 cp ./vars /etc/openvpn/keys #easy-rsa v2

有关 EasyRSA v3,请参阅:https://community.openvpn.net/openvpn/wiki/EasyRSA

以下说明适用于 EasyRSA v2

如果尚未完成,请编辑 /etc/openvpn/keys/vars
(此文件用于定义路径和其他标准设置)

vim /etc/openvpn/keys/vars

  • KEY_DIR= 从 “$EASY_RSA/keys” 更改为 “/etc/openvpn/keys
  • 更改 KEY_SIZE、CA_EXPIRE、KEY_EXPIRE、KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG、KEY_EMAIL 以匹配你的系统。

source vars 以设置属性

source /etc/openvpn/keys/vars

touch /etc/openvpn/keys/index.txt echo 00 > /etc/openvpn/keys/serial

设置 '证书颁发机构' (CA)

清理 keys 文件夹。

./clean-all

生成 Diffie-Hellman 参数

./build-dh

要创建 CA 证书和密钥

./build-ca

设置 'OpenVPN 服务器'

创建服务器证书

./build-key-server <commonname>

设置 'OpenVPN 客户端'

创建客户端证书

./build-key <commonname>

吊销证书

要吊销证书

./revoke-full <commonname>

revoke-full 脚本将在 keys 子目录中生成一个名为 crl.pem 的 CRL(证书吊销列表)文件。
该文件应复制到 OpenVPN 服务器可以访问的目录中,然后在服务器配置中启用 CRL 验证

crl-verify crl.pem

OpenVPN 和 LXC

我们称此 LXC 为 “mylxc”...

在宿主机上

modprobe tun
mkdir /var/lib/lxc/mylxc/rootfs/dev/net
mknod /var/lib/lxc/mylxc/rootfs/dev/net/tun c 10 200
chmod 666 /var/lib/lxc/mylxc/rootfs/dev/net/tun

在 /var/lib/lxc/mylxc/config 中

lxc.cgroup.devices.allow = c 10:200 rwm

在虚拟机上

apk add openvpn

然后像往常一样配置。

这应该可以作为服务器和客户端工作。

持久设备

lxc 虚拟机在每次重启时都会在 tmpfs 中重新创建它们的 dev。 这意味着所有设备都会被重置,并且不会从 rootfs dev 目录中读取。 为了使其持久化,你可以通过将以下内容添加到你的 lxc 虚拟机配置中使用 autodev 脚本

# tun (openvpn)
lxc.cgroup.devices.allow = c 10:200 rwm
# audodev script to add devices
lxc.hook.autodev=/var/lib/lxc/CONTAINER/autodev

autodev 脚本

#!/bin/sh
# dev is populated on earch container start.
# to make devices persistence we need to recreate them on each start.

cd ${LXC_ROOTFS_MOUNT}/dev
mkdir net
mknod net/tun c 10 200
chmod 0666 net/tun