openVPN + VPP = openVPP

18f81a2bb660fd92bd7fd79fd485f1a8.gif

正文共:1666 字 29 图,预估阅读时间:3 分钟

我们设想这么一种场景,某公司总部设备VPP72使用专线接入互联网,具有公网IP地址;该公司分支设备VPP73使用普通网络,不具有公网IP地址,同时向总部设备建立穿越NAT设备的IPsec VPN隧道;同时有居家办公的员工使用openVPN接入公司网络,需要和分支的设备进行互通。

考虑到主要组件是openVPN和VPP,那我们姑且就将这种方案叫做openVPP方案吧!

aec3fa869b90ff792a83ba06b09f964a.png

openVPP的组网示意图和互访流量示意图如下:

90f62f25af02222362bc93496e53c2db.png

这里面涉及的接口配置、IPsec配置、openVPN配置和NAT配置,我们前面都已经做过详细介绍,现在只要进行整合,即可实现网络互通。各部分配置如下:

ab86f825d2e1783dbcf2eeab816b850e.png

VPP接口配置

511a053c5251b7f6be89597ad00f74d0.png

我们计划使用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

dff1292d56e5a7258e71f3da1c764de8.png

在内核创建一个veth接口,一端命名为ethvpp,另一端命名为ethhost。

ip link add name ethvpp type veth peer name ethhost

621f8a392859f0778dfcd6db6fe9826f.png

然后使能veth两端的接口ethhost@ethvpp和ethvpp@ethhost。

ip link set dev ethvpp up
ip link set dev ethhost up

b491d6e6deb98c992195f3763ec92b68.png

接口UP起来之后,我们给内核中的ethhost接口分配一个IP地址。

ip addr add 172.16.1.1/24 dev ethhost

1b09d00a44b31c46a8819327d8136c5b.png

在VPP内也创建一个接口,来连接到ethvpp的主机接口。

vppctl create host-interface name ethvpp

1aa1d5463e0b7fdb89cff647a45601e1.png

然后手工使能接口host-ethvpp,并配置IP地址。

vppctl set interface state host-ethvpp up
vppctl set int ip address host-ethvpp 172.16.1.2/24

73cbd9d7d90719528fadc8e4de45637a.png

然后从内核中测试一下172.16.1.2的连通性。

eddf96573e182999964ba4ff6fe41e71.png

ff80e50a01bc4f8e5bb3579949b2898a.png

openVPN配置

84c2fa4f236db921a2bc883f105b261e.png

首先在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

73ff65c3b80eb87c82e2f78c7e2c05a1.png

修改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

d3cafb2346db2fe3e2f51b1fe554353d.png

创建根证书,用于CA(Certificate Authority,证书颁发机构)对之后生成的server和client证书签名时使用。使用nopass参数,不对CA密钥进行加密,这样在签署证书时就可以跳过密码验证。

./easyrsa build-ca nopass

be57c3465e1bb319b4c305d34885bc47.png

创建服务器端证书,同样指定nopass参数,不对私钥进行加密。

./easyrsa gen-req tiejunge nopass

3273ba25f0c1863d342974628bfd694e.png

给服务器端证书tiejunge进行签名。

./easyrsa sign-req server tiejunge

6933e365a1e268b4696a7456892072f3.png

然后创建Diffie-Hellman文件,也就是秘钥交换时的DH算法,确保密钥可以穿越不安全网络。生成时间比较长,请耐心等待生成结束。

./easyrsa gen-dh

9e2e1d00c4d95db64cd0620a47cbd955.png

接下来创建客户端的证书,同样指定nopass参数表示不对私钥进行加密。

./easyrsa gen-req tietouge nopass

3e66fd5af2e88f7eca97ba17442ccf5b.png

给客户端证书tietouge进行签名。

./easyrsa sign-req client tietouge

41154064db5deb5448d452eb8d75e836.png

梳理一下生成的证书信息,把服务器端的必要文件(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/

0632eb698f66af706bcb525531afd79b.png

把客户端的必要文件(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

6859e7fc0ade507c7082f771fe172e85.png

使能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

20e8dccb2429668ffc28d88809e2cbda.png

然后重新加载系统服务,启动openvpn服务并使能开机启动。

systemctl daemon-reload
systemctl start openvpn
systemctl enable openvpn
systemctl status openvpn

431a6a04b8bd9e9e071488699e44311f.png

查看openVPN的端口监听状态:

ss -atnp |grep 44331
ss -atnp |grep openvpn

c8a2aed10958a01135f766633131b4f7.png

openVPN网关服务器运行状态正常。

052d4fcd5a88494b079166704dab0543.png

NAT配置

bbd651368fce967803447db43e0ba2e7.png

我们要使用内核中的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

62d72767db871d82dd7b327d8aa58445.png

67e8c023ca2f8193363a55900ffca86c.png

连接客户端

3090969d43ce8ef0113a9c413b6223cf.png

我们已经介绍过了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

2b9fceae805946f2c5dd362c48a931f1.png

再使用命令触发连接就可以了。

openvpn /etc/openvpn/client/tietouge.ovpn &

a5b7363bfc894bf75e8caab37ae9c00d.png

cc8507b31f918c572ef2d6350ae38fbb.png

IPsec VPN配置

45cf2541ed15045521433043d86d3fe6.png

配置参考VPP配置指南:穿越NAT的IPsec VPN配置及性能测试

ef9ad80d09d43b56d32f3f1986a9b2a4.png

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

e3273961b6225353ea1aa1ab0bb9b2a1.png

d9f8cc152daa2dd50db82f449fbbbea5.png

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

6247c0a48560dcca4e1bdb72cbf6cfe7.png

30a7a8769e84e875fe7755449c55ab57.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

212ab8796af7a7687ecde2d7fb528b6c.png

验证配置

259c507e7297a20563eb8d552bec48c2.png

配置完成之后我们就可以测试从PCA到PCB的访问了。

c217aee5b118f886a46741f7e033b504.png

可以看到,访问成功。但是中间有2跳没有显示,这里10.153.214.1的下一跳应该是VPP72的ethvpp接口,再下一跳是VPP73的120.1.1.2接口,最后是PCB主机。其实10.153.214.1和172.16.1.2应该算是1跳,毕竟是在一台设备上。

最后简单测试一下“openVPP”的性能如何。

67767618da3ae2cbfadf45948cd20f2d.png

最终测得带宽为600 Mbps,最高值为805 Mbps,结合之前openVPN测得的576 Mbps、IPsec VPN测得的1.69 Gbps的性能,瓶颈应该是在openVPN了。

0b06cc3a184a1df42008343649b31bee.gif

长按二维码
关注我们吧

2ca588159f1be0b83304eb9b053b3b62.jpeg

911d75673f4e0d46e690d73379d5e44c.png

VPP配置指南:基于IKEv2的IPsec VPN

VPP配置指南:穿越NAT的IPsec VPN配置及性能测试

openVPN服务器配置的31个关键点

使用Easy-RSA配置生成SSL证书

openVPN连接操作指南

巧用openVPN实现访问云资源池业务

带内网络管理和带外网络管理有啥区别?

如何配置实现VPP的远程登录?

IPsec VPN文章及知识点汇总【墙裂建议收藏】

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Danileaf_Guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值