yum install openvpn easy-rsa openssl-devel
mkdir -p /etc/openvpn/easy-rsa/
cp -p /usr/share/doc/easy-rsa-3.0.3/vars.example /etc/openvpn/easy-rsa/vars
cp -r /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/
cp /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn/
vim /etc/openvpn/easy-rsa/vars
编辑vars文件:
set_var EASYRSA_REQ_COUNTRY "xxx" #国家
set_var EASYRSA_REQ_PROVINCE "xxx" #地区
set_var EASYRSA_REQ_CITY "xxx" #城市
set_var EASYRSA_REQ_ORG "xxx" #组织
set_var EASYRSA_REQ_EMAIL "xxx" #邮箱
set_var EASYRSA_REQ_OU "xxx" 拥有者
创建服务器端证书和key
cd /etc/openvpn/easy-rsa/
目录初始化,建立一个空的pki结构,生成一系列的文件和目录
./easyrsa init-pki
创建根证书,创建ca密码 和 cn那么需要记住,commonname单独定义个名字server
./easyrsa build-ca
xxx xxx server
创建服务器端证书,输入commonname单独定义不要与ca一样server-uv
./easyrsa gen-req server nopass
签约服务端证书,输入ca的密码创建服务端秘钥,输入yes同意创建
./easyrsa sign server server
创建Diffie-Hellman,确保key穿越不安全网络的命令
./easyrsa gen-dh
生成ta密钥文件(可以不需要创建),需要注释server.conf中tls-auth ta.key 0
openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key
创建客户端证书及key
创建过程同服务端
mkdir /root/client
cd /root/client
cp -r /usr/share/easy-rsa/3.0.3/* ./
./easyrsa init-pki
#客户端不需要创建根证书,注释
#./easyrsa build-ca
orangleliu 用自己的名字,需要创建一个密码 和 cn name,自己用的 需要记住
./easyrsa gen-req orangleliu
xxxx xxxx client
现在客户端的证书要跟服务端的交互,也就是签约,这样这个用户才能使用此vpn
切换到server证书目录下
cd /etc/openvpn/easy-rsa/
将得到的orangleliu.req导入然后签约证书
./easyrsa import-req /root/client/pki/reqs/orangleliu.req orangleliu
用户签约,根据提示输入服务端的ca密码
./easyrsa sign client orangleliu
/etc/openvpn/easy-rsa
[root@localhost easy-rsa]# cp pki/ca.crt /etc/openvpn/
[root@localhost easy-rsa]# cp pki/private/server.key /etc/openvpn/
[root@localhost easy-rsa]# cp pki/issued/server.crt /etc/openvpn/
[root@localhost easy-rsa]# cp pki/dh.pem /etc/openvpn/
[root@localhost easy-rsa]# cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/ #可以不需要ta.key
/root/client
[root@localhost client]# cp /etc/openvpn/easy-rsa/pki/ca.crt /root/client/ #客户端复制的是服务端生成的ca证书
[root@localhost client]# cp pki/issued/orangleliu.crt /root/client/
[root@localhost client]# cp /root/client/pki/private/orangleliu.key /root/client/
[root@localhost client]# cp /etc/openvpn/easy-rsa/ta.key /root/client/ #可以不需要ta.key
vim /etc/openvpn/server.conf
85行:改为 85 dh dh.pem
改tls-auth ta.key 0前加;注释
systemctl -f enable openvpn@server.service 开机启动
systemctl start openvpn@server.service 开启服务
iptables -A INPUT -p udp --destination-port 1194 -j ACCEPT 端口转发
把/root/client/下的ca.crt,client.crt,client.key,放在安装目录下的config目录里即可;
client.ovpn配置文件内容:
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
comp-lzo
补充一点这样客户端每次登陆会提示输入key的密码很烦人。key使用openssl剥离key的密码
openssl rsa -in client.key -out nopass-client.key
这样nopass-client.key复制到客户端就key免密码登陆了。
下面给个进阶模式,免key登录
vim /etc/openvpn/server.conf
#########auth password########
script-security 3 ###--加入脚本处理,如用密码验证
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env ###指定只用的认证脚本
client-cert-not-required #####不请求客户的CA证书,使用User/Pass验证,如果同时启用证书和密码认证,注释掉该行
username-as-common-name ### 使用客户提供的UserName作为Common Name
############################
2、按照配置文件中的脚本路径放置checkpsw.sh
cat checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
3、赋予该脚本执行权限
chmod +x checkpsw.sh
4、准备用户名和密码认证文件,用户名和密码用空格隔开,同时确保openvpn启动用户可读取该文件
cat psw-file
client01 123456
client02 123456789
二、修改客户端的配置文件,添加下面一行
auth-user-pass
1 #ifconfig-push中的每一对IP地址表示虚拟客户端和服务器的IP端点 2 #它们必须从连续的/30子网网段中获取(这里是/30表示xxx.xxx.xxx.xxx/30,即子网掩码位数为30) 3 #以便于与Windows客户端和TAP-Windows驱动兼容。明确地说,每个端点的IP地址对的最后8位字节必须取自下面的集合: 4 5 [ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] 6 [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38] 7 [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] 8 [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78] 9 [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]10 [101,102] [105,106] [109,110] [113,114] [117,118]11 [121,122] [125,126] [129,130] [133,134] [137,138]12 [141,142] [145,146] [149,150] [153,154] [157,158]13 [161,162] [165,166] [169,170] [173,174] [177,178]14 [181,182] [185,186] [189,190] [193,194] [197,198]15 [201,202] [205,206] [209,210] [213,214] [217,218]16 [221,222] [225,226] [229,230] [233,234] [237,238]17 [241,242] [245,246] [249,250] [253,254]
1 ################################################# 2 # 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例 3 # 4 # 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置 5 # 6 # OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面) 7 # 8 # 该配置支持Windows或者Linux/BSD系统。此外,在Windows上,记得将路径加上双引号, 9 # 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key" 10 # 11 # '#' or ';'开头的均为注释内容 12 ################################################# 13 14 #OpenVPN应该监听本机的哪些IP地址? 15 #该命令是可选的,如果不设置,则默认监听本机的所有IP地址。 16 ;local a.b.c.d 17 18 # OpenVPN应该监听哪个TCP/UDP端口? 19 # 如果你想在同一台计算机上运行多个OpenVPN实例,你可以使用不同的端口号来区分它们。 20 # 此外,你需要在防火墙上开放这些端口。 21 port 1194 22 23 #OpenVPN使用TCP还是UDP协议? 24 ;proto tcp 25 proto udp 26 27 # 指定OpenVPN创建的通信隧道类型。 28 # "dev tun"将会创建一个路由IP隧道, 29 # "dev tap"将会创建一个以太网隧道。 30 # 31 # 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0" 32 # 33 # 如果你想控制VPN的访问策略,你必须为TUN/TAP接口创建防火墙规则。 34 # 35 # 在非Windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"。 36 # 在Windows中,你也可以使用"dev-node"。 37 # 在多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。 38 ;dev tap 39 dev tun 40 41 # 如果你想配置多个隧道,你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。 42 # 在XP SP2或更高版本的系统中,你可能需要有选择地禁用掉针对TAP适配器的防火墙 43 # 通常情况下,非Windows系统则不需要该指令。 44 ;dev-node MyTap 45 46 # 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。 47 # 每个客户端和服务器端都需要它们各自的证书和私钥文件。 48 # 服务器端和所有的客户端都将使用相同的CA证书文件。 49 # 50 # 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。 51 # 记住,服务器端和每个客户端的证书必须使用唯一的Common Name。 52 # 53 # 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。 54 # OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令) 55 ca ca.crt 56 cert server.crt 57 key server.key # 该文件应该保密 58 59 # 指定迪菲·赫尔曼参数。 60 # 你可以使用如下名称命令生成你的参数: 61 # openssl dhparam -out dh1024.pem 1024 62 # 如果你使用的是2048位密钥,使用2048替换其中的1024。 63 dh dh1024.pem 64 65 # 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。 66 # 在此处的示例中,服务器端自身将占用10.8.0.1,其他的将提供客户端使用。 67 # 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。 68 server 10.8.0.0 255.255.255.0 69 70 # 指定用于记录客户端和虚拟IP地址的关联关系的文件。 71 # 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址 72 ifconfig-pool-persist ipp.txt 73 74 # 该指令仅针对以太网桥接模式。 75 # 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。 76 # 然后,你需要手动设置桥接接口的IP地址、子网掩码; 77 # 在这里,我们假设为10.8.0.4和255.255.255.0。 78 # 最后,我们必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端。 79 # 如果你不是以太网桥接模式,直接注释掉这行指令即可。 80 ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 81 82 # 该指令仅针对使用DHCP代理的以太网桥接模式, 83 # 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。 84 # 85 # 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。 86 # 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。 87 ;server-bridge 88 89 # 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。 90 # (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网) 91 # 记住,这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。 92 ;push "route 192.168.10.0 255.255.255.0" 93 ;push "route 192.168.20.0 255.255.255.0" 94 95 # 为指定的客户端分配指定的IP地址,或者客户端背后也有一个私有子网想要访问VPN, 96 # 那么你可以针对该客户端的配置文件使用ccd子目录。 97 # (简而言之,就是允许客户端所在的局域网成员也能够访问VPN) 98 99 # 举个例子:假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN,100 # 该子网为192.168.40.128/255.255.255.248。101 # 首先,你需要去掉下面两行指令的注释:102 ;client-config-dir ccd103 ;route 192.168.40.128 255.255.255.248104 # 然后创建一个文件ccd/Thelonious,该文件的内容为:105 # iroute 192.168.40.128 255.255.255.248106 #这样客户端所在的局域网就可以访问VPN了。107 # 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。108 # 比如,你使用了"dev tun"和"server"指令。109 110 # 再举个例子:假设你想给Thelonious分配一个固定的IP地址10.9.0.1。111 # 首先,你需要去掉下面两行指令的注释:112 ;client-config-dir ccd113 ;route 10.9.0.0 255.255.255.252114 # 然后在文件ccd/Thelonious中添加如下指令:115 # ifconfig-push 10.9.0.1 10.9.0.2116 117 # 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:118 # (1)运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则。119 # (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。120 # 关于learn-address脚本的更多信息请参考官方手册页面。121 ;learn-address ./script122 123 # 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。124 # (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)125 ;push "redirect-gateway def1 bypass-dhcp"126 127 # 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。128 # 下列地址来自opendns.com提供的Public DNS 服务器。129 ;push "dhcp-option DNS 208.67.222.222"130 ;push "dhcp-option DNS 208.67.220.220"131 132 # 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。133 # 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器,134 # 你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。135 ;client-to-client136 137 # 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么你可以取消该指令的注释。138 # 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。139 # 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。140 ;duplicate-cn141 142 # keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。143 # 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。144 keepalive 10 120145 146 # 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。147 # 你可以使用以下命令来生成:148 # openvpn --genkey --secret ta.key149 #150 # 服务器和每个客户端都需要拥有该密钥的一个拷贝。151 # 第二个参数在服务器端应该为'0',在客户端应该为'1'。152 ;tls-auth ta.key 0 # 该文件应该保密153 154 # 选择一个密码加密算法。155 # 该配置项也必须复制到每个客户端配置文件中。156 ;cipher BF-CBC # Blowfish (默认)157 ;cipher AES-128-CBC # AES158 ;cipher DES-EDE3-CBC # Triple-DES159 160 # 在VPN连接上启用压缩。161 # 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。162 comp-lzo163 164 # 允许并发连接的客户端的最大数量165 ;max-clients 100166 167 # 在完成初始化工作之后,降低OpenVPN守护进程的权限是个不错的主意。168 # 该指令仅限于非Windows系统中使用。169 ;user nobody170 ;group nobody171 172 # 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。173 persist-key174 persist-tun175 176 # 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。177 status openvpn-status.log178 179 # 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)。180 # 你可以使用log或者log-append来改变这种默认情况。181 # "log"方式在每次启动时都会清空之前的日志文件。182 # "log-append"这是在之前的日志内容后进行追加。183 # 你可以使用两种方式之一(但不要同时使用)。184 ;log openvpn.log185 ;log-append openvpn.log186 187 # 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。188 #189 # 0 表示静默运行,只记录致命错误。190 # 4 表示合理的常规用法。191 # 5 和 6 可以帮助调试连接错误。192 # 9 表示极度冗余,输出非常详细的日志信息。193 verb 3194 195 # 重复信息的沉默度。196 # 相同类别的信息只有前20条会输出到日志文件中。197 ;mute 20198 199 client-config-dir ccd #每个账号的单独配置目录200 201 script-security 3 #使用脚本验证账号密码时必须加此项202 203 auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #开启账号密码验证脚本204 205 client-cert-not-required #加上这行表示禁用客户端证书,如果不加的话表示证书和账号密码双重认证206 207 username-as-common-name #将用户名作为Common Name
联系客服