|
| 1 | +SHELL=/bin/bash |
| 2 | + |
| 3 | +ifeq ($(DEBUG),1) |
| 4 | + DEBUG := 1 |
| 5 | +else |
| 6 | + DEBUG := 0 |
| 7 | +endif |
| 8 | + |
| 9 | +ifeq ($(VERBOSE),1) |
| 10 | + QUIET := |
| 11 | +else |
| 12 | + QUIET := @ |
| 13 | +endif |
| 14 | + |
| 15 | +ifeq ($(PROTO),udp) |
| 16 | + PROTO := udp |
| 17 | + IPERF_OPTS := -u -l 1430 -b 100G |
| 18 | +else |
| 19 | + PROTO := tcp |
| 20 | +endif |
| 21 | + |
| 22 | +ifeq ($(FUN_PROTO),udp) |
| 23 | + FUN_PROTO := udp |
| 24 | +else |
| 25 | + FUN_PROTO := tcp |
| 26 | +endif |
| 27 | + |
| 28 | +CLANG ?= clang |
| 29 | +MTU := 1500 |
| 30 | + |
| 31 | +all: check |
| 32 | +check: _setup _load |
| 33 | + |
| 34 | +## |
| 35 | +## Test scenario |
| 36 | +# |
| 37 | +# NS1 NS2 |
| 38 | +# ........... ............ |
| 39 | +# . ----- . ----- ----- . ----- . |
| 40 | +# . |veth0|<-->|veth1| |veth2|<-->|veth3| . |
| 41 | +# . ----- . ----- ----- . ----- . |
| 42 | +# ........... ............ |
| 43 | +# |
| 44 | + |
| 45 | +RULES_SVC_EGRESS := "ip $(PROTO) sport 8080 actions funnel $(FUN_PROTO) sport 80 dport 540" |
| 46 | +RULES_SVC_INGRESS := "ip $(FUN_PROTO) dport 80 sport 540 actions unfunnel $(PROTO)" |
| 47 | + |
| 48 | +RULES_INGRESS := "ip $(FUN_PROTO) sport 80 dport 540 actions unfunnel $(PROTO)" |
| 49 | +RULES_EGRESS := "ip $(PROTO) dport 8080 actions funnel $(FUN_PROTO) sport 540 dport 80" |
| 50 | + |
| 51 | +_setup: |
| 52 | + $(QUIET)echo -n "Creating ifaces..." |
| 53 | + $(QUIET)sudo ip link add type veth |
| 54 | + $(QUIET)sudo ip link add type veth |
| 55 | + $(QUIET)echo "OK" |
| 56 | + $(QUIET)echo -n "Creating ns1, ns2..." |
| 57 | + $(QUIET)sudo ip netns add ns1 |
| 58 | + $(QUIET)sudo ip netns add ns2 |
| 59 | + $(QUIET)echo "OK" |
| 60 | + $(QUIET)echo -n "Moving: eth0=>ns1, eth3=>n2..." |
| 61 | + $(QUIET)sudo ip link set netns ns1 dev veth0 |
| 62 | + $(QUIET)sudo ip link set netns ns2 dev veth3 |
| 63 | + $(QUIET)echo "OK" |
| 64 | + $(QUIET)echo -n "Bringing them up..." |
| 65 | + $(QUIET)sudo ip link set up dev veth1 |
| 66 | + $(QUIET)sudo ip link set up dev veth2 |
| 67 | + $(QUIET)sudo ip netns exec ns1 ip link set up dev lo |
| 68 | + $(QUIET)sudo ip netns exec ns2 ip link set up dev lo |
| 69 | + $(QUIET)sudo ip netns exec ns1 ip link set up dev veth0 |
| 70 | + $(QUIET)sudo ip netns exec ns2 ip link set up dev veth3 |
| 71 | + $(QUIET)echo "OK" |
| 72 | + $(QUIET)echo -n "Setting MTU..." |
| 73 | + $(QUIET)sudo ip netns exec ns1 ip link set mtu $(MTU) dev veth0 |
| 74 | + $(QUIET)sudo ip link set mtu $(MTU) dev veth1 |
| 75 | + $(QUIET)sudo ip link set mtu $(MTU) dev veth2 |
| 76 | + $(QUIET)sudo ip netns exec ns2 ip link set mtu $(MTU) dev veth3 |
| 77 | + $(QUIET)echo "OK" |
| 78 | + $(QUIET)echo -n "Add IP addresses..." |
| 79 | + $(QUIET)sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth0 |
| 80 | + $(QUIET)sudo ip addr add 10.0.0.2/24 dev veth1 |
| 81 | + $(QUIET)sudo ip addr add 10.0.1.1/24 dev veth2 |
| 82 | + $(QUIET)sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth3 |
| 83 | + $(QUIET)echo "OK" |
| 84 | + $(QUIET)echo -n "Add default routes to NSs..." |
| 85 | + $(QUIET)sudo ip netns exec ns1 ip route add default via 10.0.0.2 |
| 86 | + $(QUIET)sudo ip netns exec ns2 ip route add default via 10.0.1.1 |
| 87 | + $(QUIET)echo "OK" |
| 88 | + $(QUIET)echo -n "Open the firewall..." |
| 89 | + $(QUIET)sudo iptables -I FORWARD -d 10.0.0.0/8 -j ACCEPT |
| 90 | + $(QUIET)echo "OK" |
| 91 | + $(QUIET)echo -n "Disable RPF filters..." |
| 92 | + $(QUIET)sudo ip netns exec ns1 sysctl -q net.ipv4.conf.veth0.rp_filter=0 |
| 93 | + $(QUIET)sudo sysctl -q net.ipv4.conf.veth1.rp_filter=0 |
| 94 | + $(QUIET)sudo sysctl -q net.ipv4.conf.veth2.rp_filter=0 |
| 95 | + $(QUIET)sudo ip netns exec ns2 sysctl -q net.ipv4.conf.veth3.rp_filter=0 |
| 96 | + $(QUIET)echo "OK" |
| 97 | + $(QUIET)echo -n "Test base setup..." |
| 98 | + $(QUIET)sudo ip netns exec ns1 ping -c 1 10.0.1.2 > /dev/null |
| 99 | + $(QUIET)echo "OK" |
| 100 | + |
| 101 | +_compile: |
| 102 | + $(QUIET)cd ../../docker && make |
| 103 | + |
| 104 | +_load: _compile |
| 105 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e IFACES=veth0 -e SFUNNEL_RULESET=$(RULES_EGRESS) -e DIRECTION=egress -e DEBUG=$(DEBUG) sfunnel |
| 106 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e IFACES=veth0 -e SFUNNEL_RULESET=$(RULES_INGRESS) -e DIRECTION=ingress -e DEBUG=$(DEBUG) sfunnel |
| 107 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e IFACES=veth3 -e SFUNNEL_RULESET=$(RULES_SVC_EGRESS) -e DIRECTION=egress -e DEBUG=$(DEBUG) sfunnel |
| 108 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e IFACES=veth3 -e SFUNNEL_RULESET=$(RULES_SVC_INGRESS) -e DIRECTION=ingress -e DEBUG=$(DEBUG) sfunnel |
| 109 | + |
| 110 | +_unload: |
| 111 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e CLEAN=1 -e DEBUG=1 -e DIRECTION=both sfunnel |
| 112 | + $(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e CLEAN=1 -e DEBUG=1 -e DIRECTION=both sfunnel |
| 113 | + |
| 114 | + |
| 115 | +_clean_iperf: |
| 116 | + $(QUIET)sudo ip netns exec ns1 killall iperf || true |
| 117 | + $(QUIET)sudo ip netns exec ns2 killall iperf || true |
| 118 | + |
| 119 | +# No DNAT/SNAT |
| 120 | +check_perf_calibration: |
| 121 | + $(QUIET)sudo ip netns exec ns2 iperf -s -p 80 $(IPERF_OPTS) & |
| 122 | + $(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.2 -p 80 $(IPERF_OPTS) |
| 123 | + $(QUIET) $(MAKE) _clean_iperf |
| 124 | +check_perf: |
| 125 | + $(QUIET)sudo ip netns exec ns2 iperf -s -p 8080 $(IPERF_OPTS) & |
| 126 | + $(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.2 -p 8080 $(IPERF_OPTS) |
| 127 | + $(QUIET) $(MAKE) _clean_iperf |
| 128 | + |
| 129 | +# DNAT only |
| 130 | +_clean_dnat: |
| 131 | + $(QUIET)sudo iptables -t nat -D PREROUTING -s 10.0.0.1 -d 10.0.1.3 -j DNAT --to-destination 10.0.1.2 || true |
| 132 | + $(QUIET)sudo iptables -t nat -D POSTROUTING -s 10.0.1.2 -d 10.0.0.1 -j SNAT --to-source 10.0.1.3 || true |
| 133 | +_add_dnat: |
| 134 | + $(QUIET)echo -n "Add DNAT..." |
| 135 | + $(QUIET)sudo iptables -t nat -I PREROUTING -s 10.0.0.1 -d 10.0.1.3 -j DNAT --to-destination 10.0.1.2 |
| 136 | + $(QUIET)sudo iptables -t nat -I POSTROUTING -s 10.0.1.2 -d 10.0.0.1 -j SNAT --to-source 10.0.1.3 |
| 137 | + $(QUIET)echo "OK" |
| 138 | +check_perf_calibration_dnat: _add_dnat |
| 139 | + $(QUIET)sudo ip netns exec ns2 iperf -s -p 80 $(IPERF_OPTS) & |
| 140 | + $(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.3 -p 80 $(IPERF_OPTS) |
| 141 | + $(QUIET) $(MAKE) _clean_dnat |
| 142 | + $(QUIET) $(MAKE) _clean_iperf |
| 143 | +check_perf_dnat: _add_dnat |
| 144 | + $(QUIET)sudo ip netns exec ns2 iperf -s -p 8080 $(IPERF_OPTS) & |
| 145 | + $(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.3 -p 8080 $(IPERF_OPTS) |
| 146 | + $(QUIET) $(MAKE) _clean_dnat |
| 147 | + $(QUIET) $(MAKE) _clean_iperf |
| 148 | + |
| 149 | +clean: _clean_dnat _clean_iperf |
| 150 | + $(QUIET)sudo iptables -D FORWARD -d 10.0.0.0/8 -j ACCEPT || true |
| 151 | + $(QUIET)sudo ip link del veth1 || true |
| 152 | + $(QUIET)sudo ip link del veth2 || true |
| 153 | + $(QUIET)sudo ip netns del ns1 || true |
| 154 | + $(QUIET)sudo ip netns del ns2 || true |
0 commit comments