meta mark set 0x000000c9 ct mark set 0x000000c9 counter accept
}
}"""
mangle_isp2 = """table ip vyos_wanloadbalance {
chain wlb_mangle_isp_veth2 {
meta mark set 0x000000ca ct mark set 0x000000ca counter accept
}
}"""
mangle_prerouting = """table ip vyos_wanloadbalance {
chain wlb_mangle_prerouting {
type filter hook prerouting priority mangle; policy accept;
iifname "veth3" ip saddr 198.51.100.0/24 ct state new counter numgen random mod 11 vmap { 0 : jump wlb_mangle_isp_veth1, 1-10 : jump wlb_mangle_isp_veth2 }
iifname "veth3" ip saddr 198.51.100.0/24 counter meta mark set ct mark
}
}"""
nat_wanloadbalance = """table ip vyos_wanloadbalance {
chain wlb_nat_postrouting {
type nat hook postrouting priority srcnat - 1; policy accept;
ct mark 0x000000c9 oifname "veth1" counter snat to 203.0.113.10
ct mark 0x000000ca oifname "veth2" counter snat to 192.0.2.10
}
}"""
# Create network namespeces
create_netns(ns1)
create_netns(ns2)
create_netns(ns3)
create_veth_pair(iface1, container_iface1)
create_veth_pair(iface2, container_iface2)
create_veth_pair(iface3, container_iface3)
move_interface_to_netns(container_iface1, ns1)
move_interface_to_netns(container_iface2, ns2)
move_interface_to_netns(container_iface3, ns3)
call(f'sudo ip address add 203.0.113.10/24 dev {iface1}')
call(f'sudo ip address add 192.0.2.10/24 dev {iface2}')
call(f'sudo ip address add 198.51.100.10/24 dev {iface3}')
for iface in [iface1, iface2, iface3]:
call(f'sudo ip link set dev {iface} up')
cmd_in_netns(ns1, f'ip link set {container_iface1} name eth0')
cmd_in_netns(ns2, f'ip link set {container_iface2} name eth0')
cmd_in_netns(ns3, f'ip link set {container_iface3} name eth0')
cmd_in_netns(ns1, 'ip address add 203.0.113.1/24 dev eth0')
cmd_in_netns(ns2, 'ip address add 192.0.2.1/24 dev eth0')
cmd_in_netns(ns3, 'ip address add 198.51.100.1/24 dev eth0')