OpenVPN服务端安装

vpn软件下载

https://github.com/OpenVPN/openvpn/releases/download/v2.6.14/openvpn-2.6.14.tar.gz
https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.4/EasyRSA-3.2.4.tgz

https://file.cncfstack.com/github.com/OpenVPN/easy-rsa/releases/download/v3.2.4/EasyRSA-3.2.4.tgz
https://file.cncfstack.com/github.com/OpenVPN/openvpn/releases/download/v2.6.14/openvpn-2.6.14.tar.gz

依赖软件包安装

yum install -y openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig  autoconf libtool  libnl3-devel  libcap-ng-devel pkg-config  lz4-devel lz4-libs

编译安装openVPN

tar xf openvpn-2.6.14.tar.gz && cd openvpn-2.4.6
autoreconf -i -v -f
./configure --prefix=/usr/local/openvpn/
make
make install

初始化准备

mkdir -p /usr/local/openvpn/etc/pki
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

安装EasyRSA

tar xf EasyRSA-3.2.4.tgz -C /usr/local/openvpn

创建vars变量文件

cd /usr/local/openvpn/EasyRSA-*

cat > vars <<EOF
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "ZheJiang"
set_var EASYRSA_REQ_CITY "HangZhou"
set_var EASYRSA_REQ_ORG "OpenVPN CA"
set_var EASYRSA_REQ_EMAIL "zhaowenyu@cncfstack.com"
set_var EASYRSA_REQ_OU "MyVPN"
EOF

初始化证书目录

./easyrsa init-pki

创建ca证书

在创建CA证书,为防止私钥丢失后非法获取私钥内容,pass phrase需要输入2次私钥加密的密码。在使用CA签发证书时,需要使用ca证书加密密码。

Common Name 是证书的根域名,不过一般不会使用到,可以填写任意字符串内容

./easyrsa build-ca

创建服务的证书

服务端证书是指运行在openVPN 服务的机器上需要的证书。同理还会有客户端证书,他是客户端例如Windows使用的。openVPN使用的双向证书认证。

Common Name 是证书认证的域名或者IP地址或者主机名,可以使用回车即可

./easyrsa gen-req cyg-prod nopass

签发服务端证书

签发服务端证书

[root@myhost EasyRSA-3.0.4]# ./easyrsa sign server cyg-prod
  • 签发证书时需要输入确认信息“yes”
  • 同时签发会使用到CA证书,因此要输出创建CA时的密码

创建Diffie-Hellman

确保key穿越不安全网络的命令:

[root@myhost EasyRSA-3.0.4]# ./easyrsa gen-dh

创建客户端证书

创建客户端证书时需要输入密码,这个密码是后面客户端连接服务页面上调填写的

Common Name是后面登录时需要输入的用户名????

[root@myhost EasyRSA-3.0.4]# ./easyrsa gen-req aliyun2 nopass

CA签发证书

[root@myhost EasyRSA-3.0.4]# ./easyrsa sign client aliyun2

ta.key 防止Dos攻击

如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;

/usr/local/openvpn/sbin/openvpn --genkey --secret pki/ta.key

准备文件

服务端文件

cp pki/ca.crt /usr/local/openvpn/etc/pki/
cp pki/private/cyg-prod.key /usr/local/openvpn/etc/pki/
cp pki/issued/cyg-prod.crt /usr/local/openvpn/etc/pki/
cp pki/dh.pem /usr/local/openvpn/etc/pki/
cp pki/ta.key /usr/local/openvpn/etc/pki/

客户端文件

mkdir /usr/local/openvpn/client-aliyun2

cp pki/ca.crt /usr/local/openvpn/client-aliyun2/
cp pki/issued/aliyun2.crt /usr/local/openvpn/client-aliyun2/
cp pki/private/aliyun2.key /usr/local/openvpn/client-aliyun2/
cp pki/ta.key /usr/local/openvpn/client-aliyun2/

cd /usr/local/openvpn/client-aliyun2/
tar czvf client-aliyun2.tar.gz  .

编辑服务端配置文件

cat /usr/local/openvpn/etc/server.conf

#指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
#local 192.168.1.123 
port 1194
#指定采用的传输协议,可以选择tcp或udp
proto udp
#指定创建的通信隧道类型,可选tun或tap,前者工作在三层(TCP/IP),后者工作2层(链路层)
dev tun
ca /usr/local/openvpn/etc/pki/ca.crt
cert /usr/local/openvpn/etc/pki/wenyu-server.crt
key /usr/local/openvpn/etc/pki/wenyu-server.key
dh /usr/local/openvpn/etc/pki/dh.pem
#指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。
server 10.8.0.0 255.255.255.0
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt
#如果启用,该命令将配置所有客户端通过×××重定向其默认网络网关,导致所有IP流量(如Web浏览和#和DNS查找)通过×××
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 223.4.4.4"
#push "dhcp-option DNS 223.5.5.5"
#每10秒ping一次,连接超时时间设为120秒。
keepalive 10 120
#开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /usr/local/openvpn/etc/pki/ta.key 0 # 服务端为0,客户端为1
cipher AES-256-CBC
#开启×××连接压缩,如果服务器端开启,客户端也必须开启
comp-lzo
max-clients 100
persist-key
#持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
persist-tun
status openvpn-status.log
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#服务端重启,客户端自动重连
explicit-exit-notify 2
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
#client-to-client 

启动服务

/usr/local/openvpn/sbin/openvpn /usr/local/openvpn/etc/server.conf &

客户端配置

按照上述的步骤安装软件

mkdir -p /usr/local/openvpn/etc/pki

将客户端证书的 tgz 复制到该目录

cat > /usr/local/openvpn/etc/client.conf «EOF client #必须与服务器端的保持一致 dev tun #proto 协议类型必须与服务器端的保持一致 proto udp #指定连接的远程服务器的实际IP地址和端口号 remote 192.168.255.12 1194 #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电>脑无线网络)非常有用。 resolv-retry infinite #不绑定特定的本地端口号 nobind persist-key persist-tun ca ca.crt cert client.crt key client.key remote-cert-tls server #如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开 启;如果未设置,则注释掉这一行,同服务端一致。 tls-auth ta.key 1 cipher AES-256-CBC #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 verb 3 #启用压缩,与服务器保持一致 comp-lzo

#auth-user-pass #auth-retry interact #reneg-sec 0 EOF

/usr/local/openvpn/sbin/openvpn /usr/local/openvpn/etc/client.conf &

FAQ*

Authenticate/Decrypt packet error: cipher final failed

编辑server.conf 配置文件

注释:cipher AES-256-CBC

Authenticate/Decrypt packet error: packet HMAC authentication failed

TLS Error: incoming packet authentication failed

TLS Error: cannot locate HMAC in incoming packet from [AF_INET]192.168.1.123:1194

注:这三个错误都源于这个tls-auth 认证问题,只需要服务端和客户端关闭此功能即可解决:在此行加上; 分号。如果需要开启可以关闭后再尝试开启

Can’t exec “libtoolize”

这个错误通常是因为系统缺少编译OpenVPN所需的GNU Libtool

错误日志

autoreconf: running: libtoolize --copy --force
Can't exec "libtoolize": 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 345, <GEN3> line 5.
autoreconf: failed to run libtoolize: No such file or directory
autoreconf: libtoolize is needed because this package uses Libtool

Debian/Ubuntu系统:

sudo apt-get update
sudo apt-get install libtool automake autoconf

RHEL/CentOS系统:

# 对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install libtool
# 对于较旧版本(CentOS 7/RHEL 7以下)
sudo yum install libtool

Fedora系统:

sudo dnf install libtool

Arch Linux系统:

sudo pacman -S libtool

验证安装和完成配置

安装完成后,可以验证libtoolize是否可用:

which libtoolize
libtoolize --version

libnl-genl-3.0 package not found or too old

错误日志

configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed? Must be version 3.4.0 or newer for DCO

这个报错意味着编译系统无法找到足够新版本(需要3.4.0或更新)的libnl-genl-3.0开发包。

libnl是Linux上处理netlink套接字的库,而libnl-genl提供了通用netlink接口的支持。DCO功能依赖这些库。

Debian/Ubuntu 系统:

sudo apt-get update
sudo apt-get install libnl-3-dev libnl-genl-3-dev libnl-route-3-dev pkg-config

RHEL/CentOS/Fedora 系统:

# 对于RHEL/CentOS
sudo yum install libnl3-devel pkgconfig
# 或者使用dnf(新版本)
sudo dnf install libnl3-devel pkg-config
# 对于Fedora
sudo dnf install libnl3-devel pkg-config

Arch Linux 系统:

sudo pacman -S libnl pkg-config

检查pkg-config信息:通过以下命令检查libnl-genl-3.0的版本和编译信息。

pkg-config --modversion libnl-genl-3.0
pkg-config --cflags --libs libnl-genl-3.0

请确保输出的版本号不低于3.4.0。

libcap-ng package not found

错误日志

configure: error: libcap-ng package not found. Is the development package and pkg-config (/usr/bin/pkg-config) installed?

Debian/Ubuntu系统:

sudo apt-get update
sudo apt-get install libcap-ng-dev pkg-config

RHEL/CentOS系统:

# 对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install libcap-ng-devel pkgconfig
# 对于较旧版本(CentOS 7/RHEL 7以下)  
sudo yum install libcap-ng-devel pkg-config

Fedora系统:

sudo dnf install libcap-ng-devel pkg-config

Arch Linux系统:

sudo pacman -S libcap-ng pkg-config
  • 验证安装

安装完成后,建议验证libcap-ng是否正确安装:

检查pkg-config信息:

pkg-config --modversion libcap-ng
pkg-config --cflags --libs libcap-ng

libevent package not found

错误日志

configure: error: No compatible LZ4 compression library found. Consider --disable-lz4

查询系统是否有 lz4 库:

# find /usr -name '*lz4*' 2>/dev/null
/usr/share/mime/application/x-lz4.xml
/usr/share/mime/application/x-lz4-compressed-tar.xml
/usr/share/bash-completion/completions/lz4
/usr/share/bash-completion/completions/lz4c
/usr/share/doc/lz4-libs
/usr/lib/modules/5.10.134-18.al8.x86_64/kernel/lib/lz4
/usr/lib/modules/5.10.134-18.al8.x86_64/kernel/lib/lz4/lz4hc_compress.ko
/usr/lib/modules/5.10.134-18.al8.x86_64/kernel/lib/lz4/lz4_compress.ko
/usr/lib/modules/5.10.134-18.al8.x86_64/kernel/crypto/lz4hc.ko
/usr/lib/modules/5.10.134-18.al8.x86_64/kernel/crypto/lz4.ko
/usr/src/kernels/5.10.134-18.al8.x86_64/lib/lz4
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/lz4
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/rd/lz4.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/decompress/lz4.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/have/kernel/lz4.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/crypto/lz4.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/crypto/lz4hc.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/config/lz4hc
/usr/src/kernels/5.10.134-18.al8.x86_64/include/linux/decompress/unlz4.h
/usr/src/kernels/5.10.134-18.al8.x86_64/include/linux/lz4.h
/usr/lib64/liblz4.so.1
/usr/lib64/liblz4.so.1.9.4
/usr/local/sysak/.sysak_components/tools/dist/app/common/lz4.lua

从查询结果来看,系统里已经安装了LZ4的运行时库(在/usr/lib64/liblz4.so.1等位置)和内核头文件,但缺少开发文件(比如lz4.h头文件和liblz4.so链接库),这通常是导致configure脚本报错的原因。

安装LZ4开发包

根据你的系统,安装对应的开发包:

Debian/Ubuntu	
sudo apt-get install liblz4-dev

RHEL/CentOS	
sudo yum install liblz4-devel 
或 sudo dnf install liblz4-devel

Aliyun Linux
yum install lz4-devel lz4-libs

Fedora	
sudo dnf install liblz4-devel

Arch Linux	
sudo pacman -S liblz4

验证安装

安装后,可以再次运行 find /usr -name '*lz4*' 2>/dev/null,确认现在能找到 /usr/include/lz4.h 和类似 /usr/lib64/liblz4.so 这样的开发文件。

配置参数

之后,通常直接运行 ./configure 即可,脚本应该能自动找到LZ4库。如果仍有问题,可以尝试手动指定:

./configure LZ4_CFLAGS="-I/usr/include" LZ4_LIBS="-L/usr/lib64 -llz4"

备选方案

如果确实找不到合适的开发包,或者需要特定版本的LZ4,可以考虑从源码编译LZ4。

lzo package not found

错误日志

configure: error: lzo enabled but missing

编译过程中遇到 configure: error: lzo enabled but missing 报错,意味着编译配置脚本找不到LZO压缩库必要的文件。

Debian/Ubuntu
sudo apt-get install liblzo2-dev 

RHEL/CentOS	
sudo yum install lzo-devel  
或 sudo dnf install lzo-devel

Fedora	
sudo dnf install lzo-devel

Arch Linux	
sudo pacman -S lzo