基本上试图通过一个非常独特的项目来将桥接和 NAT 弯曲到我的意愿。
我简化了下面的操作(VM=Kali 虚拟机用于测试):
ZoneX 是网络命名空间,vexxx 是使用 ip link 创建的虚拟链接
前提是为 LAN 创建一个网关,它可以将流量(根据流量的情况)转移到 ZoneX 或 ZoneY 修改流量并将其转发到 ZoneZ,最后转发到真正的网络网关。
我已经尝试了很多不同的事情,但是主要问题要么是创建第 2 层风暴...在虚拟机中不太好...或者 NAT 网络命名空间 (ZoneZ) 通过 NAT 中的第一个接口转发返回流量客户端 VM 的表(有时不正确)。
主要目的是将流量分散到多个区域,但让返回流量采用相同的路线返回,这就是关键!下一阶段是能够将多个区域链接在一起,以多种方式修改流量。
*** 编辑
连接示例是对 8.8.8.8 的 DNS 查找和对 8.8.8.8 的 TCP 请求,两者都来自虚拟机。
首先,DNS 请求通过 brA 传递到 eth0,再传递到 ve001,传递到 ZoneA,在该处数据包被标记(使用 iptables),然后传递到 ve003 > ve004 等,传递到 ve006,在 ve006 进行 NAT 并发送到互联网。当响应返回到 ZoneZ(NAT 区域)时,NAT 表中的查找完成,数据包被路由到 ve006,因为 VM 计算机的 ARP 条目指向该接口。当我有其他流量想要通过底部路由转发时,主要的麻烦就出现了。与之前相同,直到 ZoneA,但是这次它向下路由到 ve007,通过 ZoneY,最后进入 ZoneZ,然后通过 NAT 网关并到达互联网。但是,当收到此连接的答复时,数据包将转到 ZoneZ,在 NAT 表中完成查找,进行翻译,然后完成 ARP 表查找,此时它通过 ve006 将其转发回来,这是错误的,我想要它按原路返回(在本例中是通过 ve010)。
我想我的问题应该是,我能否获取 NAT 表来记录它所呈现的接口并通过该接口将其转发回来?
答案1
解决方案是对新连接进行标记,并使用该标记进行策略路由:
iptables -t mangle -A FORWARD -i ve006 -m connmark -j CONNMARK --set-mark 6
iptables -t mangle -A FORWARD -i ve010 -m connmark -j CONNMARK --set-mark 10
ip rule
有一个测试fwmark
.因此,您为ve006
和 分别创建了一张路由表ve010
。
ip route add default table ve006 via a.b.c.51 dev ve006
# .51 again, typo?
ip route add default table ve010 via a.b.c.51 dev ve010
ip rule add pref 100 iif ve998 fwmark 6 table ve006
ip rule add pref 101 iif ve998 fwmark 10 table ve010