使用 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 个关键文件,分别是
- /opt/EasyRSA-3.2.4/pki/ca.crt:CA 证书文件
- /opt/EasyRSA-3.2.4/pki/dh.pem:Diffie-Hellman 参数文件
- /opt/EasyRSA-3.2.4/pki/issued/server.crt:服务端证书文件
- /opt/EasyRSA-3.2.4/pki/private/server.key:服务端私钥文件
- /opt/EasyRSA-3.2.4/pki/issued/client.crt:客户端证书文件
- /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 个文件,分别是
- /opt/EasyRSA-3.2.4/pki/ca.crt:CA 证书文件
- /opt/EasyRSA-3.2.4/pki/issued/client.crt:客户端证书文件
- /opt/EasyRSA-3.2.4/pki/private/client.key:客户端私钥文件
- /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,接收/发送的流量,连接时间以及加密算法等信息。
参考资料
- https://community.openvpn.net/openvpn/wiki/HOWTO
- https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto
- https://community.openvpn.net/openvpn/wiki/IPv6
- https://community.openvpn.net/openvpn/wiki/Systemd
- https://blog.nineya.com/archives/102.html
- https://openwrt.org/zh/docs/guide-user/services/vpn/openvpn/server
本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。