目录
Centos7搭建OpenVPN
如果不想看此方式:可以使用快速搭建方式执行见:(https://www.topunix.com/post-10442.html)
一、服务端配置
1、搭建流程图
2、安装epel扩展包、openvpn 、easy-rsa、iptables-server
yum install epel-* -y yum -y install openvpn easy-rsa iptables-services centos7.9会自动安装3.0.8版本的openvpn
3、生成证书及相关文件
利用easy-rsa生成相关证书文件
- CA根证书
- openvpn服务器证书
- Diffie-Hellman算法用到的key
(1)复制easy-rsa脚本到/etc/openvpn下面,该脚本是用来生成CA证书和各种key文件
[root@ ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/
(2)查看证书版本号进入相关目录{随着后期更新,可能版本会有变化},创建文件并设置变量
[root@localhost ~]# yum info easy-rsa
[root@openvpnservice ~]# cd /etc/openvpn/easy-rsa/3.0.8/ [root@openvpnservice 3.0.8]# touch vars [root@openvpnservice 3.0.8]# vim vars export KEY_COUNTRY="CN" #(国家名称) export KEY_PROVINCE="ShangHai" #(省份名称) export KEY_CITY="ShangHai" #(城市名称) export KEY_ORG="YCZB" #(组织机构名称) export KEY_EMAIL="284833194@qq.com" #(邮件地址)
(3)#变量生效
[root@openvpnservice 3.0.8]# source ./vars
(4)生成CA根证书
./easyrsa init-pki #初始化 pki 相关目录
./easyrsa build-ca nopass #生成 CA 根证书,命令完成后: 输入 Common Name,名字随便起。
注意:在上述部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。还需要输入common name 通用名,这个你自己随便设置个独一无二的。
我设置通用名字:openvpn
(5)生成openvpn服务器证书和密钥,第一个参数是证书名称
[root@localhost 3.0.8]#./easyrsa build-server-full server nopass
(6)生成Diffie-Hellman算法需要的密钥文件
[root@localhost 3.0.8]# ./easyrsa gen-dh #创建Diffie-Hellman,时间比较久一些
(7)生成tls-auth key,为了防止DDOS和TLS攻击,这个属于可选安全配置
[root@localhost 3.0.8]# openvpn --genkey --secret ta.key
(8)openvpn文件整理
[root@localhost 3.0.8]#mkdir /etc/openvpn/server/certs [root@localhost 3.0.8]#cd /etc/openvpn/server/certs/
# SSL 协商时 Diffie-Hellman 算法需要的 key
[root@localhost certs]#cp /etc/openvpn/easy-rsa/3/pki/dh.pem ./
# CA 根证书
[root@localhost certs]#cp /etc/openvpn/easy-rsa/3/pki/ca.crt ./
# open VPN 服务器证书
[root@localhost certs]#cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt ./server.crt
# open VPN 服务器证书 key
[root@localhost certs]#cp /etc/openvpn/easy-rsa/3/pki/private/server.key ./server.key
# tls-auth key
[root@localhost certs]#cp /etc/openvpn/easy-rsa/3/ta.key ./
(9)创建openvpn日志目录
#创建日志目录
[root@openvpnservice certs]# mkdir -p /var/log/openvpn/
#给予权限
[root@openvpnservice certs]# chown openvpn:openvpn /var/log/openvpn
#创建ccd
mkdir /etc/openvpn/ccd
4、配置OpenVPN Server端配置文件
(1)创建配置文件
原配置文件在 /usr/share/doc/openvpn-/sample/sample-config-files
(2)写入配置参数
[root@openvpnservice openvpn]# vi /etc/openvpn/server.conf 模板(见连接文件)生产系统使用配置文件
port 1194 # 监听的端口号 proto udp # 服务端用的协议,udp 能快点,所以选择udp,在做端口映射的时候,一定要选择udp模式。 dev tun ca /etc/openvpn/server/certs/ca.crt # CA 根证书路径 cert /etc/openvpn/server/certs/server.crt # open VPN 服务器证书路径 key /etc/openvpn/server/certs/server.key # open VPN 服务器密钥路径,This file should be kept secret dh /etc/openvpn/server/certs/dh.pem # Diffie-Hellman 算法密钥文件路径 tls-auth /etc/openvpn/server/certs/ta.key 0 # tls-auth key,参数 0 可以省略,如果不省略,那么客户端配置相应的参数该配成 1。如果省略,那么客户端不需要 tls-auth 配置 server 10.8.0.0 255.255.240.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24;当前设置为10.8.0.0/20,则代表可以使用20位掩码的地址。 push "dhcp-option DNS 8.8.8.8" # DNS 服务器配置1,可以根据需要指定其他dns push "dhcp-option DNS 8.8.4.4" # DNS 服务器配置2 #push "redirect-gateway def1" push "route 172.18.1.0 255.255.255.0" #这里填写需要vpn可以访问的内部网段。 #下面两个配合(第一个访问外网通过本地网卡,第二个访问内部服务器通过vpn放通) #情况1: #第一个(push "redirect-gateway def1")如果注释掉,所有的流量都不主动通过openvpn转发(), #客户端可以直接访问直接访问公网(走的还是客户单本地的路由网络), #客户端无法直接访问内网资源,需要单独加vpn客户端段到需要访问网段的路由(push "route 172.18.1.0 255.255.255.0") #push "redirect-gateway def1" # 客户端所有流量都通过 open VPN 转发,类似于代理开全局;正常情况下这个语句需要注释掉,不让上网流量通过vpn转发 #push "route 172.18.1.0 255.255.255.0" #加上此语句,才能让vpn客户端访问172.18.1.0段 #情况2: #第一个(push "redirect-gateway def1")如果不进行注释,客户端所有流量都通过open VPN转发,如果要客户端访问公网网络,需要将分配的VPN段,于防火墙上进行配置,使其可以访问公网 #此处不需要再进行路由的设置 # compress lzo duplicate-cn # 允许一个用户多个终端连接,同时IP地址会自动向后划分,比如第一个用户是10.8.0.6,第二个用户就是10.8.0.10;第三个用户就是10.8.0.14;如果注释掉则只能一个用户使用,如果后者登录,则前者会被挤掉 keepalive 10 120 client-config-dir /etc/openvpn/ccd # 根据ccd目录下的用户分配的IP进行ip地址分配,如果没有设置此参数,则所有用户的ip地址都从10.8.0.0/20段开始自动分配(无法管控用户的ip地址) comp-lzo persist-key persist-tun auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env # use username and password login username-as-common-name script-security 3 user openvpn # open VPN 进程启动用户,openvpn 用户在安装完 openvpn 后就自动生成了 group openvpn #client-cert-not-required #不请求客户的CA证书,使用User/Pass验证,如果同时启用证书和密码认证,注释掉该行 #指定 log 文件位置 log /var/log/openvpn/server.log log-append /var/log/openvpn/server.log status /var/log/openvpn/status.log verb 3 explicit-exit-notify 1
5、配置文件中需要的密码文件
(1)配置密码文件
vi /etc/openvpn/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
(2)授权为可执行
chmod +x /etc/openvpn/checkpsw.sh
6、配置防火墙及安全服务
(1)禁用firewalld,启用iptables
[root@openvpnservice openvpn]# systemctl stop firewalld [root@openvpnservice openvpn]# systemctl disable firewalld
(2)关闭selinux
[root@openvpnservice openvpn]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux [root@openvpnservice openvpn]# setenforce 0
(3)启用iptables(用于控制openvpn用户对资源的访问)
[root@openvpnservice openvpn]# systemctl start iptables [root@openvpnservice openvpn]# systemctl enable iptables
[root@openvpnservice openvpn]# iptables -F
(4)添加防火墙规则
[root@openvpnservice openvpn]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o tun0 -j MASQUERADE [root@openvpnservice openvpn]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ ok ] [root@openvpnservice openvpn]# systemctl restart iptables
具体规则:
7、服务器启用IP地址转发
[root@openvpnservice openvpn]# echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf [root@openvpnservice openvpn]# sysctl -p net.ipv4.ip_forward = 1
8、启动服务
systemctl start openvpn@server # 启动 systemctl enable openvpn@server # 开机自启动 systemctl status openvpn@server # 查看服务状态 服务开启会报错:看/var/log/messages即可。 (1)配置文件中有中文没有被注释完全 (2)缺少13中的密码检查脚本,创建13的脚本,并chmod 777即可。
二、在服务器配置客户端相关信息——方法1:自动脚本
1、客户端下载
win7:https://download.topunix.com/openvpn/openvpn-install-2.4.9-I601-Win7.exe
win10:https://download.topunix.com/openvpn/openvpn-install-2.4.9-I601-Win10%20.exe
2、最简单的方法使用脚本创建
(1)脚本1:创建用户,密码,ip地址
vi /etc/openvpn/openvpn.sh
(2)脚本2:脚本1关联
vi /etc/openvpn/client/ovpn_user.sh
(3)创建模版配置文件
[root@openvpnservice ~]# cd /etc/openvpn/client/ [root@openvpnservice client]# vi sample.ovpn
client proto udp dev tun remote 58.211.*.* 11940 ca ca.crt cert admin.crt auth-user-pass #密码验证需要 key admin.key tls-auth ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings #redirect-gateway def1 #户端所有流量都通过 open VPN 转发,配合服务器端,此处生效可以直接访问所有内部服务器,而不需要在server.conf中配置 push route
3、运行sh openvpn.sh-配置用户
(1)运行sh openvpn.sh
(2)创建用户和密码。
(3)分配ip地址
10.9.0.6 10.9.0.5 或 10.9.0.10 10.9.0.9
4、复制zip文件
下载zip文件并解压,复制到客户端:C:\Program Files\OpenVPN\config
5、连接测试
三、在服务器配置客户端相关信息——方法2:手动创建脚本
1、添加客户端用户配置文件(通过sample.ovpn进行更改)
(1)创建模版配置文件
[root@openvpnservice ~]# cd /etc/openvpn/client/ [root@openvpnservice client]# touch sample.ovpn
client proto udp dev tun remote 58.211.*.* 11940 ca ca.crt cert admin.crt auth-user-pass #密码验证需要 key admin.key tls-auth ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings #redirect-gateway def1 #户端所有流量都通过 open VPN 转发,配合服务器端,此处生效可以直接访问所有内部服务器,而不需要在server.conf中配置 push route
2、创建客户端证书
(1)进入/etc/openvpn/easy-rsa/3,运行easyrsa命令,进行用户创建
[root@localhost pki]# cd /etc/openvpn/easy-rsa/3 [root@localhost 3]# ./easyrsa build-client-full LLL nopass
运行上述命令,会创建如下三个文件:
[root@localhost pki]# find /etc/openvpn/easy-rsa/3/pki |grep LLL /etc/openvpn/easy-rsa/3/pki/private/LLL.key /etc/openvpn/easy-rsa/3/pki/reqs/LLL.req /etc/openvpn/easy-rsa/3/pki/issued/LLL.crt
(2)拷贝四个文件进行打包(需要放置客户端)
# 创建文件夹:LLL,整理下生成的文件到新建的 /etc/openvpn/client/keys/LLL中
[root@localhost pki]# mkdir -p /etc/openvpn/client/keys/LLL
#拷贝所有证书文件到LLL中(一共五个文件,后面没建立一个用户,都需要这五个文件,其中ta.key是配合tls-auth使用)
[root@localhost pki]# cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/client/keys/LLL/ # CA 根证书
[root@localhost pki]# cp /etc/openvpn/easy-rsa/3/pki/issued/LLL.crt /etc/openvpn/client/keys/LLL/ # 客户端证书
[root@localhost pki]# cp /etc/openvpn/easy-rsa/3/pki/private/LLL.key /etc/openvpn/client/keys/LLL/# 客户端证书密钥
[root@localhost pki]# cp /etc/openvpn/client/sample.ovpn /etc/openvpn/client/keys/LLL/LLL.ovpn# 客户端配置文件
此处需要对LLL.ovpn的证书名称进行更改,默认是admin.crt,admin.key改为和客户端名称一致,LLL.crt,LLL.key
[root@localhost LLL]# cp /etc/openvpn/server/certs/ta.key /etc/openvpn/client/keys/LLL/ta.key # auth-tls 文件
3、创建客户端IP以及密码
(1)为用户配置密码和分配IP地址:
[root@localhost ccd]# echo "ifconfig-push 10.8.0.6 10.8.0.5" >>/etc/openvpn/ccd/LLL [root@localhost ccd]# echo "LLL 123" >> /etc/openvpn/psw-file
导出压缩包解压后放到客户端目录中即可
4、吊销证书删除用户
进入easy-rsa目录中去执行easyrsa删除wangxuejin用户
[root@openvpnservice ~]# cd /etc/openvpn/easy-rsa/3.0.8 [root@openvpnservice 3.0.8]#./easyrsa revoke LLL [root@openvpnservice 3.0.8]# ./easyrsa gen-crl
5、配置密码验证脚本:
6、密码存放方式
在psw-file里按”用户名[空格或者tab]密码“这种规则方式存放+
#touch /opt/openvpn/logs/psw-file #chown nobody:nobody /opt/openvpn/psw-file #cat /opt/openvpn/psw-file
LLL 123 zhangsan 123
四、配置核心交换机
因为openvpn需要虚拟一个IP地址段,所以,需要在核心交换机的静态路由处,添加此段以及允许访问的段
172.18.1.110是openvpn服务器地址。
五、总结:
1、openvpn需要三个重要的文件:
vars、server.conf、client.conf
https://www.topunix.com/post-2999.html
2、openvpn可以实现功能
(1)客户端上网走本地网络、通过vpn访问内部服务器
a、配置好密码、证书 b、设置好上述三个文件 c、设置好核心交换机中的静态路由(针对于虚拟ip的路由转发)
(2)客户端上公网或访问内部服务器都通过openvpn转发,但是需要设置几个地方:
a、根据(1)中配置好 b、clinet.conf的redirect-gateway def1和server.conf配置中的和push "redirect-gateway def1"要加上,表示全部走vpn 转发 c、设置路由,防火墙设置10.8.0.0/24的静态路由
上述设置可以满足(2)的需求
3、单密码+证书访问
(1)server:
port 1194 # 监听的端口号 proto udp # 服务端用的协议,udp 能快点,所以我选择 udp dev tun ca /etc/openvpn/server/certs/ca.crt # CA 根证书路径 cert /etc/openvpn/server/certs/server.crt # open VPN 服务器证书路径 key /etc/openvpn/server/certs/server.key # open VPN 服务器密钥路径,This file should be kept secret dh /etc/openvpn/server/certs/dh.pem # Diffie-Hellman 算法密钥文件路径 tls-auth /etc/openvpn/server/certs/ta.key 0 # tls-auth key,参数 0 可以省略,如果不省略,那么客户端 # 配置相应的参数该配成 1。如果省略,那么客户端不需要 tls-auth 配置 server 10.8.0.0 255.255.255.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24 push "dhcp-option DNS 8.8.8.8" # DNS 服务器配置,可以根据需要指定其他 ns push "dhcp-option DNS 8.8.4.4" #push "redirect-gateway def1" push "route 172.18.1.0 255.255.255.0" #下面两个配合(第一个访问外网通过本地网卡,第二个访问内部服务器通过vpn放通) #情况1: #第一个(push "redirect-gateway def1")如果注释掉,所有的流量都不主动通过openvpn转发(), #客户端可以直接访问直接访问公网(走的还是客户单本地的路由网络), #客户端无法直接访问内网资源,需要单独加vpn客户端段到需要访问网段的路由(push "route 172.18.1.0 255.255.255.0") #push "redirect-gateway def1" # 客户端所有流量都通过 open VPN 转发,类似于代理开全局;正常情况下这个语句需要注释掉,不让上网流量通过vpn转发 #push "route 172.18.1.0 255.255.255.0" #加上此语句,才能让vpn客户端访问172.18.1.0段 #情况2: #第一个(push "redirect-gateway def1")如果不进行注释,客户端所有流量都通过open VPN转发,如果要客户端访问公网网络,需要将分配的VPN段,于防火墙上进行配置,使其可以访问公网 #此处不需要再进行路由的设置 # compress lzo duplicate-cn # 允许一个用户多个终端连接,同时IP地址会自动向后划分,比如第一个用户是10.8.0.6,第二个用户就是10.8.0.10;第三个用户就是10.8.0.14;如果注释掉则只能一个用户使用,如果后者登录,则前者会被挤掉 keepalive 10 120 comp-lzo persist-key persist-tun # use username and password login auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env username-as-common-name script-security 3 # open VPN 进程启动用户,openvpn 用户在安装完 openvpn 后就自动生成了 group openvpn
user openvpn
#不请求客户的CA证书,使用User/Pass验证,如果同时启用证书和密码认证,注释掉该行 #client-cert-not-required # 指定 log 文件位置 log /var/log/openvpn/server.log log-append /var/log/openvpn/server.log status /var/log/openvpn/status.log verb 3 explicit-exit-notify 1
(2)client:
client proto udp dev tun remote 58.211.*.* 11940 ca ca.crt cert admin.crt auth-user-pass #密码验证需要 key admin.key tls-auth ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings #redirect-gateway def1 #户端所有流量都通过 open VPN 转发,配合服务器端,此处生效可以直接访问所有内部服务器,而不需要在server.conf中配置 push route
4、单密码访问(根据3中配置进行增改):
(1)server配置增加:
script-security 3 auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定用户认证脚本 username-as-common-name verify-client-cert none
(2) client配置:
增加:添加一行auth-user-pass 去掉:注释crt和key路径
5、证书访问
(1)server:
去掉: #verify-client-cert none #免用证书 # use username and password login #auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #username-as-common-name
(2)client:
去掉: auth-user-tls
六、问题排查
1、启动服务报错:
systemctl start openvpn@server
cat /var/log/openvpn/server.log
2、更改启动方式正常:
[root@openvpn ~]#openvpn /etc/openvpn/server.conf & 通过执行exit退出当前界面 [root@openvpn ~]#exit
3、最根本原因是selinux没有关闭。
关闭selinux即可。
七、阿里云ECS配置如下(从上述配置中做简单修改即可,内部段使用10.9.0.0/24,默认为10.8.0.0/24)
安装配置需要按照:一、二、三配置。
1、配置
[root@iZrj96evwj6ne6gjelxe96Z openvpn]# cat /etc/openvpn/server.conf port 11940 proto udp dev tun ca /etc/openvpn/server/certs/ca.crt cert /etc/openvpn/server/certs/server.crt key /etc/openvpn/server/certs/server.key dh /etc/openvpn/server/certs/dh.pem tls-auth /etc/openvpn/server/certs/ta.key 0 server 10.9.0.0 255.255.240.0 push "dhcp-option DNS 223.5.5.5" push "dhcp-option DNS 8.8.4.4" push "dhcp-option DNS 8.8.8.8" #push "redirect-gateway def1 bypass-dhcp" push "redirect-gateway def1" #主要用于代理#自动推送客户端上的网关及DHCP,此项开启了流量转发,有这项才能使用服务器代理上网 push "route 172.20.13.0 255.255.255.0" #用于访问内部IP
#compress lzo #duplicate-cn keepalive 10 120 client-config-dir ccd comp-lzo persist-key persist-tun # use username and password login auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env username-as-common-name script-security 3 user openvpn #client-cert-not-required log /var/log/openvpn/server.log log-append /var/log/openvpn/server.log status /var/log/openvpn/status.log verb 3 explicit-exit-notify 1
2、iptables防火墙配置,用于路由转发和控制
[root@iZrj96evwj6ne6gjelxe96Z openvpn]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Tue Jul 4 16:21:23 2023
*nat
:PREROUTING ACCEPT [8:386]
:INPUT ACCEPT [8:386]
:OUTPUT ACCEPT [10:660]
:POSTROUTING ACCEPT [10:660]
-A POSTROUTING -s 10.9.0.0/20 -o eth0 -j MASQUERADE ##这里配置为eth0网口,而不要配置tun0,如果只是访问内部,不代理上网。如果要代理上网,需要使用eth0。
COMMIT
# Completed on Tue Jul 4 16:21:23 2023
# Generated by iptables-save v1.4.21 on Tue Jul 4 16:21:23 2023
*filter
:INPUT ACCEPT [39:2535]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [27:7205]
-A INPUT -p tcp -m tcp --dport 11940 -j ACCEPT
-A INPUT -p udp -m udp --dport 11940 -j ACCEPT
COMMIT
# Completed on Tue Jul 4 16:21:23 2023
3、客户端配置。
client
proto udp
dev tun
remote 47.254.124.4 11940
ca ca.crt
cert test.crt
auth-user-pass #密码验证需要
key test.key
tls-auth ta.key 1
remote-cert-tls server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings
redirect-gateway def1
文章评论