设置 OpenVPN 服务器
本文介绍如何在 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