找回密码
 立即注册
首页 业界区 业界 [解决方案] 回顾一下业务中的网络技术演化 ...

[解决方案] 回顾一下业务中的网络技术演化

姨番单 7 天前
回顾一下业务中的网络技术演化

这个版本解决了一个几年前遗留的网络问题,近期可能不会再对网络相关的模块进行迭代了,这里回顾一下这些年网络相关技术在业务中的迭代。
背景

业务的枢纽为 感知攻击者入侵的欺骗服务,处于枢纽之后核心功能为 服务管理入侵行为分析,处于枢纽之前的核心功能为 引流
引流的目的为扩大感知面,增加攻击者入侵感知的几率,这部分功能和网络关联比较多,所以这里聚焦网络相关基础功能和随业务迭代变更。

  • 引流模块基础模块

    • 宿主机虚拟 IP 引流
    • 服务器部署代理节点引流
    • 交换机侧虚拟网络引流

  • 业务迭代变更

    • 内部化 VM IP
    • 业务架构调整

      • 如何访问新架构的欺骗服务
      • 异构问题如何解决
      • 如何对恶意流量进行分析


引流模块基础模块

三种引流模块是从宿主机一层层往外扩展的叠加,是产品网络相关的基础形态。
宿主机虚拟 IP 引流

在宿主机上配置多个虚拟 IP,并通过 iptables DNAT 规则将访问这些IP的流量透明转发至欺骗服务。
背景

服务位于虚拟机中(安全性考虑),监听特定端口,虚拟机使用桥接方式连接到宿主机。带来的限制:欺骗服务只能通过虚拟机的 IP 地址访问,链路只有一条
考虑如何在宿主机内增加访问这个欺骗服务的链路

  • 增加 IP 并且将这个 IP 的流量重定向到欺骗服务所在虚拟机中
  • 增加流量代理,将流量代理至欺骗服务的端口上
业务采取的是第一种方式,增加虚拟IP并且使用 iptables 将流量 DNAT 至虚拟机上,这样可以保持服务感知的源地址不变
实现

增加的虚拟 IP 有几种方式,早期业务使用第二种方式

  • 直接在物理网卡上增加 IP
  • 使用 macvlan 虚拟网卡,然后再虚拟网上添加 IP
  • 使用 netns 隔离 IP,每个 IP 独占一个命名空间以及 MAC 地址
选择第二种方案是:第一种方案过于简陋,第三种方案未采用是由于当时对网络命名空间不熟悉。
创建网卡,添加 IP
  1. $ ip link add link br0 name macvlan0 type macvlan
  2. $ ip link set macvlan0 up
  3. $ ip addr add 192.168.32.247/24 dev macvlan0
  4. $ ip addr show macvlan0
复制代码
增加 iptables DNAT 规则,将访问 192.168.32.247 的流量重定向至 192.168.32.245 上(虚拟机 IP)
  1. $ iptables -t nat -A PREROUTING -d 192.168.32.247/32 -j DNAT --to-destination 192.168.32.245
复制代码
前置条件
  1. $ iptables -P FORWARD ACCEPT
  2. $ sysctl -w net.ipv4.ip_forward=1
复制代码
在 iptables 的加持下,虚拟网卡只用于内核回复 ARP Request,后续的 TCP 通信流量不会经过这个网卡。
简单的网络拓扑如下,虚拟机使用桥接模式,在 DNAT 规则增加后,通过 192.168.32.247 也可以访问到虚拟机。
  1. ┌───────────────────────────────────────────┐
  2. │  Host                                     │
  3. │         ┌─────────────────┐               │
  4. │         │ vm1             │               │
  5. │         │ 192.168.32.245  │               │
  6. │         │       eth0      │               │
  7. │         └────────│────────┘               │
  8. │           ┌──> vnet1                      │
  9. │           │      │                        │
  10. │           │      │   192.168.32.247       │
  11. │      DNAT │      │ ─── macvlan0           │
  12. │           │      │                        │
  13. │           │      │                        │
  14. │           └──── br0  192.168.32.251       │
  15. └──────────────────│────────────────────────┘
  16.                   eth0
复制代码
服务器部署代理节点引流

通过部署代理节点 agent,监听指定IP地址及端口,并将接收到的流量代理至欺骗服务。
背景

目前在宿主机环境只能增加同网段的IP,那不同子网的 IP 如何引流?答:加一个流量代理
代理的 agent 部署在客户业务机器内,管理端将需要代理的规则下发至 agent,agent 监听端口并且将流量代理至欺骗服务。
这样存在一个问题:欺骗服务需要获取真实的的对端地址,简单的代理会丢失这个信息,拿到的对端地址是 agent 的本地地址。
对于 Service 而言,conn.RemoteAddr() 得到的结果是正确的,这是直连的结果。
  1.        conn        
  2. User <-------> Service
  3. ip1             ip3
复制代码
pconn.RemoteAddr() 得到的结果是代理 agent 地址,不符合期望
  1.        uconn           pconn        
  2. User <-------> Proxy <-------> Service
  3. ip1            ip2              ip3
复制代码
如何解决这个问题:宿主机增加一个网关服务,代理 agent 携带 uconn.RemoteAddr() 等相关元数据发送至网关服务,
网关服务收到元数据后增加 SNAT 规则并且将流量代理至欺骗服务,这样欺骗服务感知到的对端地址是真实的。
实现

使用自定义协议,在每个连接的头部增加

  • 8 字节魔数,用于区分内部连接
  • 对端地址
  • 需要转发的目的地址(欺骗服务)
增加 SNAT 的关键一步:建立 TCP 连接前,需要指定源地址,源 IP 取 HostIP(192.168.32.251),端口通过 net.Listen("tcp", "0.0.0.0:0") 提前分配,这样连接的五元组就固定下来,后面规则就是机械的参数填充了。
  1. $ iptables -t nat -A POSTROUTING -s 192.168.32.251/32 -p tcp -m tcp --sport 34162 -j SNAT --to-source 192.168.1.55:46421
复制代码
简单的网络拓扑如下,增加了 gateway 服务,接收来自 代理 agent 的流量,在代理连接建立之前增加 SNAT 规则。
  1. ┌─────────────────────────────────────────────────┐
  2. │  Host                                           │
  3. │               ┌─────────────────┐               │
  4. │               │ vm1             │               │
  5. │               │ 192.168.32.245  │               │
  6. │               │       eth0      │               │
  7. │               └────────│────────┘               │
  8. │         ┌──────────> vnet1                      │
  9. │         │       │      │                        │
  10. │         │       │      │   192.168.32.247       │
  11. │     SNAT│   DNAT│      │ ─── macvlan0           │
  12. │         │       │      │                        │
  13. │         │       │      │                        │
  14. │      Gateway    └──── br0  192.168.32.251       │
  15. └────────────────────────│────────────────────────┘
  16.                         eth0                       
复制代码
交换机侧虚拟网络引流

在核心交换机侧部署虚拟网络节点,创建虚拟 VLAN/VXLAN IP 并监听指定IP地址及端口,将流量代理至欺骗服务。
背景

继续扩大感知面,在代理节点 agent 的基础上,同网段、不同网段已经能够覆盖。
但是都是针对已存在的网段进行引流,这部分在整个网络中的比例是比较低的,如果可以覆盖到这些不存在的网络,那么可以极大增加感知面。
如何虚拟不存在的网络,这里涉及到交换机的一些原理(暂时不考虑 vxlan):

  • (二层)交换机通过 VLAN 创建一个独立的广播域
  • (三层)交换机为 VLAN 创建一个虚拟接口,并且为这个接口分配网关和掩码(192.168.1.1/24)
  • (三层)交换机包的路由查询,将数据包从目标网段对应的 VLAN 接口发送出去

    • ACCESS 接口,包出去的时候剥离 VLAN tag, 包进入则打上 VLAN tag
    • TRUNK 接口,可以收到所有的网络数据包

内核支持 vlan 虚拟网卡,可以使用内核对 vlan tag 解析封装和解封装。
实现

利用的交换机的特性,提前做一些操作

  • 分配 vlan 和对应的网段
  • 分配 trunk 口,这样该 trunk 口接入的服务器相当于核心交换机下的接入交换机
在接入的服务器内部署代理 agent 的基础上,只需要额外做一件事情:管理 vlan 网卡和 ip
早期没有接触过 netns,这些操作都是在 host 内完成的,这里不讨论过时的设计了。
遇到的一些问题和解决方案

  • 一个 agent 需同时接入交换机的 trunk 口,使用了 netns 隔离网络来解决,一个网段(一个 VLAN 可能存在多个网段)占用一个 netns。
  • 虚拟过万数量的 IP,按照之前 agent 的监听逻辑,一个 IPort 的监听就会占用一个 fd,使用 iptables+ipset DNAT 解决

    • IPort 存入 hash:ip,port 的 ipset 中
    • 使用一条 iptables 规则,匹配 ipset 将流量 DNAT 到一个监听地址上
    • 使用 netns 隔离 iptables 规则和监听地址,整体 fd 占用数量较少

整体方案如下:

  • 创建网桥,并且将物理网卡挂载在网桥上
  • 设置通信网卡及 IP,用于流量代理和规则获取,也挂在网桥上
  • 创建虚拟网络

    • 创建 netns
    • 创建 veth-peer,宿主空间挂载在网桥上,up 所有网卡
    • 在 netns 内部的 veth-peer 上创建虚拟 vlan 网卡,并且增加 ip
    • 在 netns 内创建 ipset,增加 iptables 规则

  • agent 切换命名空间,在 netns 内部监听端口(这样一个进程可以监听多个命名空间内的地址)
  1. # 创建网桥
  2. $ ip link add br1 type bridge
  3. $ ip link set br1 up
  4. $ ip lihk set eth0 master br1
  5. # 创建通信网卡,保持存在一个基础的 IP 和外界通信
  6. $ ip link add link br1 name veth0 type vlan id 100
  7. $ ip link set veth0 up
  8. $ ip addr add 192.168.100.100/24 dev veth0
  9. # 创建虚拟网络
  10. $ ip netns add ns1
  11. $ ip link add veth1 type veth peer name eth0 netns ns1
  12. $ ip netns exec ns1 ip link set eth0 up
  13. $ ip netns exec ns1 ip link set lo up
  14. $ ip link set veth1 up
  15. $ ip link set veth1 master br1
  16. # 设置虚拟 VLAN(100) 网卡和添加 IP
  17. $ ip netns exec ns1 ip link add link eth0 name vlan100 type vlan id 100
  18. $ ip netns exec ns1 ip link set vlan100 up
  19. $ ip netns exec ns1 ip addr add 192.168.110.2/24 dev vlan100
  20. $ ip netns exec ns1 ip route add default via 192.168.110.1 onlink dev vlan100
  21. #  新增 iptables/ipset 规则
  22. $ ip netns exec ns1 ipset create ipset1 hash:ip,port
  23. $ ip netns exec ns1 iptables -t nat -A PREROUTING -p tcp -m set --match-set ipset1 dst,dst -j DNAT --to-destination 127.0.0.1:5550
复制代码
遇到的一些问题

  • DNAT 127.0.0.1 需要开启 net.ipv4.conf.all.route_localnet=1
  • ipset 在 3.10 的内核上兼容性不好,没有区分宿主机和命名空间,只能通过命名进行区分解决
网络侧的代理网络拓扑如下
  1. ┌───────────────────────────────────────────────────────────────┐
  2. │ Host                                                          │
  3. │                   ┌─────────────────┐   ┌─────────────────┐   │
  4. │                   │ ns1             │   │ ns2             │   │
  5. │                   │                 │   │                 │   │
  6. │                   │  192.168.100.2  │   │  192.168.101.8  │   │
  7. │                   │     vlan100     │   │     vlan101     │   │
  8. │                   │        │        │   │        │        │   │
  9. │                   │       eth0      │   │       eth0      │   │
  10. │ 192.168.100.100   └────────│────────┘   └────────│────────┘   │
  11. │      veth0               veth1                 veth2          │
  12. │        │                   │                     │            │
  13. │        └───────────────────│─────────────────────┘            │
  14. │                            │                                  │
  15. │                           br0                                 │
  16. └────────────────────────────│──────────────────────────────────┘
  17.                             eth0     
复制代码
如果是多张网卡,那么保持基础通信的 IP,新增一个网桥连接虚拟网络和物理网卡即可,这样 ns1 和 ns2 就独立不受影响了
  1. ┌───────────────────────────────────────────────────────────────┐
  2. │ Host                                                          │
  3. │                   ┌─────────────────┐   ┌─────────────────┐   │
  4. │                   │ ns1             │   │ ns2             │   │
  5. │                   │                 │   │                 │   │
  6. │                   │  192.168.100.2  │   │  192.168.101.8  │   │
  7. │                   │     vlan100     │   │     vlan101     │   │
  8. │                   │        │        │   │        │        │   │
  9. │                   │       eth0      │   │       eth0      │   │
  10. │ 192.168.100.100   └────────│────────┘   └────────│────────┘   │
  11. │      veth0               veth1                 veth2          │
  12. │        │                   │                     │            │
  13. │        └───────────────────│                     │            │
  14. │                            │                     │            │
  15. │                           br1                   br2           │
  16. └────────────────────────────│─────────────────────│────────────┘
  17.                             eth0                  eth1
复制代码
vxlan 支持

同样需要交换机进行配置,另外使用 bgp 协议来动态控制路由,frr 提供这些功能,设置好 AS 号即可。
其他和网络相关的逻辑参考 几种通过 iproute2 来打通不同节点间容器网络的方式,关于 vxlan 如何跨节点通信,网络配置几乎相同。
完整的网络拓扑如下,vxlan 的命名空间对应一个网段,一个 vni 对应一个网桥,通过网桥连接命名空间和 vtep 设备。
  1. ┌─────────────────────────────────────────────────────────────────────────────────┐
  2. │ Host                                                                            │
  3. │                  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐  │
  4. │                  │ ns1             │  │ ns2             │  │ ns3             │  │
  5. │                  │                 │  │                 │  │                 │  │
  6. │                  │  192.168.100.2  │  │  192.168.101.8  │  │                 │  │
  7. │                  │     vlan100     │  │     vlan101     │  │                 │  │
  8. │                  │        │        │  │        │        │  │    10.1.0.10    │  │
  9. │                  │       eth0      │  │       eth0      │  │       eth0      │  │
  10. │ 192.168.100.100  └────────│────────┘  └────────│────────┘  └────────│────────┘  │
  11. │      veth0              veth1                veth2                veth3         │
  12. │        │                  │                    │                    │           │
  13. │        └──────────────────│                    │                    │── vtep1   │
  14. │                           │                    │                    │           │
  15. │                          br1                  br2                  br3          │
  16. └───────────────────────────│────────────────────│────────────────────────────────┘
  17.                            eth0                 eth1                 eth2         
  18.                             └────────────────────│────────────────────┘  
  19.                                                switch                                
复制代码
业务迭代变更

这部分是属于欺骗服务宿主机内部的变更逻辑,和前面几个技术点比起来没有那么纯粹,夹杂着业务逻辑。
这部分忽略前面三个引流部分,目前的网络拓扑为
  1. ┌───────────────────────────────────────────┐
  2. │  Host                                     │
  3. │         ┌─────────────────┐               │
  4. │         │ vm1             │               │
  5. │         │ 192.168.32.245  │               │
  6. │         │       eth0      │               │
  7. │         └────────│────────┘               │
  8. │                vnet1                      │
  9. │                  │                        │
  10. │                 br0  192.168.32.251       │
  11. └──────────────────│────────────────────────┘
  12.                   eth0
复制代码
内部化 VM IP

网络环境出现重复 IP 的情况下,对 vm 存活的判断可能出现错误而回收 vm。
将 vm 内部化来避免这个问题,如果 IP 访问失败也不会影响 vm 的状态,新增一个 br1 复用之前的多 IP DNAT 逻辑即可。
  1. ┌───────────────────────────────────────────┐
  2. │  Host                                     │
  3. │         ┌─────────────────┐               │
  4. │         │ vm1             │               │
  5. │         │   172.16.23.2   │               │
  6. │         │       eth0      │               │
  7. │         └────────│────────┘               │
  8. │            ┌── vnet1                      │
  9. │            │     │                        │
  10. │        DNAT│    br1  172.16.23.1          │
  11. │            │                              │
  12. │            └─── br0  192.168.32.251       │
  13. └──────────────────│────────────────────────┘
  14.                   eth0
复制代码
业务架构调整

现在由于性能和后面维护考虑,决定将 vm 中的欺骗服务移动至 docker 容器内

  • 出于安全性考虑,保留 vm(docker 相对 vm 更容易逃逸)
  • 性能更优,容器的占用远低于 vm,这样可以启动更多的欺骗服务
  • 可维护性更强,服务的部署逻辑都在 dockefile 中被持久化
  • windows 类型的 vm 保持不变
调整后的网络拓扑为一个异构网络架构,如下
  1. ┌───────────────────────────────────────────────────────────────┐
  2. │  Host                                                         │
  3. │        ┌─────────────────────────┐     ┌─────────────┐        │
  4. │        │ vm1                     │     │ vm2(win)    │        │
  5. │        │ ┌────────┐   ┌────────┐ │     │             │        │
  6. │        │ │10.1.0.2│   │10.1.0.3│ │     │             │        │
  7. │        │ │  eth0  │   │  eth0  │ │     │             │        │
  8. │        │ └───│────┘   └───│────┘ │     │             │        │
  9. │        │   veth1        veth2    │     │             │        │
  10. │        │     └──────│─────┘      │     │             │        │
  11. │        │         docker0         │     │             │        │
  12. │        │        10.1.0.1         │     │             │        │
  13. │        │                         │     │             │        │
  14. │        │        172.16.23.2      │     │ 172.16.23.3 │        │
  15. │        │           eth0          │     │     eth0    │        │
  16. │        └────────────│────────────┘     └──────│──────┘        │
  17. │                   vnet1                     vnet2             │
  18. │                     └───────────────│─────────┘               │
  19. │  192.168.32.251                    br1                        │
  20. │       br0                      172.16.23.1                    │
  21. └────────│──────────────────────────────────────────────────────┘
  22.         eth0                                          
复制代码
如何访问新架构的欺骗服务

之前访问欺骗服务的方式

  • 直接访问 IP,流量 DNAT 至 vm
  • 访问代理监听的端口,通过 gateway 转发至欺骗服务
如果把 gateway 的转发功能部署在 vm 里面,host 把所有的流量转发至 vm 内,那么可以复用之前 SNAT 规则。
如何将 host 内的流量转发至 vm?

  • 在交换机侧虚拟网络引流逻辑上,在命名空间内部有一条 iptables 规则把流量 DNAT 到一个端口上,对于 IP 的访问复用这个逻辑
  • 代理流量的访问,增加一个代理即可,对于欺骗服务而言都是透明的
调整后的流量链路如下:
  1. ┌───────────────────────────────────────────────────────────────┐
  2. │  Host                                                         │
  3. │        ┌─────────────────────────┐     ┌─────────────┐        │
  4. │        │ vm1                     │     │ vm2(win)    │        │
  5. │        │ ┌────────┐   ┌────────┐ │     │             │        │
  6. │        │ │  srv1  │   │  srv2  │ │     │     srv3    │        │
  7. │        │ │10.1.0.2│   │10.1.0.3│ │     │             │        │
  8. │        │ └───│────┘   └───│────┘ │     │ 172.16.23.3 │        │
  9. │        │     └──────│─────┘      │     └──────│──────┘        │
  10. │        │           SNAT          │           SNAT             │
  11. │        │            │            │            │               │
  12. │        │       gateway2 (Listen) │      gateway2 (Listen)     │
  13. │        │            │ 172.16.23.2│            │ 192.168.32.251│
  14. │        └────────────│────────────┘            │               │
  15. │                     └───────────────│─────────┘               │
  16. │                                  L4 Proxy                     │
  17. │                                     │                         │
  18. │               192.168.32.100     gateway1 (Listen)            │
  19. │               192.168.32.101        │ 192.168.32.251          │
  20. │       br0 ───────── DNAT ───────────┘                         │
  21. │        │                            │                         │
  22. │        │ ──────── L4 Proxy ─────────┘                         │
  23. └────────│──────────────────────────────────────────────────────┘
  24.         eth0                                          
复制代码
调整后的 gateway1 成为了整个所有服务的流量入口,后面可以根据这个特性对架构进行调整。
异构问题如何解决

在新架构的访问链路中,两类欺骗服务明显的异构,监听的 IP 不在一个层级,一类是 10.* 一类是 172.*。
目前 gateway2 需要处理两套转发逻辑,除了丑一些功能是没有问题的。
现在有一个需求需要打通欺骗服务的网络链路,srv1/srv2/srv3 可以互相访问对方的服务端口。
同构网络架构方案
对于同网络架构的网络打通方案见 几种通过 iproute2 来打通不同节点间容器网络的方式。
异构网络架构方案
比较容易想到的方案是,少了一层那么为了兼容增加一层处理逻辑即可。
有了 交换机侧虚拟网络引流 的经验,netns 可以在这个地方尝试使用。
理论上以下的网络拓扑是可以正常运行的,但是存在一个问题:网桥 br-win 在 netns 里面,kvm 不能指定这个网桥
  1. ┌─────────────────────────────────────────────────────────────────────┐
  2. │  Host                                                               │
  3. │     ┌─────────────────────────┐     ┌─────────────────────────┐     │
  4. │     │ vm1                     │     │ netns_win               │     │
  5. │     │ ┌────────┐   ┌────────┐ │     │ ┌────────┐   ┌────────┐ │     │
  6. │     │ │10.1.0.2│   │10.1.0.3│ │     │ │10.2.0.2│   │10.2.0.3│ │     │
  7. │     │ │  eth0  │   │  eth0  │ │     │ │  eth0  │   │  eth0  │ │     │
  8. │     │ └───│────┘   └───│────┘ │     │ └───│────┘   └───│────┘ │     │
  9. │     │   veth1        veth2    │     │   vnet2        vnet3    │     │
  10. │     │     └──────│─────┘      │     │     └──────│─────┘      │     │
  11. │     │         docker0         │     │          br-win         │     │
  12. │     │        10.1.0.1         │     │         10.2.0.1        │     │
  13. │     │                         │     │                         │     │
  14. │     │       172.16.23.2       │     │       172.16.23.3       │     │
  15. │     │           eth0          │     │           eth0          │     │
  16. │     └────────────│────────────┘     └────────────│────────────┘     │
  17. │                vnet1                         veth-win               │
  18. │                  └───────────────│───────────────┘                  │
  19. │  192.168.32.251                 br1                                 │
  20. │       br0                   172.16.23.1                             │
  21. └────────│────────────────────────────────────────────────────────────┘
  22.         eth0                                                           
复制代码
所以需要调整一下,把 br-win 放在 host 内,使用 veth-peer 把 ip 留在命名空间内,变更后的网络拓扑如下:
  1. ┌─────────────────────────────────────────────────────────────────────┐
  2. │  Host                                                               │
  3. │     ┌─────────────────────────┐                                     │
  4. │     │ vm1                     │                                     │
  5. │     │ ┌────────┐   ┌────────┐ │       ┌────────┐   ┌────────┐       │
  6. │     │ │10.1.0.2│   │10.1.0.3│ │       │10.2.0.2│   │10.2.0.3│       │
  7. │     │ │  eth0  │   │  eth0  │ │       │  eth0  │   │  eth0  │       │
  8. │     │ └───│────┘   └───│────┘ │       └───│────┘   └───│────┘       │
  9. │     │   veth1        veth2    │         vnet2        vnet3          │
  10. │     │     └──────│─────┘      │           └──────│─────┘            │
  11. │     │         docker0         │                br-win               │
  12. │     │        10.1.0.1         │                  │                  │
  13. │     │                         │              veth-win1              │
  14. │     │                         │     ┌────────────│────────────┐     │
  15. │     │                         │     │ netns     eth1          │     │
  16. │     │                         │     │  win    10.2.0.1        │     │
  17. │     │                         │     │                         │     │
  18. │     │       172.16.23.2       │     │       172.16.23.3       │     │
  19. │     │           eth0          │     │           eth0          │     │
  20. │     └────────────│────────────┘     └────────────│────────────┘     │
  21. │                vnet1                         veth-win0              │
  22. │                  └───────────────│───────────────┘                  │
  23. │  192.168.32.251                 br1                                 │
  24. │       br0                   172.16.23.1                             │
  25. └────────│────────────────────────────────────────────────────────────┘
  26.         eth0                                                           
复制代码
如何对恶意流量进行分析

业务中使用 suricata 对流量进行分析,部署在欺骗服务所在的网桥上,这个位置获取拿到原始的流量数据。
如果是在 br0 的位置抓包,拿到的流量会携带一个 L4 Proxy 的源数据头,这个数据头会导致 suricata 识别不了一些协议,如何 HTTP。
  1. ┌────────────────────────────────────────────────────────────────┐
  2. │  Host                                                          │
  3. │    ┌─────────────────────────┐                                 │
  4. │    │ vm1                     │                                 │
  5. │    │ ┌────────┐   ┌────────┐ │             ┌────────┐          │
  6. │    │ │  srv1  │   │  srv2  │ │             │10.2.0.2│          │
  7. │    │ │10.1.0.2│   │10.1.0.3│ │             │  eth0  │          │
  8. │    │ └───│────┘   └───│────┘ │             └───│────┘          │
  9. │    │     └──────│─────┘      │                 │               │
  10. │    │ suricata ──│            │     suuricata ──│               │
  11. │    │           SNAT          │               SNAT              │
  12. │    │            │            │     ┌───────────│───────────┐   │
  13. │    │            │            │     │           │           │   │
  14. │    │       gateway2 (Listen) │     │      gateway2 (Listen)│   │
  15. │    │            │ 172.16.23.2│     │           │172.16.23.3│   │
  16. │    └────────────│────────────┘     └───────────│───────────┘   │
  17. │                 └───────────────│──────────────┘               │
  18. │                              L4 Proxy                          │
  19. │                                 │                              │
  20. │           192.168.32.100     gateway1 (Listen)                 │
  21. │           192.168.32.101        │ 192.168.32.251               │
  22. │   br0 ───────── DNAT ───────────┘                              │
  23. │    │                            │                              │
  24. │    │ ──────── L4 Proxy ─────────┘                              │
  25. └────│───────────────────────────────────────────────────────────┘
  26.     eth0                                                         
复制代码
suricata 在没有流量的情况下也就是有一定的资源占用的,整个 Host 机器可能存在多个 vm,意味着也存在多个 suricata。
目标:减少 suricata 数量,复用 suricata 资源,降低服务管理的成本。
gateway1 是所有流量的入口,只要拿到 gateway1 和 gateway2 之间的流量,并且去掉头部就是原始流量了。
比较占用性能的方案如下:

  • 抓包 br1 网桥,获取所有的网桥流量
  • 新建虚拟 tap 设备,指定网卡为 tap 设备启动 suricata
  • 建立连接,增加连接相关的缓存
  • 对包进行匹配和重组

    • 匹配流量头
    • 去掉流量头,修改 seq/ack 序号,重新生成一个网络数据包
    • 新的数据包写入至 tap 设备中

  • 接收 suricata 的事件,使用缓存相关的数据订正 IP 相关信息
调整后的的网络拓扑如下,新增 vtap0 给 suricata 抓包分析恶意流量
  1. ┌─────────────────────────────────────────────────────────────────────┐
  2. │  Host                                                               │
  3. │     ┌─────────────────────────┐                                     │
  4. │     │ vm1                     │                                     │
  5. │     │ ┌────────┐   ┌────────┐ │       ┌────────┐   ┌────────┐       │
  6. │     │ │10.1.0.2│   │10.1.0.3│ │       │10.2.0.2│   │10.2.0.3│       │
  7. │     │ │  eth0  │   │  eth0  │ │       │  eth0  │   │  eth0  │       │
  8. │     │ └───│────┘   └───│────┘ │       └───│────┘   └───│────┘       │
  9. │     │   veth1        veth2    │         vnet2        vnet3          │
  10. │     │     └──────│─────┘      │           └──────│─────┘            │
  11. │     │         docker0         │                br-win               │
  12. │     │        10.1.0.1         │                  │                  │
  13. │     │                         │              veth-win1              │
  14. │     │                         │     ┌────────────│────────────┐     │
  15. │     │                         │     │ netns     eth1          │     │
  16. │     │                         │     │  win    10.2.0.1        │     │
  17. │     │                         │     │                         │     │
  18. │     │       172.16.23.2       │     │       172.16.23.3       │     │
  19. │     │           eth0          │     │           eth0          │     │
  20. │     └────────────│────────────┘     └────────────│────────────┘     │
  21. │                vnet1                         veth-win0              │
  22. │                  └───────────────│───────────────┘                  │
  23. │  192.168.32.251                 br1 ─────────────┐                  │
  24. │       br0                   172.16.23.1        vtap0                │
  25. └────────│────────────────────────────────────────────────────────────┘
  26.         eth0                                                           
复制代码
一些想法


  • netns 是个好东西,对于网络的隔离可以做到非常灵活的程度
  • 涉及对外自定义的协议尽量使用常见协议,否则外部一旦部署升级也会麻烦一些,涉及三方服务也不能识别,比如 suricata 如果是用 HA Proxy 是可以支持剥离的
参考


  • 几种通过 iproute2 来打通不同节点间容器网络的方式,https://www.cnblogs.com/shuqin/p/18529071

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册