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 missing
或configure: error: openssl check failed
解决办法yum install openssl-devel -y
报错configure: error: route utility is required but missing
解决办法yum install net-tools
生成证书
下载easy-rsa 2https://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.confnet.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.conf
server.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.localiptables -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