加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

基于Linux内核新特性的网关设计实践

发布时间:2019-04-02 10:31:29 所属栏目:Windows 来源:UCloud 文旭
导读:UCloud 外网网关是为了承载外网IP、负载均衡等产品的外网出入向流量,当前基于 Linux 内核的 OVS/GRE 隧道/netns/iptables 等实现,很好地支撑了现有业务。同时,我们也在不断跟踪 Linux 内核社区的新技术发展,并将之用于下一代外网网关的设计。这些新特

问题定位:查看代码发现,原方向和反方向首报文进入协议堆栈后 skb->dev 会设置为 vrf device user1,创建流卸载规则的 iif 就是 user1。但是卸载规则下发在 eth0 和 eth1 的 ingress 钩子上,所以后续报文在 eth0 和 eth1 的 ingress 钩子上不能匹配流规则规则。

提交补丁:

  • netfilter: nft_flow_offload: fix interaction with vrf slave device

最终,我们根据两个方向查找路由的结果,设置流卸载规则的 iifoif 信息来解决此问题。

6、VRF PREROUTING 钩子重入问题

问题描述:配置网卡加入 VRF,防火墙 ingress 方向规则为接收目的地址 2.2.2.11 、TCP 目的端口 22 的报文,egress 方向规则为丢弃 TCP 目的端口 22 的报文。出现异常结果: 收到目的地址 2.2.2.11 TCP 22 目的端口的报文却被丢弃。

问题定位:研究发现网卡加入 VRF 后收到的报文会两次进入 PREROUTING 钩子,因为在进入 IP 栈时会进第一次PREROUTING 钩子,然后被 VRF 设备接管后会再次进入 PREROUTING 钩子。上述规则第一次在 rule-1000-ingress chain中 dst nat 为 10.0.0.7,第二次由于报文被 DNAT 后会错误的进入 rule-1000-egress,导致报文被丢弃。

提交补丁:我们给内核加了一个支持判断网卡类型的 match 项目,让用户态避免可知的第二次无效重入,内核态和用户态 nftables 分别提交了如下的补丁:

  • netfilter: nft_meta: Add NFT_META_I/OIFKIND meta type
  • meta: add iifkind and oifkind support

使用方法:

  1. nft add rule firewall rules-all meta iifkind "vrf" counter accept

原型验证

最终,我们成功地利用 lwtunnel、VRF 和流卸载实现多租户外网网关的原型验证。验证过程如下:

1、首先创建原型环境

a. netns cl 模拟外网客户端,地址为 1.1.1.7,隧道源地址 172.168.0.7,配置发送路由;
b. netns ns1 模拟租户 1,内网地址为 10.0.0.7,外网地址为 2.2.2.11,隧道源地址 172.168.0.11 tunnel_key 1000,配置发送路由;
c. netns ns2 模拟租户 2,内网地址为 10.0.0.7,外网地址为 2.2.2.12,隧道源地址 172.168.0.12 tunnel_key 2000,配置发送路由;
d. Host 模拟外网网关,隧道源地址 172.168.0.1,创建租户 VRF user1 和 use2,创建租户 IP 隧道 tun1 和 tun2,配置转发路由。

原型环境图如下:

基于Linux内核新特性的网关设计实践

2、创建防火墙规则

a. 租户 1 入向允许 TCP 目的端口 22 和 ICMP 访问,出向禁止访问外部 TCP 22 目的端口;
b. 租户 2 入向允许 TCP 端口 23 和 ICMP 访问,出向禁止访问外部 TCP 23 目的端口;
c. 在租户 tun1 和 tun2 设备上支持流卸载。

最终,客户端可以通过 2.2.2.11 成功访问 user1 tcp 22 端口服务,user1 不能访问客户端 tcp 22 端口服务;客户端可以通过 2.2.2.12 成功访问 user2 tcp 23 端口服务,user1 不能访问客户端 tcp 23 端口服务。

在后续硬件功能完善以及网卡厂商支持后,我们还会做进一步的开发验证。

写在最后

以上是本项目涉及的部分核心问题,这些补丁特性都可以在 Linux 内核 5.0 版本里获取。我们把这期间为 Linux 内核社区贡献的补丁整理成了一份列表,希望能为开发者提供帮助,读者可以点击阅览。

Linux 作为成熟的开源套件,一直是云厂商使用的主流操作系统,但在技术的更新迭代过程中,一些新特性在实际应用上也会存在稳定性、兼容性等方面的问题。我们在研究使用上游技术的同时,也一直积极探索、丰富开源技术功能,帮助提高开源技术稳定性。并将产出持续回馈给社区,与社区共同构建一个繁荣的开源生态。

【编辑推荐】

  1. Linux系统线上故障排查的几种技巧
  2. 10款你可以通过Wine在Linux上玩的游戏
  3. 使用Arch Linux镜像列表管理器来管理你的镜像
  4. 新版 Edge 浏览器或将拥有两个不同的浏览器内核
  5. Linux问题故障定位,看这一篇就够了
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读