搭建openvpn

cat /dev/net/tun

若返回信息为:cat: /dev/net/tun: File descriptor in bad state 说明tun/tap已经可以使用; 如果返回:cat: /dev/net/tun: No such device 或其他则说明tun/tap没有被正确配置,发TK联系客服申请开通tun/tap。

apt-get install openvpn lzop

使用easyrsa3制作证书

下载:https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz

1.vars文件设置:

if [ -z "$EASYRSA_CALLER" ]; then
        echo "You appear to be sourcing an Easy-RSA *vars* file. This is" >&2
        echo "no longer necessary and is disallowed. See the section called" >&2
        echo "*How to use this file* near the top comments for more details." >&2
        return 1
fi
set_var EASYRSA_DN      "cn_only"
set_var EASYRSA_NS_SUPPORT      "yes"
set_var EASYRSA_CERT_EXPIRE    7300
set_var EASYRSA_CA_EXPIRE      14600

2.服务端:

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign server server
./easyrsa gen-dh

3.客户端: 创建client端证书,需要单独把easyrsa3文件夹拷贝出来一份,删除里面的PKI目录,然后进入到此目录

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cp -r EasyRSA-3.1.7 EasyRSA-3.1.7-c1

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cd EasyRSA-3.1.7-c1/

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn/EasyRSA-3.1.7-c1# rm -rf pki/

./easyrsa init-pki
./easyrsa gen-req client nopass
cd ../EasyRSA-3.1.7
./easyrsa import-req ../EasyRSA-3.1.7-c1/pki/reqs/client.req client
./easyrsa sign client client

至此,server和client端证书已制作完毕

openvpn server端需要的是

/etc/openvpn/EasyRSA-3.1.7/pki/ca.crt   <制作server证书的文件夹>

/etc/openvpn/EasyRSA-3.1.7/pki/private/server.key <制作server证书的文件夹>

/etc/openvpn/EasyRSA-3.1.7/pki/issued/server.crt <制作server证书的文件夹>

/etc/openvpn/EasyRSA-3.1.7/pki/dh.pem

openvpn client端需要的是

/etc/openvpn/EasyRSA-3.1.7/pki/ca.crt <制作server证书的文件夹>

/etc/openvpn/EasyRSA-3.1.7/pki/issued/client.crt <制作server证书的文件夹>

/etc/openvpn/EasyRSA-3.1.7-c1/pki/private/client.key <制作client证书的文件夹>

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# mkdir config

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cp EasyRSA-3.1.7/pki/ca.crt config/

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cp EasyRSA-3.1.7/pki/dh.pem config/

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cp EasyRSA-3.1.7/pki/issued/server.crt config/

root@iZ2zeeymlvj6czzwa25q5pZ:/etc/openvpn# cp EasyRSA-3.1.7/pki/private/server.key config/

服务端配置:

root@iZ2zeeymlvj6czzwa25q5pZ:~# useradd -s /sbin/nologin openvpn

root@iZ2zeeymlvj6czzwa25q5pZ:~# mkdir /var/log/openvpn

root@iZ2zeeymlvj6czzwa25q5pZ:~# chown -R openvpn:openvpn /var/log/openvpn

port 28711
proto tcp
dev tun
ca /etc/openvpn/config/ca.crt
cert /etc/openvpn/config/server.crt
key /etc/openvpn/config/server.key
dh /etc/openvpn/config/dh.pem
server 10.17.146.0 255.255.255.0
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 100
user openvpn
group openvpn
ifconfig-pool-persist ipp.txt
status  /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 4
mute 20
client-to-client
duplicate-cn
client-config-dir /etc/openvpn/ccd

ccd里面新建一个client文件

写入:

ifconfig-push 10.17.146.5 10.17.146.6

持久化让使用client证书文件的客户端分配静态IP:10.17.146.5报错: There is a problem in your selection of –ifconfig endpoints [local=10.17.146.7, remote=10.17.146.8]. The local and remote VPN endpoints must exist within the same 255.255.255.252 subnet. This is a limitation of –dev tun when used with the TAP-WIN32 driver. Try ‘openvpn –show-valid-subnets’ option for more info.错误在:10.17.146.7/30是10.17.146.4/30子网的广播地址解决:这个子网可用的ip是10.17.146.5-10.17.146.6

子网掩码在线计算器:子网掩码计算器-在线工具

推送默认网关:

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"

redirect-gateway → 推送默认网关。

def1 → 不会直接覆盖原有默认路由,而是添加两条更精确的 /1 路由,把所有流量引到 VPN。这样客户端原有的网关配置还保留,避免路由表错乱。

bypass-dhcp → 保留客户端本地 DHCP 的访问(防止断网)。

iptables -t nat -A POSTROUTING -s 10.17.146.0/24 -o enp3s0 -j MASQUERADE

默认网关的网卡:ip route |awk ‘/^default/{print $(NF-1)}’

net.ipv4.ip_forward = 1

内嵌证书、key:

<ca>

</ca>

<cert>

</cert>

<key>

</key>

<dh>

</dh>

客户端配置

client
dev tun
proto tcp
remote 210.14.75.1 28711
resolv-retry infinite
nobind
ca /etc/openvpn/config/ca.crt
cert /etc/openvpn/config/client.crt
key /etc/openvpn/config/client.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
compress lz4-v2
persist-key
persist-tun
key-direction 1

内嵌证书、key:

<ca>

</ca>

<cert>

</cert>

<key>

</key>

客户端设置服务自动启动:/lib/systemd/system/openvpn.service

# This service is actually a systemd target,
# but we are using a service since targets cannot be reloaded.




[Unit]
Description=OpenVPN service
After=network.target




[Service]
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/config/client.conf




[Install]
WantedBy=multi-user.target



systemctl enable --now openvpn

服务端设置服务自动启动:/lib/systemd/system/openvpn.service

[Unit]
Description=OpenVPN Server
After=network.target
After=syslog.target




[Install]
WantedBy=multi-user.target




[Service]
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/config/server.conf
ExecStartPost=/usr/sbin/iptables -t nat -A POSTROUTING -s 10.17.146.0/24 -o enp3s0 -j MASQUERADE
ExecStopPost=/usr/sbin/iptables -t nat -D POSTROUTING -s 10.17.146.0/24 -o enp3s0 -j MASQUERADE




systemctl enable --now openvpn

WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless “allow-compression yes” is also set.

这个警告你遇到的是 OpenVPN 2.5+ 版本引入的压缩算法安全提示。

⚠️ 为什么会有这个警告?

  • 旧版本 OpenVPN 常用comp-lzo或comp来压缩数据。
  • 但压缩结合加密,会导致潜在的CRIME/BREACH攻击(攻击者可以利用数据压缩的特性推测密文中的内容)。
  • 所以新版本 OpenVPN默认禁用压缩,如果配置中写了comp-lzo或compress,就会给出这个 WARNING。

解决方法:

不写comp-lzo或compress。


Fri Oct 10 17:10:41 2025 MANAGEMENT: >STATE:1760087441,RESOLVE,,,,,,

Fri Oct 10 17:10:41 2025 TCP/UDP: Preserving recently used remote address: [AF_INET]58.212.110.190:28711

Fri Oct 10 17:10:41 2025 ovpn-dco device [OpenVPN Data Channel Offload] opened

Fri Oct 10 17:11:02 2025 dco connect error: 信号灯超时时间已到   (errno=121)

Fri Oct 10 17:11:02 2025 Closing DCO interface

Fri Oct 10 17:11:02 2025 SIGUSR1[soft,dco-connect-error] received, process restarting

Fri Oct 10 17:11:02 2025 MANAGEMENT: >STATE:1760087462,RECONNECTING,dco-connect-error,,,,,

这个日志表明你的OpenVPN 启用了 DCO(Data Channel Offload)模式,但在连接阶段遇到了驱动层的超时错误 (errno=121, 信号灯超时)

原因: 网络设备或防火墙阻止了隧道初始化

解决方法:systemctl stop firewalld;systemctl disable firewalld

Categories: 系统运维