openvpn笔记

版权声明:cao-denghua-非商业性使用-相同方式共享 3.0 中国大陆 (CC BY-NC-SA 3.0 CN) https://blog.csdn.net/caodenghua/article/details/80079230

openvpn笔记

要玩转openvpn。第一点要懂网络逻辑(特别是路由和桥接),第二点要看下openvpn的官方文档。

以下所有内容将不会详细涉及路由、桥接、防火墙的配置。

第一部分:安装与基本配置

第一节:使用yum安装openvpn 2.3.x

由于中国大陆封了openvpn,可以在下面地址找到 https://github.com/OpenVPN/openvpn

如果安装了阿里云的源可以直接安装:

yum -y install openvpn

# 需要的组件openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig

# lzo是致力于解压速度的一种数据压缩算法

# 从2.3版本开始没有包含最重要的证书制作部分:easy-rsa。openvpn官网也给出明确说明:Starting with openvpn-2.3_alpha2 easy-rsa is no longer part of the OpenVPN source or binary packages。

yum -y install easy-rsa #在/usr/share/easy-rsa
cp -r /usr/share/easy-rsa/2.0 /etc/openvpn

# 可以手动安装easy-rsa,在github上下载

# easy-rsa3与easy-rsa2.0的操作完全不同 下面是easy-rsa3的安装
unzip easy-rsa-master.zip 
mv easy-rsa-master easy-rsa
cp -R easy-rsa/ openvpn-2.3.4/
cd openvpn-2.3.4/easy-rsa/easyrsa3/
cp vars.example vars
vi vars
    #set_var EASYRSA_REQ_COUNTRY "CN"
    #set_var EASYRSA_REQ_PROVINCE "Beijing"
    #set_var EASYRSA_REQ_CITY "Beijing"
    #set_var EASYRSA_REQ_ORG "jinxin Certificate"
    #set_var EASYRSA_REQ_EMAIL "[email protected]"
    #set_var EASYRSA_REQ_OU "My OpenVPN"

示例配置文件在:

#/usr/share/doc/openvpn-2.3.4/
#/usr/share/openvpn
#复制配置文件
cp /usr/share/doc/openvpn-2.3.4/sample/sample-config-files/server.conf  /etc/openvpn/

安装完后打开路由

net.ipv4.ip_forward = 1

定义执行环境变量解释

#编辑vars 文件,生成环境变量, vars 里的参数根据自己需要改变
export KEY_SIZE=1024             #生成密钥的位数
export KEY_COUNTRY=CN            #定义所在的国家编码, 2 个字符
export KEY_PROVINCE=BeiJing      #定义所在的省份
export KEY_CITY=BeiJing          #定义所在的城市
export KEY_ORG=”VPN Test org”    #定义所在的组织
export KEY_OU=”VPN COM”          #定义所在的单位
export KEY_EMAIL=”china@qq.com”  #定义你的邮件地址

使用easy-rsa的脚本产生证书

cd /etc/openvpn/easy-rsa/2.0/
vi vars                      #修改证书信息
. vars                       #执行环境
./clean-all                  #清除之间建立的所有文件,包含证书、加密
./build-ca server            #新建ca 

./build-key-server server    #新建服务端key 

./build-key client1          #新建客户端key
./build-key client2          #新建客户端key
./build-key client3          #新建客户端key

./build-dh                   #建立dh

1. 生成主证书颁发机构(CA)证书和密钥的说明

我们将为客户端生成主CA证书/密钥,服务器证书/密钥和证书/密钥。

对于PKI管理,我们将使用easy-rsa 2 ,这是一组与OpenVPN 2.2.x及更早版本捆绑在一起的脚本。 如果您使用的是OpenVPN 2.3.x,则需要从这里单独下载easy-rsa 2。

对于PKI管理,我们将使用easy-rsa 2 ,这是一组与OpenVPN 2.2.x及更早版本捆绑在一起的脚本。 如果您使用的是OpenVPN 2.3.x,则可能需要从easy-rsa-old-project页面中单独下载easy-rsa 2。 在OpenVPN软件仓库中 ,Debian和Ubuntu也提供了easy-rsa 2软件包。 在* NIX平台上,您应该使用easy-rsa 3来查看; 有关详细信息,请参阅自己的文档。

如果您使用的是Linux,BSD或类似unix的操作系统,请打开一个shell并cd至easy-rsa子目录。 如果您从RPM或DEB文件安装OpenVPN,easy-rsa目录通常可以在/ usr / share / doc / packages / openvpn/ usr / share / doc / openvpn中找到 (最好将此目录复制到另一个位置如/ etc / openvpn ,在进行任何编辑之前,以便将来的OpenVPN软件包升级不会覆盖您的修改)。 如果从.tar.gz文件安装,easy-rsa目录将位于展开的源代码树的顶级目录中。

如果您使用的是Windows,请打开“命令提示符”窗口,然后输入\ Program Files \ OpenVPN \ easy-rsa 。 运行下面的批处理文件,将配置文件复制到位(这将覆盖任何先前存在的vars.bat和openssl.cnf文件):

2. 关键文件说明

现在我们将在keys子目录中找到我们新生成的密钥和证书。 这里是对相关文件的解释:

文件名 需要 目的 秘密
ca.crt 服务器+所有客户端 根CA证书 没有
ca.key 钥匙签署机器 根CA密钥
DH {N}.pem 仅服务器 Diffie Hellman参数 没有
server.crt这 仅服务器 服务器证书 没有
server.key 仅服务器 服务器密钥
client1.crt 仅client1 Client1证书 没有
client1.key 仅client1 Client1密钥
client2.crt 仅client2 Client2证书 没有
client2.key 仅client2 Client2密钥
client3.crt 仅client3 Client3证书 没有
client3.key 仅client3 Client3密钥

3. 配置的部分说明

  • 如果您使用以太网桥接( Ethernet bridging) ,则必须使用server-bridge and dev tap instead of server and dev tun
  • 如果你希望你的OpenVPN服务器监听TCP端口而不是UDP端口,使用proto tcp而不是proto udp(如果你想让OpenVPN监听UDP和TCP端口,你必须运行两个独立的OpenVPN实例)。
  • 如果要使用10.8.0.0/24以外的虚拟IP地址范围,则应修改服务器指令。 请记住,这个虚拟IP地址范围应该是一个私人范围,目前在您的网络上未使用。
  • 如果希望连接客户端以便能够通过VPN到达对方,请取消注释客户端到客户端的指令( client-to-client )。 默认情况下,客户端将只能访问服务器。
  • 如果您正在使用Linux,BSD或类Unix操作系统,则可以通过取消注释用户nobody组用户nobody指令来提高安全性。

如果你想在同一台机器上运行多个OpenVPN实例,每个实例使用不同的配置文件,如果你:

  • 为每个实例使用不同的端口号(UDP和TCP协议使用不同的端口空间,这样您就可以在UDP-1194上运行一个守护程序,在TCP-1194上运行另一个守护程序)。
  • 如果您使用的是Windows,则每个OpenVPN配置都需要有自己的TAP-Windows适配器。 您可以通过开始菜单 - >所有程序 - > TAP-Windows - >添加一个新的TAP-Windows虚拟以太网适配器来添加其他适配器
  • 如果您在同一个目录下运行多个OpenVPN实例,请确保编辑创建输出文件的指令,以便多个实例不会覆盖彼此的输出文件。 这些指令包括日志日志追加状态ifconfig-pool-persist

第二节:从源码包编译成RPM包安装

如果您正在使用支持RPM软件包(SuSE,Fedora,Redhat等)的Linux发行版,则最好使用此机制进行安装。 最简单的方法是为您的发行版找到一个现有的二进制RPM文件。 你也可以建立你自己的二进制RPM文件:

 rpmbuild -tb openvpn- [version] .tar.gz

一旦你有了.rpm文件,你可以用通常的方式安装它

rpm -ivh openvpn- [details] .rpm 

或使用升级现有安装

rpm -Uvh openvpn- [details] .rpm 

从二进制RPM包安装OpenVPN有这些依赖关系:
- OpenSSL的
- LZO
- PAM

而且,如果你正在构建你自己的二进制RPM包,还有几个额外的依赖关系:
- OpenSSL的-devel的
- LZO-devel的
- PAM-devel的

第三节:配置OpenVPN服务端配置文件

编辑/etc/openvpn/server.conf文件,内容如下:包含了大部分日常的常用设置选项

#########
#协议模块#
#########

# 设置监听 IP,默认是监听所有 IP 
local       116.6.45.23 
port        1194
# 可以选择tcp和udp。udp速度快,tcp速度较慢
proto       tcp
# 设备 tap(交换)和 tun(路由) ,tap 是二层设备,支持链路层协议。tun 是 ip 层的点对点协议,限制稍微多一些,一般是使用 tun
# 如果要使用tap模式,请确认系统里安装了 bridge-utils 软件包,更改 dev tun  为 dev tap0,并与br0通信
dev         tun

#########
#证书模块#
#########
# 定义证书路径
ca          /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert        /etc/openvpn/easy-rsa/2.0/keys/server.crt
key         /etc/openvpn/easy-rsa/2.0/keys/server.key
dh          /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem

#########
#网络模块#
#########
# 定义vpn虚拟网关
server      10.200.1.0 255.255.255.0
# 向客户端推送本地网段,注意本地网段和客户端网段不能重叠,如果重叠需要单独banding
# push选项很多,需要查看官方文档
push        "route 192.168.77.0 255.255.255.0"
push        "route 192.168.88.0 255.255.255.0"
push        "dhcp-option DNS 172.18.2.23" 
push        "dhcp-option DNS 202.96.128.86" 
# 客户端通过openvpn server连接Internet,不使用客户端自己本地的Internet,如果使用此项会增加大量消耗服务器带宽资源。
push         "redirect-gateway local"

#  配置为以太网桥模式,但需要使用系统的桥接功能 
#  这里不需要使用 
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 

#########
#启动角色#
#########
# 让 OpenVPN 以 nobody 用户和组来运行(安全) 
user nobody 
group nobody

#########
#日志模块#
#########
log         /var/log/openvpn.log
# 每次重新启动 openvpn 后保留原有的 log 信息,新信息追加到文件最后 
;log-append openvpn.log 
status      openvpn-status.log
# 相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。 
mute 20   
# verb 设置日志要记录的级别。0只记录错误信息。4能记录普通的信息。5和6在连接出现问题时能帮助调试9是极端的,所有信息都会显示,甚至连包头等信息都显示(像tcpdump),verb 默认3
verb        3
# 相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。 
mute 20

#########
#其他模块#
#########
# 设置服务端检测的间隔和超时时间每10秒ping一次,如果120秒没有回应则认为对方已经down
keepalive   10 120
# 使用 lzo 压缩的通讯,服务端和客户端都必须配置
comp-lzo
# 重启时仍保留一些状态 
persist-key
persist-tun
# 设置最大用户数
max-clients 30
# 打开管理界面,可以定义监控的 IP 和端口 
management localhost 7505 

# 维持一个客户端和 virtual IP 的对应表,以方便客户端重新 连接可以获得同样的 IP 
ifconfig-pool-persist  /usr/local/etc/ipp.txt 
# Client 之间可以相互访问,打开下面选项的同时,还需要push添加每个需要互访的路由
client-to-client
# 允许一个证书被多个用户同时使用,所有客户端使用同一个证书登陆,打开此项不好跟踪用户
duplicate-cn

注意私网的分配地址

起始地址 结束地址 掩码
10.0.0.0 10.255.255.255 (10/8前缀)
172.16.0.0 172.31.255.255 (172.16 / 12前缀)
192.168.0.0 192.168.255.255 (192.168 / 16前缀)

第四节:配置OpenVPN客户端配置文件

client  
dev tun 
proto udp   
remote 192.168.80.129 2194    # 服务器地址
persist-key  
persist-tun 
# 客户端证书
ca ca.crt   
cert client1.crt   
key client1.key   

ns-cert-type server   
comp-lzo  
verb 3   
;redirect-gateway def1   
tls-auth ta.key 1 

第四节:启动openvpn

systemctl -f enable openvpn@server.service      #设置启动文件
systemctl restart openvpn@server.service        #启动openvpn的命令
systemctl status openvpn@server.service

第五节:配置客户端同时连接多个vpn服务器

在windows系统下

  • 添加网卡。在 dir “%PROGRAMFILES%\TAP-Windows\bin\” 路径下执行AddTap.bat,如果是win7要用管理员权限执行
  • 修改刚才网卡名称为B
  • 在配置文件里添加一行:dev-node B

第六节:设置固定客户端IP

第一步:在server.confi添加如下行:

client-config-dir ccd 

第二步:新建ccd目录(/etc/openvpn/ccd),在该目录下新建client1、client2、client3

在client1文本里添加
ifconfig-push 10.0.0.5 10.0.0.6
在client2文本里添加
ifconfig-push 10.0.0.9 10.0.0.10
在client3文本里添加
ifconfig-push 10.0.0.13 10.0.0.14

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] 

第七节:限制客户端的访问

有2个方法,一个是在ccd目录下对具体客户配置路由访问,另外一个办法是通过防火墙限制访问。

第八节:用账号登陆

只在服务端制作客户端证书,而客户端只需要有ca.crt文件,而不需要拿到客户端证书,当登陆服务器的时候是通过用户名和密码即可登陆OpenVPN服务器。

服务端配置

# OpenVPN可以通过插件(plugin)方式支持上述的用户名认证,在Linux下以PAM为例,必须先增加用户:
useradd -M test
passwd test 

# 然后修改server.conf增加
plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-pam.so login
client-cert-not-required
username-as-common-name

客户端配置

# client.ovpn增加, 激活登陆认证方式
auth-user-pass
#修改认证证书,保留ca.crt即可,客户端证书可以不要了
ca ca.crt 

第二部分:特殊设置

1. 生成带密码的证书文件

客户端不但需要证书,还需要密码,而且这个密码,客户端可以自己进行修改。这个倒是非常不错。

./build-key --pass client1
#或者
./pkitool –pass client1
#出现Enter PEM pass phrase:
#提示你输入密码

2. 吊销客户端证书

sourse ./vars 
revoke-full <证书名>
#执行命令后,显示error 23 at 0 depth lookup:certificate revoked,表示注销成功。

会在 keys 目录下,产生一个文件叫crl.pem, 这个文件保存着注销客户端的名字,并且还要在openvpn server 端的配置文件中添加以下一行,并重启openvpn,使用这个证书的客户再也不能连接到vpn 了.

#确保 server.conf  中包含这样一句 
 crl-verify /etc/openvpn/2.0/keys/crl.pem 

成功注销某个证书之后,可以打开 keys/index.txt 文件,可以看到被注销的证书前面,已标记为R

3. 使用用户名密码登录验证,用户名及密码存放在 mysql 库中

(未完)

4. 搭建 OpenVPN Site to Site

  1. 首先要保证 2边的 [vpn client server] 之间的网段相互访问
  2. 设置 vpn 客户端的路由

5.OpenVPN负载均衡

要使用OpenVPN负载均衡,可以这样做:
1、可以建立多台服务器,除server配置不同外,其余相同:

# server1
server 10.8.0.0 255.255.255.0
# server2
server 10.8.1.0 255.255.255.0
# server3
server 10.8.2.0 255.255.255.0

2、客户端可以用多点尝试进行配置:

# 默认从上往下尝试
remote server1 port
remote server2 port
# 也可以改为随机连接
remote-random
# 为防止DNS解析错误导致不进行后续的尝试,可以加入下面的语句
resolv-retry 60

6. 各个 vpn client 之间的网段相互访问

server.conf加如下行

client-to-client 
push "route 192.168.11.0 255.255.255.0"  #客户端所在的网络
push "route 192.168.12.0 255.255.255.0"  #客户端所在的网络
push "route 192.168.13.0 255.255.255.0"  #客户端所在的网络

第三部分:问题

问题1:ca.crt不对

(下面的答案是错的,真正原因是ca.crt不对)

OpenVPN -> 时间错误会造成VPN无法正常连接

连接openvpn时出现错误提示:
TLS_ERROR: BIO read tls_read_plaintext error: error:140890B2:
SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
TLS Error: TLS object -> incoming plaintext read error
TLS Error: TLS handshake failed

这个似乎是提示系统时间和证书时间不一致,具体解决措施为:
1. 修改vps时间与本地时间一致
2. 重启vps
3. 重新连接openvpn试试
4. 如果依旧不能连接openvpn,可以在vps上重新生成一个新的证书。

问题2:openvpn映射要注意

服务器有2种模式,一种是TCP,一种是UDP,一般都用UDP模式,所以在路由器上映射的时候要用
ip nat inside source static tcp 192.168.0.254 1194 125.84.1.27 1194(错)
ip nat inside source static UDP 192.168.0.254 1194 125.84.1.27 1194(对)

问题3:有的window系统没有启动dhcp服务

必须打开客户机上的DHCP服务,不然就获取不到IP地址

问题4:

(未完)

猜你喜欢

转载自blog.csdn.net/caodenghua/article/details/80079230