参考文章:
1.https://blog.csdn.net/hantaozi/article/details/125235752(安装openvpn,主要)
2.https://blog.csdn.net/m0_69013817/article/details/124589686(安装opemvpn,参考)
3.https://blog.csdn.net/m0_69013817/article/details/126088625(安装opemvpn,参考)
设备:
1.云电脑:有公网ip,可以同来当server端
2.两台本地电脑:分别作为 client1 和 client2
安装程序
yum install -y epel-release && yum -y update && yum install -y easy-rsa openvpn
#####################如果上面的不行,可以用下面的######################
#更新软件包
yum -y update
#安装epel源
yum install -y epel-release
#安装依赖包
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel
yum install -y easy-rsa
#安装openvpn
yum install -y openvpn
生成证书密钥
创建PKI
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3.0.8/ /etc/openvpn/easy-rsa/ #1.注意版本及路径。2.这里复制后会将3.0.8文件夹页复制过去,需要把里面的文件拿出来
cd /etc/openvpn/easy-rsa/
./easyrsa init-pki #初始化kpi,生成kpi文件夹
生成CA证书
./easyrsa build-ca
输出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-ca
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Enter New CA Key Passphrase: 设置CA密码,下面有用
Re-Enter New CA Key Passphrase: 确认密码
Generating RSA private key, 2048 bit long modulus
...........................+++
..+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpnCA 随便输入证书名
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt
为服务器生成证书密钥
server 为证书名称,可以自由替换
nopass 是免密码,避免启动openvpn服务需要输入证书密码
./easyrsa build-server-full server nopass
输出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
.................................................+++
.............+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-14878.omWrcN/tmp.bsrEu4'
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-14878.omWrcN/tmp.VTOMKj
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 输入刚刚创建CA证书时设置的密码
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Sep 13 15:11:37 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
为客户端生成证书密钥
根据需要的客户端证书数量创建证书,client1为证书名,可自由替换
# 创建名为client1的证书密钥
./easyrsa build-client-full client1
#不想客户端需要输入密码可以使用下面命令,建议使用密码
# ./easyrsa build-client-full client1 nopass
输出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-client-full client1
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
....................+++
........+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-15014.QOzFN6/tmp.uQz8Xk'
Enter PEM pass phrase: 为客户端证书设置密码
Verifying - Enter PEM pass phrase: 确认密码
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-15014.QOzFN6/tmp.YgmEO6
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 输入刚刚创建CA证书时设置的密码
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until Sep 13 15:21:24 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
生成Diffie hellman 参数
./easyrsa gen-dh
生成TLS认证密钥
openvpn --genkey --secret ta.key
编辑openvpn服务器配置文件
1.复制配置示例文件(可以不用复制,直接创建一个server.conf新文件就行了)
# 注意路径openvpn-2.4.12,文件夹的名字不是这个
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/server/server.conf
2.编辑配置文件
如果上面复制了sample文件,需要一处处的去改,可以直接把文件内容清空,填写新内容
vim /etc/openvpn/server/server.conf
我使用的配置:
port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
topology subnet
tls-auth /etc/openvpn/easy-rsa/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push "redirect-gateway def1 bypass-dhcp" #加了这个客户端所有流量都走vpn,对于1m的云服务器带宽来说就很卡,还是单独设置好些,所以用;注掉。具体看下面的配置解释。
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
client-to-client
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
配置解释:
本文将介绍如何配置OpenVPN服务器端的配置文件。在Windows系统中,该配置文件一般叫做server.ovpn;在Linux/BSD系统中,该配置文件一般叫做server.conf。虽然配置文件名称不同,但其中的配置内容与配置方法却是相同的。
本文根据官方提供的server.ovpn示例文件直接翻译得出。Windows、Linux、BSD等系统的服务器端配置文件均可参考本文。
#################################################
# 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例
#
# 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置
#
# OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面)
#
# 该配置支持Windows或者Linux/BSD系统。此外,在Windows上,记得将路径加上双引号,
# 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key"
#
# '#' or ';'开头的均为注释内容
#################################################
#OpenVPN应该监听本机的哪些IP地址?
#该命令是可选的,如果不设置,则默认监听本机的所有IP地址。
;local a.b.c.d
# OpenVPN应该监听哪个TCP/UDP端口?
# 如果你想在同一台计算机上运行多个OpenVPN实例,你可以使用不同的端口号来区分它们。
# 此外,你需要在防火墙上开放这些端口。
port
#OpenVPN使用TCP还是UDP协议?
;proto tcp
proto udp
# 指定OpenVPN创建的通信隧道类型。
# "dev tun"将会创建一个路由IP隧道,
# "dev tap"将会创建一个以太网隧道。
#
# 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0"
#
# 如果你想控制VPN的访问策略,你必须为TUN/TAP接口创建防火墙规则。
#
# 在非Windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"。
# 在Windows中,你也可以使用"dev-node"。
# 在多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。
;dev tap
dev tun
# 如果你想配置多个隧道,你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。
# 在XP SP2或更高版本的系统中,你可能需要有选择地禁用掉针对TAP适配器的防火墙
# 通常情况下,非Windows系统则不需要该指令。
;dev-node MyTap
# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。
# 每个客户端和服务器端都需要它们各自的证书和私钥文件。
# 服务器端和所有的客户端都将使用相同的CA证书文件。
#
# 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。
# 记住,服务器端和每个客户端的证书必须使用唯一的Common Name。
#
# 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
# OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令)
ca ca.crt
cert server.crt
key server.key # 该文件应该保密
# 指定迪菲·赫尔曼参数。
# 你可以使用如下名称命令生成你的参数:
# openssl dhparam -out dh1024.pem
# 如果你使用的是2048位密钥,使用2048替换其中的1024。
dh dh1024.pem
# 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。
# 在此处的示例中,服务器端自身将占用10.,其他的将提供客户端使用。
# 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。
server 10.8.0.0 255.255.255.0
# 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist ipp.txt
# 该指令仅针对以太网桥接模式。
# 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。
# 然后,你需要手动设置桥接接口的IP地址、子网掩码;
# 在这里,我们假设为10.。
# 最后,我们必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端。
# 如果你不是以太网桥接模式,直接注释掉这行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 该指令仅针对使用DHCP代理的以太网桥接模式,
# 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。
#
# 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。
# 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。
;server-bridge
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网)
# 记住,这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
# 为指定的客户端分配指定的IP地址,或者客户端背后也有一个私有子网想要访问VPN,
# 那么你可以针对该客户端的配置文件使用ccd子目录。
# (简而言之,就是允许客户端所在的局域网成员也能够访问VPN)
# 举个例子:假设有个Common Name为/255.255.255.248。
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 然后创建一个文件ccd/Thelonious,该文件的内容为:
# iroute 192.168.40.128 255.255.255.248
#这样客户端所在的局域网就可以访问VPN了。
# 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。
# 比如,你使用了"dev tun"和"server"指令。
# 再举个例子:假设你想给Thelonious分配一个固定的IP地址10.。
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 然后在文件ccd/Thelonious中添加如下指令:
# ifconfig-push 10.9.0.1 10.9.0.2
# 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:
# ()运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则。
# () (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。
# 关于learn-address脚本的更多信息请参考官方手册页面。
;learn-address ./script
# 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"
# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。
# 下列地址来自opendns.com提供的Public DNS 服务器。
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
# 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。
# 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器,你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。
;client-to-client
# 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么你可以取消该指令的注释。
# 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。
# 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。
;duplicate-cn
# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
# 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。
keepalive
# 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。
# 你可以使用以下命令来生成:
# openvpn --genkey --secret ta.key
#
# 服务器和每个客户端都需要拥有该密钥的一个拷贝。
# 第二个参数在服务器端应该为'。
;tls-auth ta.key # 该文件应该保密
# 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中。
;cipher BF-CBC # Blowfish (默认)
;cipher AES--CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
# 在VPN连接上启用压缩。
# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
comp-lzo
# 允许并发连接的客户端的最大数量
;max-clients
# 在完成初始化工作之后,降低OpenVPN守护进程的权限是个不错的主意。
# 该指令仅限于非Windows系统中使用。
;user nobody
;group nobody
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun
# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。
status openvpn-status.log
# 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)。
# 你可以使用log或者log-append来改变这种默认情况。
# "log"方式在每次启动时都会清空之前的日志文件。
# "log-append"这是在之前的日志内容后进行追加。
# 你可以使用两种方式之一(但不要同时使用)。
;log openvpn.log
;log-append openvpn.log
# 为日志文件设置适当的冗余级别(~)。冗余级别越高,输出的信息越详细。
#
# 表示静默运行,只记录致命错误。
# 表示合理的常规用法。
# 和 可以帮助调试连接错误。
# 表示极度冗余,输出非常详细的日志信息。
verb
# 重复信息的沉默度。
# 相同类别的信息只有前20条会输出到日志文件中。
;mute
设置NAT及防火墙
禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux(selinux是Linux特有的安全机制,因为配置太麻烦,几乎没有人真正的应用它。安装完系统后我们一般会选择关闭selinux。)
#这是临时关闭,永久关闭在 /etc/selinux/config
setenforce 0
开启ipv4转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
安装iptables
yum install iptables-services
设置网卡nat
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
保存设置
service iptables save
iptable的教程可以看:https://blog.csdn.net/weixin_38166318/article/details/127344897
启动openvpn
设置并启动openvpn
systemctl enable openvpn-server@server
systemctl start openvpn-server@server.service
检查状态
netstat -tlunp
systemctl status openvpn-server@server
准备客户端文件
复制证书密钥到一个文件夹下
如果有多个客户端,就将下面所有的client1改成相应的client
mkdir /etc/openvpn/client/client1
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/client/client1/
编辑客户端配置文件
#windows、macOS
vim /etc/openvpn/client/client1/client1.ovpn
#linux
vim /etc/openvpn/client/client1/client1.conf
client
dev tun
proto tcp
remote 111.111.111.111 1194 #修改111.111.111.111为服务器公网ip地址;1194为openvpn端口
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
remote-cert-tls server
cipher AES-256-CBC
verb 3
windos客户端使用
1.下载安装OpenVPN GUI :
官方github地址:
https://github.com/OpenVPN/openvpn-gui
然后进行安装,不能修改安装路径
2.将刚刚服务器上准备的客户端文件夹【/etc/openvpn/client/client1/】复制到客户端【C:\Program Files\OpenVPN\config】目录下面。
3.打开OpenVPN
4.输入client1证书生成时设置的密码即可连接成功
连接成功后,此时已经可以在客户端电脑中ping通服务端云电脑的内网ip以及10.8.0.0那个网段的ip了。但是此时两个客户端之间并不能相互ping通,这是因为windows防火墙拦截了,如果直接关闭防火墙,那么就能相互ping通了。
常见问题
连接成功但流量不走openvpn
检查服务器配置文件是否设置了那些流量经过openvpn
#设置客户端那些ip段走openvpn通道
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
# 设置客户端所有流量都通过openvpn
push "redirect-gateway def1 bypass-dhcp"
TCP: connect to [AF_INET]111.111.111.111:1194 failed: Unknown error
检查端口是否可以访问
#telnet命令需要在 控制面板 > 程序 > 启用或关闭windows功能中勾选 telnet客户端 打开
telnet 111.111.111.111 1194
检查防火墙设置,可能被iptables阻拦了
#清空iptables规则
iptables -F
#设置nat规则
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE