由于国家GW防火墙对×××的管控,不能直接通过国内与香港建立×××,如果反过来,通过openvpn从香港主动连接国内,就可以实现,亲测,速度和稳定性非常OK;
1、 Openvpn优势
1. 配置灵活,可以应付各种复杂网络环境,比如点对点,或者网对网;
2. 实用性非常强,尤其是在当下国家GW干扰×××的大环境下,openvpn可以非常稳定打通国内外网络,实现互联互通,而且效果非常明显,非常稳定;
3. 成本价格低,是性价比非常高的×××方案,其性能并不亚于硬件设备,只需要一台稳定的PC电脑,或者云主机上部署,尤其适合于中小企业;
4. 支持移动办公,也可以使用于手机等移动终端设备;
2、 网络拓扑图
3、 实验目的
通过Openvpn来实现172.16.20.0/24网络与服务器网络B(10.99.0.0/24)的网络互联,可用于解决国外网络延迟问题。
4、 环境说明
准备两台服务器,这里分别是两台云主机,网络在供应商哪里是经过优化的,到大陆非常稳定,延迟,见图,即深圳×××服务器和香港×××服务器;
深圳×××服务器作为×××服务器,香港×××服务器作为深圳×××服务器的客户端;而客户端网络A所在的网络的PC机作为香港×××服务器的客户端;客户端网络A拨入香港×××服务器,香港×××服务器以客户端的身份再拨入深圳×××服务器,从而打通了客户端网络A的pc机访问深圳×××服务器所在的服务器网络B,即 172.16.20.0/24访问10.99.0.0/24
深圳×××服务器
eth0接口IP:10.99.0.12(此直连物理网络,非×××虚拟网络) ×××虚拟IP:172.16.10.0/24 外网IP(略)
香港×××服务器
eth0接口IP:10.0.0.5 ×××虚拟IP: 172.16.20.0/24 外网IP(略)
拨入深圳×××服务器的客户端Common Name是xgserver
注: 深圳/香港×××服务器 都是 云主机服务器;
对比拓扑图和IP地址信息,得出最终的目的是要实现
:
172.16.20.0/24 网络与10.99.0.0/24 互联互通;
也许你会奇怪,为什么不是客户端网络A与服务器网络B的互联互通? 其实这里关系并不大, 172.16.20.0/24与10.99.0.0/24 能通,AB网络的互通就不难了,关键是我们要理解其中的逻辑;
5、 软件安装
yum install gcc* openssl-devel net-tools lzo-devel pam-devel –y
mkdir /usr/local/openvpn
tar –zxvf openvpn-2.4.2.tar.gz
cd openvpn-2.4.2
./configure –prefix=/usr/local/openvpn
Make install
6、 配置easyrsa
penvpn-2.3.8及以上版本,不包含easy-rsa,需要单独下载:
git clone https://github.com/Open×××/easy-rsa
mkdir /etc/openvpn/server
cp –r easy-rsa /etc/openvpn/server
cd /etc/openvpn/server/easy-rsa/easyrsa3
cp vars.example vars
vi vars #编辑vars,定位到如下配置位置,修改如下
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "GUANGDONG"
set_var EASYRSA_REQ_CITY "SHENZHEN"
set_var EASYRSA_REQ_ORG "HUANAN"
set_var EASYRSA_REQ_EMAIL "mycompany@example.net"
set_var EASYRSA_REQ_OU "mycompany"
保存,退出
7、 创建服务器证书及key
cp –R /so ftware/easy-rsa /etc/openvpn/server #拷贝easy-rsa目录到此目录
cd /etc/openvpn/server/easy-rsa/easyrsa3 #定位到目录,此目录
./easyrsa init-pki #初始化Pki
./easyrsa build-ca #创建根证书
………….
Enter PEM pass phrase: #输入根证书密码,用于后续证书创建
Verifying - Enter PEM pass phrase: #重复输入,确认密码
…………..
./easyrsa gen-req server nopass #创建服务端书
./easyrsa sign server server #签约服务器端证书,提示输入密码,先输入前面的根证书密码,第二个密码为服务器密码;
./easyrsa gen-dh #创建Diffie-Hellman,确保key穿越不安全网络
8、 创建客户端证书
mkdir /etc/openvpn/client #创建客户端目录,用于存放客户端证书和easy-rsa
cp –r /software/easy-esa /etc/openvpn/client
cd /etc/openvpn/client/easy-rsa/easyrsa3
./easyrsa init-pki #初始化
./easyrsa gen-req sgserver 注:后面提示的密码,设置之后必须记住,配置windows/linux客户端连接的时候,需要用到;
cd /etc/openvpn/server/easy-rsa/easyrsa3 #定位到服务器的easy-rsa目录
./easyrsa import-req /etc/openvpn/client/easy-rsa/easyrsa3/pki/reqs/xgserver.req xgserver #此req文件,是上图中倒数第二行的目录,导入并签约证书
./easyrsa sign client xgserver #提示输入根证书的密码,即最开始创建根证书时设置的密码
9、 服务器和客户端生成的文件
服务器端文件:
/etc/openvpn/server/easy-rsa/easyrsa3/pki/ca.crt
/etc/openvpn/server/easy-rsa/easyrsa3/pki/dh.pem
/etc/openvpn/server/easy-rsa/easyrsa3/pki/issued/server.crt
/etc/openvpn/server/easy-rsa/easyrsa3/pki/issued/xgserver.crt
/etc/openvpn/server/easy-rsa/easyrsa3/pki/private/ca.key
/etc/openvpn/server/easy-rsa/easyrsa3/pki/private/server.key
/etc/openvpn/server/easy-rsa/easyrsa3/pki/reqs/server.req
/etc/openvpn/server/easy-rsa/easyrsa3/pki/reqs/xgserver.req
客户端文件:
/etc/openvpn/client/easy-rsa/easyrsa3/pki/private/xgserver.key
/etc/openvpn/client/easy-rsa/easyrsa3/pki/reqs/xgserver.req
10、 复制文件
拷贝服务器密钥及证书等到openvpn目录
cp /etc/openvpn/server/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/server
cp /etc/openvpn/server/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/server
cp /etc/openvpn/server/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/server
cp /etc/openvpn/server/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/server
拷贝客户端密钥及证书等到client目录
/etc/openvpn/client/easy-rsa/easyrsa3/pki/private/xgserver.key
/etc/openvpn/server/easy-rsa/easyrsa3/pki/ca.crt
/etc/openvpn/server/easy-rsa/easyrsa3/pki/issued/xgserver.crt
客户端文件通常需要拷贝到客户端,比如windows
注: 以上所有配置,可以深圳和香港×××服务器,基本一样,只是要注意客户端Common Name要保持不一样,以免混淆。
11、 服务器配置
深圳服务器与香港服务器配置上有些区别,
进到openvpn的解压目录:
cd openvpn-2.4.2 /sample/sample-config-files
cp server.conf /etc/openvpn #两台服务器都需要复制
深圳×××服务器配置:
vi server.conf #修改服务器端配置文件
management 127.0.0.1 1196 #管理接口
port 1195 #监听端口
proto udp #使用UDP封装协议
dev tun #tun设备
ca /etc/openvpn/server/ca.crt #指定根证书
cert /etc/openvpn/server/server.crt #指定服务器证书
key /etc/openvpn/server/server.key #指定服务器密钥
dh /etc/openvpn/server/dh.pem #DH
server 172.16.10.0 255.255.255.0 #×××客户端IP
ifconfig-pool-persist ipp.txt
push "route 10.99.0.0 255.255.255.0" #推送路由给客户端
client-config-dir /etc/openvpn/ccd #指定定制化客户端的目录,用于控制客户端的权限
route 172.16.20.0 255.255.255.0 #在本机openvpn服务器上添加系统路由
client-to-client #允许客户端互访,默认只能客户端访问×××服务器
keepalive 10 120
cipher AES-128-CBC #加密协议
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
配置ccd,控制xgserver客户端配置
mkdir /etc/openvpn/ccd
vi xgserver #文件名必须跟客户端的Common Name相同,前文说过,这个客户端是安装在香港×××服务器上,用于拨入深圳×××服务器的,而连通香港和深圳网络;
添加如下内容:
ifconfig-push 172.16.10.250 172.16.10.249 #推送给客户端的IP地址;
iroute 172.16.20.0 255.255.255.0 #添加openvpn的路由,这里操作系统路由不同
注: 且看route 172.16.20.0 255.255.255.0 和 iroute 172.16.20.0 255.255.255.0,这两者之间有什么区别呢,为什么要同时配置呢?
答: 这两个参数非常重要,是×××两端的网络互联的关键;route和iroute参数,在这里分别控制着不同的路由,route是控制系统路由的,即给操作系统添加路由;iroute是控制系统路由之外的Openvpn内部路由,其本质是告诉openvpn通过对等方创建一条内部openvpn路由到达对端网络,每个客户端所在的网络并不相同,所以,这是每个客户端的配置;这就是openvpn的网对网的灵活之处,维护和定位每个客户端所在子网以及所连接的子网,可以任意控制客户端所在的子网访问或者不能互访,随意控制虚拟网络的终点和起点;
如何查看openvpn的内部路由呢?
在服务器上,打开Openvpn的管理端口,即management控制的参数;
telnet 127.0.0.1 1196
进入之后,再输入status,看如下:
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 172.16.20.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.99.0.0 255.255.255.0"
push "route 172.16.10.0 255.255.255.0"
client-to-client
keepalive 10 120
cipher AES-128-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
12、 开启路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0 改成 net.ipv4.ip_forward = 1
13、 iptables配置
/sbin/iptables -t nat -I POSTROUTING -s 172.16.20.0/255.255.255.0 -o ens33 -j MASQUERADE #对于来源为×××虚拟IP访问配置未指定的网络时,通过物理网口eth0的nat转发出去,通常是公网网络
iptables -I FORWARD 1 -j ACCEPT #默认转发是禁止的,允许转发;这条很重要,网上太多资料都没有这一条,不是本机的网络,要允许防火墙转发;
注:配置了以上策略,要记得保存iptables-save
14、 启动openvpn服务
深圳×××服务器:
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server/server.conf &
香港×××服务器:
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server/server.conf &
启动客户端(linux系统,在香港×××服务器上)
Linux下,客户端的安装方法,跟服务器端安装方法,不过,客户端不需要配置easy-rsa;
mkdir /etc/openvpn/szconnection
cp /software/openvpn-2.4.2/sample/sample-config-files/client.conf /etc/openvpn/szconncection/ #从openvpn源码包中,拷贝客户端配置文件;
把xgserver这个客户端的证书密钥 以及根证书拷贝这个目录(具体文件,请参照 10、 复制文件的客户端证书和密钥所提到的三个文件,通过一些方法(比如scp)拷贝/etc/openvpn/szconncection/目录),最终目录如下:
配置文件内容如下:
client
dev tun
proto udp
remote 211.154.139.8 1094
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/szconnection/ca.crt
cert /etc/openvpn/szconnection/xgserver.crt
key /etc/openvpn/szconnection/xgserver.key
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/szconnection/client.conf &
注: 这里启动 通常需要输入密码,linux无法保存此密码,下面提供了一个脚本可以保存密码,供参考;
脚本内容:
#!/usr/bin/expect
set timeout 30
spawn /usr/local/openvpn/sbin/openvpn --config /etc/openvpn/szconnection/client.conf
expect "Password:" { send "WIN2net\r" }
expect eof
注: 需要先安装expect
15、 客户端安装
客户端的安装,非常简单,可以自行百度,也可以参考其他博客;
16、 测试
从客户端网络A中,任意一台PC安装×××客户端,ping服务器网络B网段,在服务器网络B中,有一台windows服务器,其IP是10.99.0.10;
先在windows服务器,添加路由:
route add –p 172.16.20.0 mask 255.255.255.0 10.99.0.12
然后从客户端网络A中,ping 10.99.0.10