模拟kube-ovn创建自定义vpc网关流程

拓扑信息:

一个逻辑路由器lr1

两个逻辑交换机ls1和ls2

分别在两个逻辑交换机上创建了两个端口,并将端口放入了网络命名空间vm1和vm2中

在ls2上创建了ovn0端口作为整个vpc的网关,并将ovn0放入了gw网络命名空间中

以ens38物理网卡创建了macvlan模式的网卡ens38.100并将创建的虚拟网卡放入了gw网络命名空间中

ovn0作为整个vpc的网关内部网卡,ens38.100作为网关的外部网卡,从而实现了网关功能

创建vpc拓扑

master节点
ovn-nbctl ls-add ls1
ovn-nbctl ls-add ls2
ovn-nbctl lr-add lr1

ovn-nbctl lrp-add lr1 lr1-ls1 00:00:00:00:00:01 10.10.10.1/24

ovn-nbctl lsp-add ls1 ls1-lr1
ovn-nbctl lsp-set-type ls1-lr1 router
ovn-nbctl lsp-set-addresses ls1-lr1 00:00:00:00:00:01
ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1

ovn-nbctl lrp-add lr1 lr1-ls2 00:00:00:00:00:02 10.10.20.1/24

ovn-nbctl lsp-add ls2 ls2-lr1
ovn-nbctl lsp-set-type ls2-lr1 router
ovn-nbctl lsp-set-addresses ls2-lr1 00:00:00:00:00:02
ovn-nbctl lsp-set-options ls2-lr1 router-port=lr1-ls2

ovn-nbctl lsp-add ls1 ls1-vm1
ovn-nbctl lsp-set-addresses ls1-vm1 "00:00:00:00:00:03 10.10.10.2"

ovn-nbctl lsp-add ls1 ls1-vm2
ovn-nbctl lsp-set-addresses ls1-vm2 "00:00:00:00:00:04 10.10.10.3"

ovn-nbctl lsp-add ls2 ls2-vm1
ovn-nbctl lsp-set-addresses ls2-vm1 "00:00:00:00:00:03 10.10.20.2"

ovn-nbctl lsp-add ls2 ls2-vm2
ovn-nbctl lsp-set-addresses ls2-vm2 "00:00:00:00:00:04 10.10.20.3"


ip netns add vm1
ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
ip link set vm1 netns vm1
ip netns exec vm1 ip link set vm1 address 00:00:00:00:00:03
ip netns exec vm1 ip addr add 10.10.10.2/24 dev vm1
ip netns exec vm1 ip link set vm1 up
ip netns exec vm1 ip route add default via 10.10.10.1 dev vm1
ovs-vsctl set Interface vm1 external_ids:iface-id=ls1-vm1


ip netns add vm2
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
ip link set vm2 netns vm2
ip netns exec vm2 ip link set vm2 address 00:00:00:00:00:04
ip netns exec vm2 ip addr add 10.10.10.3/24 dev vm2
ip netns exec vm2 ip link set vm2 up
ip netns exec vm2 ip route add default via 10.10.10.1 dev vm2
ovs-vsctl set Interface vm2 external_ids:iface-id=ls1-vm2


master清除环境
ovs-vsctl del-port br-int vm1
ovs-vsctl del-port br-int vm2
ip netns del vm1
ip netns del vm2
ovn-nbctl ls-del ls1
ovn-nbctl ls-del ls2
ovn-nbctl lr-del lr1


node1节点
ip netns add vm1
ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
ip link set vm1 netns vm1
ip netns exec vm1 ip link set vm1 address 00:00:00:00:00:03
ip netns exec vm1 ip addr add 10.10.20.2/24 dev vm1
ip netns exec vm1 ip link set vm1 up
ip netns exec vm1 ip route add default via 10.10.20.1 dev vm1
ovs-vsctl set Interface vm1 external_ids:iface-id=ls2-vm1


ip netns add vm2
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
ip link set vm2 netns vm2
ip netns exec vm2 ip link set vm2 address 00:00:00:00:00:04
ip netns exec vm2 ip addr add 10.10.20.3/24 dev vm2
ip netns exec vm2 ip link set vm2 up
ip netns exec vm2 ip route add default via 10.10.20.1 dev vm2
ovs-vsctl set Interface vm2 external_ids:iface-id=ls2-vm2

node1清除
ovs-vsctl del-port br-int vm1
ovs-vsctl del-port br-int vm2
ip netns del vm1
ip netns del vm2

创建网关命名空间

这个网络命名空间作为整个vpc的网关,会根据虚拟机的一个物理网卡使用macvlan虚拟出一个新的网卡,并将虚拟出的网卡放入整个网络命名空间中并设置外部网络的地址作为外部网关ip地址

master节点
# 创建网关命名空间gw
ip netns add gw
# 给物理网卡ens38创建macvlan网卡
ip link add link ens38 name ens38.100 type macvlan mode bridge
# 将创建的macvlan网卡加入到网络命名空间
ip link set ens38.100 netns gw
# 设置网卡ip地址
ip netns exec  gw ip addr add 192.168.40.150/24 dev ens38.100
ip netns exec  gw ip link set ens38.100 promisc on
ip netns exec  gw ip link set ens38.100 up

master清理
ip netns del gw

创建内部网关网卡

创建一个vpc内部子网的ip地址,并将整个ip地址放入网关网络命名空间中,并配置地址,此时的gw网络命名空间中有了两个网卡,一个是连接外部网络的ens38.100网卡,另一个是连接vpc内部网络的ovn0网卡

master节点
ovn-nbctl lsp-add ls2 gw-nic
ovn-nbctl lsp-set-addresses gw-nic "00:00:00:00:00:14 10.10.20.254"

ovs-vsctl add-port br-int ovn0 -- set Interface ovn0 type=internal
ovs-vsctl set Interface ovn0  external_ids:iface-id=gw-nic

ip link set ovn0 netns gw
ip netns exec gw ip link set ovn0 address 00:00:00:00:00:14
ip netns exec gw ip addr add 10.10.20.254/24 dev ovn0
ip netns exec gw ip link set ovn0 up
ip netns exec gw ip route add default via 10.10.20.1 dev ovn0


master清理
ovs-vsctl del-port br-int ovn0

添加路由

在vpc的逻辑路由器上添加了静态路由,这个静态路由会将访问外界的报文都转发到10.10.20.254上,10.10.20.254是gw的地址,因此通过这条路由便会将外部的流量引入到gw网关中

master节点
ovn-nbctl   lr-route-add  lr1   0.0.0.0/0  10.10.20.254

添加gw的snat和dnat规则创建了fip

在gw网络命名空间中添加了dnat和snat规则,通过dnat和snat规则使内部的ip 10.10.10.2 和外部的ip 192.168.40.150相绑定,在外部可以直接访问192.168.40.150从而访问到vpc内部的网络

master节点
ip netns exec  gw iptables -t nat -A POSTROUTING  -s 10.10.10.2  -j SNAT --to-source 192.168.40.150
ip netns exec  gw iptables -t nat -A PREROUTING  -d 192.168.40.150 -j DNAT --to-destination 10.10.10.2

在经过prerouting点后会经过路由,然后到达forward,然后是进行arp解析,最后选择从哪个口发出去

验证

ovn内部的网络访问外部网络

  1. master节点的vm1访问外部网络

  2. 在gw网络命名空间的ovn0上抓包,此时还没有经过snat转换,源ip仍然是10.10.10.2

  3. 在gw网络命名空间的ens38.100网卡上抓包,到这个网卡上是已经经过了snat转换了,这里的master就是192.168.40.150

  4. 在外部网络的网卡上抓包,可以看到收到了报文并且报文的源ip是192.168.40.150,是经过snat后的ip

总结:从vm1访问外网的流程是,报文先通过ovn的静态路由将报文发送到gw网络命名空间的ovn0网卡,经过prerouting(没有修改报文),再经过路由判断(报文不是发送给自己的),会进入postrouting进行snat转换,将原本报文的源ip地址10.10.10.2转换为192.168.40.150,从ens38.100网卡发送出去

外部访问内部网络

  1. 在一台外部的机器上ping 192.168.40.150

  2. 在gw的ens38.100网卡上抓包,此时目的ip还没有转换目的ip是master即是192.168.40.150

  3. 在gw的ovn0上抓包,此时经过了dnat转换了,目的ip变成了10.10.10.2

  4. 在vm1上进行抓包

总结:192.168.40.150相当于vm1的一个外网ip,外界可以直接访问192.168.40.150从而直接访问到vm1,具体的流程是报文首先到达gw的ens38.100网卡,在prerouting中进行了dnat转换,将报文的目的地址转换成了10.10.10.2,再经过路由判断是进行转发的,将报文从ovn0发出进入到ovn网络了,最终到达vm1

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值