Linux搭建OpenVPN

官网下载源码包编译安装

编译报错和解决办法

报错
lzo enabled but missing
解决办法

http://www.oberhumer.com/opensource/lzo/download/
下载lzo源码包编译安装,编译参数可以加上--prefix=/usr/local/

报错libpam required but missing
解决办法
yum install pam-devel -y

报错error: ssl is required but missingconfigure: error: openssl check failed
解决办法
yum install openssl-devel -y

报错configure: error: route utility is required but missing
解决办法
yum install net-tools

生成证书

下载easy-rsa 2
https://github.com/OpenVPN/easy-rsa-old
进入到easy-rsa目录
执行

source ./vars
./clean-all

生成CA证书
./build-ca

生成服务端证书
./build-key-server server

生成3个客户端证书

./build-key client1
./build-key client2
./build-key client3

生成Diffie Hellman
./build-dh

CA证书用于客户端认证
client证书用于客户端认证和服务端识别客户端

注意事项

生成client证书需要ca.crt、ca.key、index.txt、serial这几个文件

如需重新生成客户端证书,先清空index.txt的内容

Windows平台生成证书需要在安装过程中勾选安装EasyRSA 2,并且在easy-rsa目录中先执行init-config&vars,剩下的步骤和Linux中相同

Windows系统生成客户端证书时Common Name需手动填写,建议与证书文件名相同

Linux系统创建客户端证书Common Name默认与证书文件名相同

新版EasyRSA 3证书生成
https://github.com/OpenVPN/easy-rsa

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full <SERVER_NAME> nopass
./easyrsa gen-dh

服务端配置(隧道模式TUN)

服务端配置文件部分参数

proto tcp   #使用TCP协议连接
dev tun   #工作模式为隧道模式
server 10.8.0.0 255.255.255.0   #VPN内网IP段和掩码
ifconfig-pool-persist ipp.txt   #用于记录客户端的分配IP并在下次连接时分配相同的IP
client-to-client   #启用此参数允许客户端之间通信
push "dhcp-option DNS 208.67.222.222"   #分配DNS
push "route 192.168.10.0 255.255.255.0"   #配置路由
push "redirect-gateway def1 bypass-dhcp"   #设置网关为默认路由

Windows服务器使用TUN模式需要配置NAT转发

配置客户端静态IP

修改服务端配置文件,启用参数client-config-dir ccd

“ccd”为ccd目录的具体路径,目录需要自行创建

在ccd目录中创建文件,如client1,对应客户端证书Common Name

TUN模式下内容格式为
ifconfig-push 10.8.0.101 10.8.0.102
前面是为客户端分配的IP,后面是为服务端分配的远程端点IP,用于路由转发,无法ping通,不能和前面的相同

每对ifconfig-push地址代表虚拟客户端和服务器IP端点。 它们必须从连续/30个子网中取得,以便与Windows客户端和TAP-Windows驱动程序兼容。 具体来说,每个端点对的IP地址中的最后一个八位字节必须从该集合中取出:

[1,2][5,6][9,10][13,14][17,18]
[21,22][25,26][29,30][33,34][37,38]
[41,42][45,46][49,50][53,54][57,58]
[61,62][65,66][69,70][73,74][77,78]
[81,82][85,86][89,90][93,94][97,98]
[101,102][105,106][109,110][113,114][117,118]
[121,122][125,126][129,130][133,134][137,138]
[141,142][145,146][149,150][153,154][157,158]
[161,162][165,166][169,170][173,174][177,178]
[181,182][185,186][189,190][193,194][197,198]
[201,202][205,206][209,210][213,214][217,218]
[221,222][225,226][229,230][233,234][237,238]
[241,242][245,246][249,250][253,254]

TAP模式下内容格式为
ifconfig-push 10.8.0.101 255.255.255.0
前面是为客户端分配的IP,后面是掩码

Linux添加iptables规则

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

CentOS 7需要安装iptables防火墙
通过yum install iptables-services 安装iptables
然后添加上面的iptables规则

Linux开启IP转发

修改/etc/sysctl.conf
net.ipv4.ip_forward=1设置为“1”开启
sysctl -p应用设置

服务端配置(桥接模式TAP)

服务端配置文件部分参数

proto tcp   #使用TCP协议连接
dev tap   #工作模式为桥接模式
dev-node MyTap   #TAP网络的名称
server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100   #将物理网卡和TAP网卡进行桥接,参数依次是:物理网络IP、物理网络掩码、为客户端分配的起始IP、为客户端分配的结束IP
ifconfig-pool-persist ipp.txt   #用于记录客户端的分配IP并在下次连接时分配相同的IP
client-to-client   #启用此参数允许客户端之间通信

配置客户端静态IP

修改服务端配置文件,启用参数client-config-dir ccd

“ccd”为ccd目录的具体路径,目录需要自行创建

在ccd目录中创建文件,如client1,对应客户端证书client1

client1文件内容
ifconfig-push 10.1.1.200 255.255.255.0
前面是为客户端分配的IP;后面是为网络掩码

配置TAP网络桥接

Linux系统

编辑运行源码包sample/sample-scripts里面的bridge-start、bridge-stop脚本文件,用于配置网络桥接

Windows系统

OpenVPN在安装过程中会自动创建TAP网卡和安装TAP驱动

如果没有TAP虚拟网卡,使用开始菜单-程序-“TAP-Windows”里面的批处理添加TAP网卡

打开网络连接,修改TAP网卡的名称为英文格式,例如把“本地连接 2”修改为“my-tap”,同时要修改服务端配置文件的参数dev-node以保持一致

然后选中物理网卡和TAP网卡,建立桥接。桥接建立后给桥接网卡配置IP地址等信息确保服务器网络畅通

启动服务端

openvpn server.confserver.conf为服务端配置文件

备注

TAP模式不支持移动客户端连接

配置客户端时,可在配置文件内加上

<ca>
</ca>
<cert>
</cert>
<key>
</key>

并在中间插入对应的文件内容,替代配置证书文件路径

Debian编译安装报错汇总

报错“checking additionally if OpenSSL is available and version >= 1.0.2... configure: error: OpenSSL version too old”
解决方法
apt install libssl-dev liblzo2-dev libpam0g-dev

报错“error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config installed? Must be version 3.4.0 or newer for DCO”
解决方法
apt-get install libnl-3-dev libnl-genl-3-dev

报错“configure: error: libcap-ng package not found. Is the development package and pkg-config installed?”
解决方法
apt install libcap-ng-dev

报错“configure: error: No compatible LZ4 compression library found. Consider --disable-lz4”
解决方法
./configure --disable-lz4

报错“configure: error: pkg-config is required”
解决办法
apt install pkg-config

报错libpam required but missing
解决办法
apt install libpam-dev

Debian10安装iptables并且配置规则
安装iptables

apt-get install iptables

执行iptables规则并写入/etc/rc.local
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

CentOS 7 OpenSSL版本升级
新版OpenVPN编译会提示OpenSSL版本过低或者“openssl check failed”,需要卸载当前版本并安装更高版本的OpenSSL

yum remove openssl openssl-devel -y
https://www.openssl.org/source/old/1.1.1/openssl-1.1.1l.tar.gz
tar zxvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
./config --prefix=/usr/local/ssl
make && make install
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl  
ln -s /usr/local/ssl/include/openssl /usr/include/openssl  
echo "/usr/local/ssl/lib">>/etc/ld.so.conf  
ldconfig -v  
openssl version -a

客户端连接报错“OpenSSL: error:0A00018E:SSL routines::ca md too weak”
在客户端配置文件中增加
tls-cipher "DEFAULT:@SECLEVEL=0"

参考:
https://community.openvpn.net/openvpn/wiki/BridgingAndRouting
https://community.openvpn.net/openvpn/wiki/BridgingOverview
https://superuser.com/questions/1737052/openssl-error0a00018essl-routinesca-md-too-weak