赞
踩
正文共:1666 字 29 图,预估阅读时间:3 分钟
我们设想这么一种场景,某公司总部设备VPP72使用专线接入互联网,具有公网IP地址;该公司分支设备VPP73使用普通网络,不具有公网IP地址,同时向总部设备建立穿越NAT设备的IPsec VPN隧道;同时有居家办公的员工使用openVPN接入公司网络,需要和分支的设备进行互通。
考虑到主要组件是openVPN和VPP,那我们姑且就将这种方案叫做openVPP方案吧!
openVPP的组网示意图和互访流量示意图如下:
这里面涉及的接口配置、IPsec配置、openVPN配置和NAT配置,我们前面都已经做过详细介绍,现在只要进行整合,即可实现网络互通。各部分配置如下:
VPP接口配置
我们计划使用VPP72的公网接口ETH1来接入openVPN用户,需要配置VPP和内核的互通(给VPP增加一个接口(非DPDK方式)),首先给eth1配置IP地址。
- vppctl set int state eth1 up
- vppctl set int ip address eth1 12.1.1.2/24
在内核创建一个veth接口,一端命名为ethvpp,另一端命名为ethhost。
ip link add name ethvpp type veth peer name ethhost
然后使能veth两端的接口ethhost@ethvpp和ethvpp@ethhost。
- ip link set dev ethvpp up
- ip link set dev ethhost up
接口UP起来之后,我们给内核中的ethhost接口分配一个IP地址。
ip addr add 172.16.1.1/24 dev ethhost
在VPP内也创建一个接口,来连接到ethvpp的主机接口。
vppctl create host-interface name ethvpp
然后手工使能接口host-ethvpp,并配置IP地址。
- vppctl set interface state host-ethvpp up
- vppctl set int ip address host-ethvpp 172.16.1.2/24
然后从内核中测试一下172.16.1.2的连通性。
openVPN配置
首先在VPP72上同时安装openVPN和Easy-RSA(巧用openVPN实现访问云资源池业务),把/usr/share/easy-rsa/3.0.8/这个目录复制到/etc/openvpn/,同时复制一个机构配置文件到easyrsa所在的路径下。
- yum install -y openvpn easy-rsa
- cp -r /usr/share/easy-rsa/3.0.8/ /etc/openvpn/easyrsa3/
- cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easyrsa3/vars
修改vars文件中的机构信息字段,也可以直接添加。
- set_var EASYRSA_REQ_COUNTRY "CN"
- set_var EASYRSA_REQ_PROVINCE "Beijing"
- set_var EASYRSA_REQ_CITY "Haidian"
- set_var EASYRSA_REQ_ORG "TIETOU TECH"
- set_var EASYRSA_REQ_EMAIL "tietou@h3cadmin.cn"
- set_var EASYRSA_REQ_OU "Tietou openVPN"
切换到/etc/openvpn/easyrsa3/目录下,初始化PKI(Public Key Infrastructure,公钥基础设施)信息。(使用Easy-RSA配置生成SSL证书)
./easyrsa init-pki
创建根证书,用于CA(Certificate Authority,证书颁发机构)对之后生成的server和client证书签名时使用。使用nopass参数,不对CA密钥进行加密,这样在签署证书时就可以跳过密码验证。
./easyrsa build-ca nopass
创建服务器端证书,同样指定nopass参数,不对私钥进行加密。
./easyrsa gen-req tiejunge nopass
给服务器端证书tiejunge进行签名。
./easyrsa sign-req server tiejunge
然后创建Diffie-Hellman文件,也就是秘钥交换时的DH算法,确保密钥可以穿越不安全网络。生成时间比较长,请耐心等待生成结束。
./easyrsa gen-dh
接下来创建客户端的证书,同样指定nopass参数表示不对私钥进行加密。
./easyrsa gen-req tietouge nopass
给客户端证书tietouge进行签名。
./easyrsa sign-req client tietouge
梳理一下生成的证书信息,把服务器端的必要文件(ca.crt、dh.pem、tiejunge.crt、tiejunge.key)复制到/etc/openvpn/server/目录下。
- cp /etc/openvpn/easyrsa3/pki/ca.crt /etc/openvpn/server/
- cp /etc/openvpn/easyrsa3/pki/dh.pem /etc/openvpn/server/
- cp /etc/openvpn/easyrsa3/pki/issued/tiejunge.crt /etc/openvpn/server/
- cp /etc/openvpn/easyrsa3/pki/private/tiejunge.key /etc/openvpn/server/
把客户端的必要文件(ca.crt、tietouge.crt、tietouge.key)下载到本地。
在/etc/openvpn/server/目录下新建一个openVPN的配置文件server.conf,配置文件内容如下:
- local 0.0.0.0
- proto tcp
- port 44331
- dev tun
- ca /etc/openvpn/server/ca.crt
- cert /etc/openvpn/server/tiejunge.crt
- key /etc/openvpn/server/tiejunge.key
- dh /etc/openvpn/server/dh.pem
- topology subnet
- server 10.153.214.0 255.255.255.0
- push "route 22.1.1.0 255.255.255.0"
- duplicate-cn
- keepalive 20 120
- persist-key
- persist-tun
使能Linux的内核转发,并开启主机的NAT功能。
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A POSTROUTING -o ethhost -j MASQUERADE
创建openvpn服务的启动文件。
- vi /etc/systemd/system/openvpn.service
- [Unit]
- Description=OpenVPN Server
- After=network.target
- After=syslog.target
- [Install]
- WantedBy=multi-user.target
- [Service]
- ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.conf
然后重新加载系统服务,启动openvpn服务并使能开机启动。
- systemctl daemon-reload
- systemctl start openvpn
- systemctl enable openvpn
- systemctl status openvpn
查看openVPN的端口监听状态:
- ss -atnp |grep 44331
- ss -atnp |grep openvpn
openVPN网关服务器运行状态正常。
NAT配置
我们要使用内核中的ethhost来作为openVPN的网关,接下来要在VPP中配置映射(VPP配置指南:NAT“三板斧”),将访问12.1.1.2的10086的流量映射到172.16.1.1。
- vppctl set interface nat44 out eth1 output-feature
- vppctl nat44 add interface address eth1
- vppctl nat44 add identity mapping 12.1.1.2
- vppctl nat44 add static mapping tcp local 172.16.1.1 44331 external 12.1.1.2 44331
- vppctl nat44 add static mapping tcp local 172.16.1.1 44331 external eth1 44331
连接客户端
我们已经介绍过了Windows系统(openVPN连接操作指南)、Linux-CentOS系统(openVPN的Linux客户端竟然比Windows客户端性能高5倍不止)、macOS系统和Android系统(openVPN客户端配置之macOS、Android操作指南)的openVPN客户端安装,今天使用Linux-CentOS系统进行测试。
同样在客户端部署openVPN,使用其客户端角色进行配置,将前面生成的3个证书导入到/etc/openvpn/client/目录下。然后在同目录下,新建一个客户端配置文件tietouge.ovpn,内容如下所示:
- client
- dev tun
- proto tcp
- remote 12.1.1.2 44331
- ca /etc/openvpn/client/ca.crt
- cert /etc/openvpn/client/tietouge.crt
- key /etc/openvpn/client/tietouge.key
- nobind
- resolv-retry infinite
- persist-key
- persist-tun
- verb 4
再使用命令触发连接就可以了。
openvpn /etc/openvpn/client/tietouge.ovpn &
IPsec VPN配置
配置参考(VPP配置指南:穿越NAT的IPsec VPN配置及性能测试)。
VPP72
- vppctl ikev2 profile add openvpp
- vppctl ikev2 profile set openvpp auth shared-key-mic string openvpp
- vppctl ikev2 profile set openvpp id local ip4-addr 12.1.1.2
- vppctl ikev2 profile set openvpp id remote fqdn vpp73
- vppctl ikev2 profile set openvpp traffic-selector local ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
- vppctl ikev2 profile set openvpp traffic-selector remote ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
- vppctl set interface state ipip0 up
- vppctl set interface ip address ipip0 120.1.1.1/24
- vppctl ip route add 22.1.1.0/24 via 120.1.1.2 ipip0
VPP73
- vppctl set int state eth1 up
- vppctl set int ip address eth1 13.1.1.3/24
- vppctl set int state eth2 up
- vppctl set int ip address eth2 22.1.1.1/24
- vppctl ip route add 12.1.1.0/24 via 13.1.1.1
- vppctl ikev2 profile add openvpp
- vppctl ikev2 profile set openvpp auth shared-key-mic string openvpp
- vppctl ikev2 profile set openvpp id local fqdn vpp73
- vppctl ikev2 profile set openvpp id remote ip4-addr 12.1.1.2
- vppctl ikev2 profile set openvpp traffic-selector local ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
- vppctl ikev2 profile set openvpp traffic-selector remote ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
- vppctl ikev2 profile set openvpp responder eth1 12.1.1.2
- vppctl ikev2 profile set openvpp ike-crypto-alg aes-cbc 256 ike-integ-alg sha1-96 ike-dh modp-2048
- vppctl ikev2 profile set openvpp esp-crypto-alg aes-cbc 256 esp-integ-alg sha1-96 esp-dh ecp-256
- vppctl ikev2 profile set openvpp sa-lifetime 3600 10 5 0
- vppctl ikev2 initiate sa-init openvpp
- vppctl set interface state ipip0 up
- vppctl set interface ip address ipip0 120.1.1.2/24
- vppctl ip route add 172.16.1.0/24 via 120.1.1.1 ipip0
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
ISP
- #
- interface GigabitEthernet2/0
- ip address 11.1.1.1 255.255.255.0
- #
- interface GigabitEthernet3/0
- ip address 12.1.1.1 255.255.255.0
- nat outbound
- #
- interface GigabitEthernet4/0
- ip address 13.1.1.1 255.255.255.0
验证配置
配置完成之后我们就可以测试从PCA到PCB的访问了。
可以看到,访问成功。但是中间有2跳没有显示,这里10.153.214.1的下一跳应该是VPP72的ethvpp接口,再下一跳是VPP73的120.1.1.2接口,最后是PCB主机。其实10.153.214.1和172.16.1.2应该算是1跳,毕竟是在一台设备上。
最后简单测试一下“openVPP”的性能如何。
最终测得带宽为600 Mbps,最高值为805 Mbps,结合之前openVPN测得的576 Mbps、IPsec VPN测得的1.69 Gbps的性能,瓶颈应该是在openVPN了。
长按二维码
关注我们吧
VPP配置指南:穿越NAT的IPsec VPN配置及性能测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。