PBR引流BMF
场景描述
通过在路由器上配置基于端口的PBR,实现将指定流量引至BMF进行安全分析而后回注路由器的目的。
注 因为PBR比默认路由优先级高,因此配置PBR时要注意回注的流量能否正确路由的问题

I. pbr-router
- 环境准备:使用裸机安装CentOS 7发行版,并安装Open vSwitch (以下简称ovs)。网络方面,除管理口外还要UP两个口
egress ingress(根据自己设备指定值,如em2 eth2等),直连egress与BMFfilter、ingress与BMFdelivery - 创建三个namespace
router src dst、三个ovs网桥br-pbr br-egress br-ingress,将egress物理口加入br-egress、ingress物理口加入br-ingress。再创建两个ovs patch口用于连接三个ovs网桥
# 创建namespace ip netns add src ip netns add dst ip netns add router # 创建ovs网桥 ovs-vsctl add-br br-pbr ovs-vsctl add-br br-ingress ovs-vsctl add-br br-egress # 使用patch port连接ovs网桥 ovs-vsctl \ -- add-port br-pbr pbr-patch-ingress \ -- set Interface pbr-patch-ingress type=patch options:peer=ingress-patch-pbr \ -- add-port br-ingress ingress-patch-pbr \ -- set Interface ingress-patch-pbr type=patch options:peer=pbr-patch-ingress ovs-vsctl \ -- add-port br-pbr pbr-patch-egress \ -- set Interface pbr-patch-egress type=patch options:peer=egress-patch-pbr \ -- add-port br-egress egress-patch-pbr \ -- set Interface egress-patch-pbr type=patch options:peer=pbr-patch-egress # 将物理口加入ovs网桥 ovs-vsctl add-port br-ingress ingress ovs-vsctl add-port br-egress egress
创建一对veth pair,分别放到namespace
src和ovs的br-pbr中,用作请求的源端。再创建一对veth pair,分别放到namespace dst和ovs的br-pbr中,用作请求的目的端# 创建veth对 ip link add veth-src type veth peer name veth-src-br ip link add veth-dst type veth peer name veth-dst-br ip link add dev src netns veth-src ip link add dev dst netns veth-dst ip netns exec src ifconfig veth-src 192.168.0.2/24 up ip netns exec dst ifconfig veth-dst 192.168.2.2/24 up ip netns exec src ifconfig lo up ip netns exec dst ifconfig lo up # 将veth一段加入ovs网桥 ovs-vsctl add-port br-pbr veth-src-br ovs-vsctl add-port br-pbr veth-dst-br
- 创建四个ovs的internal port,放入namespace
router中。其中,qr-0-1为src的默认网关,qr-1-1为dst的默认网关,qg-e为PBR出口,qg-i为PBR回注口。
注 四个port在不同网段。
qg-e与nf-in同网段,qg-i与nf-out同网段。并且,router namespace中要配置nf-in的 静态arp
# 创建四个ovs internal port ovs-vsctl add-port br-pbr qr-0-1\ -- set Interface qr-0-1 type=internal ovs-vsctl add-port br-pbr qr-1-1\ -- set Interface qr-1-1 type=internal ovs-vsctl add-port br-pbr qg-e\ -- set Interface qg-e type=internal ovs-vsctl add-port br-pbr qg-i\ -- set Interface qg-i type=internal # 将ovs internel port加入router namespace ip link set dev qr-0-1 netns router ip link set dev qr-1-1 netns router ip link set dev qg-i netns router ip link set dev qg-e netns router ip netns exec router ifconfig qr-0-1 192.168.0.1/24 up ip netns exec router ifconfig qr-1-1 192.168.1.1/24 up ip netns exec router ifconfig qg-e 172.16.0.1/24 up ip netns exec router ifconfig qg-i 172.16.1.1/24 up ip netns exec router ifconfig lo up # 设置网关和arp ip netns exec src ip ro add default via 192.168.0.1 ip netns exec dst ip ro add default via 192.168.1.1 ip netns exec router arp -s 172.16.0.2 <MAC>
- 在
routernamespace中并配置PBR
- 从
qr-0-1进来的流量,下一跳为nf-in的IP - 从
qr-1-1进来的流量,下一跳为nf-in的IP
# 开启linux内核转发 ip netns exec router sysctl -w net.ipv4.ip_forward=1 # 创建pbr路由表 echo "1 pbr" >> /etc/iproute2/rt_tables ip netns exec router ip ro add default via 172.16.0.2 table pbr # 第一条策略路由 ip netns exec router ip ru add from all iif qr-0-1 table pbr # 第二条策略路由 ip netns exec router ip ru add from all iif qr-1-1 table pbr
BMF service-node
- 环境准备:使用裸机安装CentOS 7发行版,除管理口外还要UP两个口
nf-in nf-out(根据自己设备指定值,如em2 eth2等),将两个口接入BMF,配置好Policy
# 开启linux内核转发 sysctl -w net.ipv4.ip_forward=1 # UP两块网卡,并配置IP地址 ifconfig nf-in 172.16.0.2/24 up ifconfig ne-out 172.16.1.2/24 up
- 配置PBR
- 从
nf-in进来的流量,下一跳为qg-i的IP
qg-i的静态arp# 开启linux内核转发 sysctl -w net.ipv4.ip_forward=1 # 创建pbr路由表 echo "1 pbr" >> /etc/iproute2/rt_tables ip ro add default via 172.16.1.1 table pbr # 第一条策略路由 ip ru add from all iif nf-in table pbr # 添加静态arp arp -s 172.16.1.1 <MAC>
实验环境下流量走向
- pbr-router的
srcnamespace发送向dst的请求报文,会根据namespace中配置的默认路由经由src-port到达qr-0-1 qr-0-1收到的请求报文命中PBR,知道下一跳为nf-in,于是从qg-e发出,在ovs内部经由patch口到达br-egress,最终由egress物理口发出,达到BMF中的nf-innf-in收到的请求报文命中PBR,知道下一跳为qg-i,于是从nf-out发出,穿过BMF到达ingress物理口,在ovs内部经由patch口到达qg-iqg-i收到的请求未命中PBR,因此走默认路由,于是从qr-1-1发出,经由dst-port到达dstdst发送的报文流向与src的请求报文是相似的,不再赘述
问题及解决方案
- service-node数据包未能转发,策略路由不生效
答:这是由Linux内置的“反向路由过滤”功能引起的。它是Linux利用反向路由查询防止IP地址欺骗攻击的策略。通过检查收到的数据包源IP是否可路由决定是否丢弃数据包。详见这篇文章
解决办法是关闭配置了策略路由的网口的反向路由过滤功能
# service-node sysctl -w net.ipv4.conf.nf-in.rp_filter=0 # pbr-router ip netns exec router sysctl -w net.ipv4.conf.qg-i.rp_filter=0
场景描述
通过在路由器上配置基于端口的PBR,实现将指定流量引至BMF进行安全分析而后回注路由器的目的。
注 因为PBR比默认路由优先级高,因此配置PBR时要注意回注的流量能否正确路由的问题

浙公网安备 33010602011771号