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
- 首先要保证 2边的 [vpn client server] 之间的网段相互访问
- 设置 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:
(未完)