jklincn


使用 OpenVPN 连接家庭局域网


服务端系统:Debian 12.12.0

客户端系统:Windows 11 24H2

OpenVPN 版本:2.6.15

EasyRSA 版本:3.2.4

服务端配置

安装

采用源码编译安装的方式

# 安装编译依赖
sudo apt update
sudo apt install build-essential pkg-config libnl-genl-3-dev libcap-ng-dev libssl-dev liblz4-dev liblzo2-dev libpam0g-dev libsystemd-dev openssl

# 安装 DCO(Data Channel Offload,内核优化模块)
sudo apt install dkms openvpn-dco-dkms

# 下载源代码
wget https://swupdate.openvpn.org/community/releases/openvpn-2.6.15.tar.gz

tar xf openvpn-2.6.15.tar.gz
sudo mv openvpn-2.6.15 /opt
cd /opt/openvpn-2.6.15
./configure --enable-systemd
make -j
sudo make install
echo 'export PATH=$PATH:/usr/local/sbin' >> ~/.bashrc
source ~/.bashrc

生成证书

从严格意义来说,CA 需要是另外一台安全的主机,但个人使用就不考虑这么多了。

下载 easy-rsa

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.4/EasyRSA-3.2.4.tgz

tar xf EasyRSA-3.2.4.tgz
sudo mv EasyRSA-3.2.4 /opt
cd /opt/EasyRSA-3.2.4

初始化 PKI

./easyrsa init-pki

创建证书颁发机构(CA),这里为了方便没有设置密码(生产环境请设置密码,后文不再赘述),创建过程中直接回车即可。

./easyrsa build-ca nopass

生成服务器秘钥和证书,server 是自定义的服务端名称,可以按需修改,生成过程中需要输入 yes。

./easyrsa build-server-full server nopass

生成客户端秘钥和证书,参数 client 是自定义的服务端名称,可以按需修改,生成过程中需要输入 yes。

./easyrsa build-client-full client nopass

生成 DH 文件

./easyrsa gen-dh

新版证书如果使用 ECDSA,那么不需要 DH 文件,因此服务端示例配置文件中没有包含该字段。本文还是采用 RSA 类型,需要使用 DH 文件。

经过以上流程,得到 6 个关键文件,分别是

  1. /opt/EasyRSA-3.2.4/pki/ca.crt:CA 证书文件
  2. /opt/EasyRSA-3.2.4/pki/dh.pem:Diffie-Hellman 参数文件
  3. /opt/EasyRSA-3.2.4/pki/issued/server.crt:服务端证书文件
  4. /opt/EasyRSA-3.2.4/pki/private/server.key:服务端私钥文件
  5. /opt/EasyRSA-3.2.4/pki/issued/client.crt:客户端证书文件
  6. /opt/EasyRSA-3.2.4/pki/private/client.key:客户端私钥文件

服务端配置文件

# 创建日志文件夹
sudo mkdir /var/log/openvpn
sudo chmod 755 /var/log/openvpn

# 复制配置文件模板
cd /opt/openvpn-2.6.15
cp sample/sample-config-files/server.conf myserver.conf

编辑 myserver.conf 文件

必须修改的

  • ca:修改成 CA 证书文件路径 /opt/EasyRSA-3.2.4/pki/ca.crt
  • cert:修改成服务端证书文件路径 /opt/EasyRSA-3.2.4/pki/issued/server.crt
  • key:修改成服务端私钥文件路径 /opt/EasyRSA-3.2.4/pki/private/server.key
  • dh:修改成 Diffie-Hellman 参数文件路径 /opt/EasyRSA-3.2.4/pki/dh.pem

按需修改

  • port:服务端口
  • proto:使用 udp 协议还是 tcp 协议(对于公网 IPV6 来说,这里要修改成 udp6 或者 tcp6)
  • dev:使用路由模式(tun)还是桥接模式(tap),一般来说推荐 tun
  • server:自定义虚拟 IP 地址范围

设置防火墙(如若开启)

以下命令根据实际修改:比如 enp2s0 也可能是 eth0;自定义的端口和协议等

sudo apt install iptables-persistent

# 允许 OpenVPN 服务端口流量进入(客户端连接服务端)
sudo iptables -A INPUT -i enp2s0 -p udp --dport 1194 -j ACCEPT

# 允许 VPN 虚拟网卡流量进入(客户端连接后通过 tun 访问服务端资源)
sudo iptables -A INPUT -i tun0 -j ACCEPT

# 持久化保存
sudo netfilter-persistent save

运行测试

sudo openvpn myserver.conf

如果一切正常则会输出

Initialization Sequence Completed

客户端配置

安装

在此处下载 https://openvpn.net/community-downloads/ 官方社区版客户端

客户端配置文件

需要从服务器上拷贝 4 个文件,分别是

  1. /opt/EasyRSA-3.2.4/pki/ca.crt:CA 证书文件
  2. /opt/EasyRSA-3.2.4/pki/issued/client.crt:客户端证书文件
  3. /opt/EasyRSA-3.2.4/pki/private/client.key:客户端私钥文件
  4. /opt/openvpn-2.6.15/sample/sample-config-files/client.conf:客户端配置示例文件

修改 client.conf 并保存为 .ovpn 后缀

必须修改的(注意在 Windows 上路径需要使用 \\ 来分割)

  • remote:修改成实际的 IP 地址和端口
  • ca:修改成客户端上保存的 CA 证书文件路径
  • cert:修改成客户端上保存客户端证书文件路径
  • key:修改成客户端上保存客户端私钥文件路径

按需修改

  • port:服务端口
  • proto:使用 udp 协议还是 tcp 协议(对于公网 IPV6 来说,这里要修改成 udp6 或者 tcp6)
  • dev:使用路由模式(tun)还是桥接模式(tap)
  • server:自定义虚拟 IP 地址范围

双击 client.ovpn 文件会自动打开 OpenVPN 客户端并导入连接。

连接成功后,客户端分配到的 IP 应该为 10.8.0.2,此时可以通过 10.8.0.1 来访问服务器上的服务。

进阶

内联证书文件

使用路径引用证书文件可能不太方便,可以采用内联的方式将证书文件内容添加到客户端配置文件中,例如:

<ca>
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----
</key>

支持内联的文件可以参考:https://openvpn.net/community-docs/community-articles/openvpn-2-6-manual.html#inline-file-support-177179

扩展 VPN 范围

如果想访问服务器所处的局域网的其他机器,那么可以扩展 VPN 的范围。比如服务器的局域网 IP 是 192.168.1.1/24,OpenVPN 虚拟 IP 是 10.8.0.1,此时客户端 IP 是 10.8.0.2,客户端想访问 192.168.1.2 的情况。

在服务端的配置文件中加入(告诉客户端有这条路由)

push "route 192.168.1.0 255.255.255.0"

然后让服务器帮忙转发流量

# 检查当前是否启用了 IP 转发
cat /proc/sys/net/ipv4/ip_forward

# 如果返回 1,则不需要以下操作
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-ipforward.conf
sudo sysctl --system

# 设置转发白名单(仅在防火墙启用时需要)

# 允许从局域网网卡(enp2s0)→ VPN(tun0)的流量
sudo iptables -A FORWARD -i enp2s0 -o tun0 -j ACCEPT

# 允许从 VPN(tun0)→ 局域网网卡(enp2s0)的流量
sudo iptables -A FORWARD -i tun0 -o enp2s0 -j ACCEPT

# 设置 NAT,把 VPN 客户端发往局域网的包“伪装成”服务器的本地 IP。
# 否则其他局域网机器不知道 10.8.0.x 的流量应该怎么返回。
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp2s0 -j MASQUERADE

sudo netfilter-persistent save

增强 OpenVPN 安全性

可以启用 tls-crypt-v2 加强 OpenVPN 的安全性。

在服务器上创建 TLS 秘钥

cd /opt/openvpn-2.6.15
openvpn --genkey tls-crypt-v2-server v2crypt-server.key
openvpn --tls-crypt-v2 v2crypt-server.key --genkey tls-crypt-v2-client v2crypt-client-1.key

在服务端配置文件中启用

tls-crypt-v2 v2crypt-server.key

在客户端端配置文件中启用

tls-crypt-v2 v2crypt-client-1.key

或使用内联格式
... ```

开机自启

由于不是通过 apt 方式安装,因此开机自动启动需要手动配置。这里使用 systemd 方案。注意这里需要在编译的时候启用 systemd,如果是跟着上文编译安装的,那么已经启用了。

只需要复制服务端配置文件到 /etc/openvpn/server 目录下(注意证书目录),再启用 service 即可。

sudo mkdir -p /etc/openvpn/server
sudo cp /opt/openvpn-2.6.15/myserver.conf /etc/openvpn/server/
sudo systemctl start openvpn-server@myserver
sudo systemctl enable openvpn-server@myserver

# 检查状态
sudo systemctl status openvpn-server@myserver.service

配置文件参考

服务端

port 1194
proto tcp
dev tun
ca /opt/EasyRSA-3.2.4/pki/ca.crt
cert /opt/EasyRSA-3.2.4/pki/issued/server.crt
key /opt/EasyRSA-3.2.4/pki/private/server.key
dh /opt/EasyRSA-3.2.4/pki/dh.pem
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
topology subnet
server 10.188.188.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
duplicate-cn
keepalive 10 120
tls-crypt-v2 /opt/openvpn-2.6.15/v2crypt-server.key
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3

客户端

client
dev tun
proto tcp
remote 192.168.1.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
...
</ca>
<cert>
...
</cert>
<key>
...
</key>
remote-cert-tls server
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
<tls-crypt-v2>
...
</tls-crypt-v2>
verb 3

运维相关

查看已签发的证书

cd /opt/EasyRSA-3.2.4
cat index.txt

第一列 V 说明证书有效,R 说明证书已吊销。

第二列为过期日期,比如 271229085734Z 即过期时间是 2027-12-29 08:57:34(UTC)

第三列是证书序列号

第四列是客户端名称

查看当前连接的客户端

cat /etc/openvpn/openvpn-status.log

这里可以看到客户端证书名称,客户端的实际连接 IP 和虚拟局域网中的 IP,接收/发送的流量,连接时间以及加密算法等信息。

参考资料

  1. https://community.openvpn.net/openvpn/wiki/HOWTO
  2. https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto
  3. https://community.openvpn.net/openvpn/wiki/IPv6
  4. https://community.openvpn.net/openvpn/wiki/Systemd
  5. https://blog.nineya.com/archives/102.html
  6. https://openwrt.org/zh/docs/guide-user/services/vpn/openvpn/server

本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。