1*e7abe75aSbluhm# $OpenBSD: Makefile,v 1.14 2020/12/25 19:01:09 bluhm Exp $ 2b83a2f27Sbluhm 3b83a2f27Sbluhm# The following ports must be installed: 4b83a2f27Sbluhm# 5b83a2f27Sbluhm# scapy powerful interactive packet manipulation in python 6b83a2f27Sbluhm 7*e7abe75aSbluhm.if ! exists(/usr/local/bin/scapy-3) 8b83a2f27Sbluhmregress: 9*e7abe75aSbluhm @echo Install py3-scapy package to run this regress. 1054eefd0cSbluhm @echo SKIPPED 11b83a2f27Sbluhm.endif 12b83a2f27Sbluhm 13b83a2f27Sbluhm# This test needs a manual setup of two machines 14b83a2f27Sbluhm# Set up machines: LOCAL REMOTE 15b83a2f27Sbluhm# LOCAL is the machine where this makefile is running. 16b83a2f27Sbluhm# REMOTE is running OpenBSD with echo and chargen server to test PMTU 17b83a2f27Sbluhm# FAKE is an non existing machine in a non existing network. 18b83a2f27Sbluhm# REMOTE_SSH is the hostname to log in on the REMOTE machine. 19b83a2f27Sbluhm 20b83a2f27Sbluhm# Configure Addresses on the machines. 21b83a2f27Sbluhm# Adapt interface and addresse variables to your local setup. 22b83a2f27Sbluhm# 23b83a2f27SbluhmLOCAL_IF ?= 24f516a404SbluhmLOCAL_MAC ?= 25f516a404SbluhmREMOTE_MAC ?= 26b83a2f27SbluhmREMOTE_SSH ?= 27b83a2f27Sbluhm 28b83a2f27SbluhmLOCAL_ADDR ?= 29b83a2f27SbluhmREMOTE_ADDR ?= 30b83a2f27SbluhmFAKE_NET ?= 31b83a2f27SbluhmFAKE_NET_ADDR ?= 32b83a2f27Sbluhm 33b83a2f27SbluhmLOCAL_ADDR6 ?= 34b83a2f27SbluhmREMOTE_ADDR6 ?= 35b83a2f27SbluhmFAKE_NET6 ?= 36b83a2f27SbluhmFAKE_NET_ADDR6 ?= 37b83a2f27Sbluhm 38b83a2f27Sbluhm.if empty (LOCAL_IF) || empty (REMOTE_SSH) || \ 39f516a404Sbluhm empty (LOCAL_MAC) || empty (REMOTE_MAC) || \ 40b83a2f27Sbluhm empty (LOCAL_ADDR) || empty (LOCAL_ADDR6) || \ 41b83a2f27Sbluhm empty (REMOTE_ADDR) || empty (REMOTE_ADDR6) || \ 42b83a2f27Sbluhm empty (FAKE_NET) || empty (FAKE_NET6) || \ 43b83a2f27Sbluhm empty (FAKE_NET_ADDR) || empty (FAKE_NET_ADDR6) 44b83a2f27Sbluhmregress: 45b83a2f27Sbluhm @echo This tests needs a remote machine to operate on 46f516a404Sbluhm @echo LOCAL_IF REMOTE_SSH LOCAL_MAC REMOTE_MAC LOCAL_ADDR LOCAL_ADDR6 47f516a404Sbluhm @echo REMOTE_ADDR REMOTE_ADDR6 FAKE_NET FAKE_NET6 FAKE_NET_ADDR 48f516a404Sbluhm @echo FAKE_NET_ADDR6 49b83a2f27Sbluhm @echo are empty. Fill out these variables for additional tests. 5054eefd0cSbluhm @echo SKIPPED 51b83a2f27Sbluhm 526f20e9eaSkettenis.elif make (regress) || make (all) 53f39ab060Sbluhm.BEGIN: addr.py 54510ab291Sbluhm ${SUDO} true 55510ab291Sbluhm ssh -t ${REMOTE_SSH} ${SUDO} true 56*e7abe75aSbluhm @echo 57510ab291Sbluhm.endif 58510ab291Sbluhm 59b83a2f27Sbluhm# Create python include file containing the addresses. 60b83a2f27Sbluhmaddr.py: Makefile 61b83a2f27Sbluhm rm -f $@ $@.tmp 62b83a2f27Sbluhm echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp 63b83a2f27Sbluhm echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp 64b83a2f27Sbluhm echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp 65b83a2f27Sbluhm.for var in LOCAL REMOTE FAKE_NET 66b83a2f27Sbluhm echo '${var}_ADDR = "${${var}_ADDR}"' >>$@.tmp 67b83a2f27Sbluhm echo '${var}_ADDR6 = "${${var}_ADDR6}"' >>$@.tmp 68b83a2f27Sbluhm.endfor 69b83a2f27Sbluhm echo 'FAKE_NET = "${FAKE_NET}"' >>$@.tmp 70b83a2f27Sbluhm echo 'FAKE_NET6 = "${FAKE_NET6}"' >>$@.tmp 71b83a2f27Sbluhm mv $@.tmp $@ 72b83a2f27Sbluhm 73b83a2f27Sbluhm# Set variables so that make runs with and without obj directory. 74b83a2f27Sbluhm# Only do that if necessary to keep visible output short. 75b83a2f27Sbluhm.if ${.CURDIR} == ${.OBJDIR} 76*e7abe75aSbluhmPYTHON = python3 -u ./ 77b83a2f27Sbluhm.else 78*e7abe75aSbluhmPYTHON = PYTHONPATH=${.OBJDIR} python3 -u ${.CURDIR}/ 79b83a2f27Sbluhm.endif 80b83a2f27Sbluhm 81b83a2f27Sbluhm# Clear local and remote path mtu routes, set fake net route 82f39ab060SbluhmREGRESS_CLEANUP += reset-route 83b83a2f27Sbluhmreset-route: 84f516a404Sbluhm ${SUDO} route -n delete -inet -host ${REMOTE_ADDR} || true 85f516a404Sbluhm ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet -host ${FAKE_NET_ADDR} || true 86f39ab060SbluhmREGRESS_CLEANUP += reset-route6 87b83a2f27Sbluhmreset-route6: 88f516a404Sbluhm ${SUDO} route -n delete -inet6 -host ${REMOTE_ADDR6} || true 89f516a404Sbluhm ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet6 -host ${FAKE_NET_ADDR6} || true 90b83a2f27Sbluhm 91b83a2f27Sbluhm# Clear host routes and ping all addresses. This ensures that 92b83a2f27Sbluhm# the IP addresses are configured and all routing table are set up 93b83a2f27Sbluhm# to allow bidirectional packet flow. 94f39ab060SbluhmREGRESS_TARGETS += run-ping 95f39ab060Sbluhmrun-ping: reset-route 96b83a2f27Sbluhm.for ip in LOCAL_ADDR REMOTE_ADDR 97b83a2f27Sbluhm @echo Check ping ${ip} 98b83a2f27Sbluhm ping -n -c 1 ${${ip}} 99b83a2f27Sbluhm.endfor 100f39ab060SbluhmREGRESS_TARGETS += run-ping6 101f39ab060Sbluhmrun-ping6: reset-route6 102b83a2f27Sbluhm.for ip in LOCAL_ADDR REMOTE_ADDR 103b83a2f27Sbluhm @echo Check ping6 ${ip}6 104b83a2f27Sbluhm ping6 -n -c 1 ${${ip}6} 105b83a2f27Sbluhm.endfor 106b83a2f27Sbluhm 107f39ab060SbluhmREGRESS_TARGETS += run-pmtu 108f39ab060Sbluhmrun-pmtu: addr.py reset-route 109b83a2f27Sbluhm @echo Send ICMP fragmentation needed after fake TCP connect 110b83a2f27Sbluhm ${SUDO} ${PYTHON}tcp_connect.py 111f39ab060SbluhmREGRESS_TARGETS += run-pmtu6 112f39ab060Sbluhmrun-pmtu6: addr.py reset-route6 113b83a2f27Sbluhm @echo Send ICMP6 packet too big after fake TCP connect 114b83a2f27Sbluhm ${SUDO} ${PYTHON}tcp_connect6.py 115b83a2f27Sbluhm 116f39ab060SbluhmREGRESS_TARGETS += run-udp6 117f39ab060Sbluhmrun-udp6: addr.py reset-route6 118b83a2f27Sbluhm @echo Send ICMP6 packet too big after UDP echo 119b83a2f27Sbluhm ${SUDO} ${PYTHON}udp_echo6.py 120b83a2f27Sbluhm 121f39ab060SbluhmREGRESS_TARGETS += run-gateway6 122f39ab060Sbluhmrun-gateway6: run-udp6 123b83a2f27Sbluhm @echo Remove gateway route of a dynamic PMTU route 124b83a2f27Sbluhm ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet6 -host ${LOCAL_ADDR6} 125b83a2f27Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 -host ${FAKE_NET_ADDR6}\ 126b83a2f27Sbluhm >pmtu.route 127b83a2f27Sbluhm cat pmtu.route 128b83a2f27Sbluhm grep -q 'gateway: ${LOCAL_ADDR6}' pmtu.route 129b83a2f27Sbluhm grep -q 'flags: <UP,GATEWAY,HOST,DYNAMIC,DONE>' pmtu.route 130b83a2f27Sbluhm ${SUDO} ${PYTHON}udp_echo6.py 131b83a2f27Sbluhm 132f39ab060SbluhmREGRESS_TARGETS += run-tcpfrag6 133f39ab060Sbluhmrun-tcpfrag6: addr.py reset-route6 13493a55b4aSbluhm @echo Send ICMP6 and try to trigger a short TCP segment 13593a55b4aSbluhm ${SUDO} ${PYTHON}tcp_atomicfrag6.py 136f39ab060SbluhmREGRESS_TARGETS += run-udpfrag6 137f39ab060Sbluhmrun-udpfrag6: addr.py reset-route6 13893a55b4aSbluhm @echo Send ICMP6 and try to trigger an atomic UDP IPv6 fragment 13993a55b4aSbluhm ${SUDO} ${PYTHON}udp_atomicfrag6.py 14093a55b4aSbluhm 141b83a2f27SbluhmCLEANFILES += addr.py *.pyc *.log *.route 142b83a2f27Sbluhm 143f516a404Sbluhm.PHONY: check-setup check-setup-local check-setup-remote 144f516a404Sbluhm 145f516a404Sbluhm# Check wether the address, route and remote setup is correct 146f516a404Sbluhmcheck-setup: check-setup-local check-setup-remote 147f516a404Sbluhm 148f516a404Sbluhmcheck-setup-local: 149f516a404Sbluhm @echo '\n======== $@ ========' 150f516a404Sbluhm ping -n -c 1 ${LOCAL_ADDR} # LOCAL_ADDR 151f516a404Sbluhm route -n get -inet ${LOCAL_ADDR} | grep -q 'flags: .*LOCAL' # LOCAL_ADDR 152f516a404Sbluhm arp -na | grep -q '^${LOCAL_ADDR} * ${LOCAL_MAC} * ${LOCAL_IF} permanent' # LOCAL_ADDR LOCAL_MAC LOCAL_IF 153f516a404Sbluhm ping -n -c 1 ${REMOTE_ADDR} # REMOTE_ADDR 154f516a404Sbluhm route -n get -inet ${REMOTE_ADDR} | fgrep -q 'interface: ${LOCAL_IF}' # REMOTE_ADDR LOCAL_IF 155f516a404Sbluhm ! ping -n -c 1 -w 1 ${FAKE_NET_ADDR} # FAKE_NET_ADDR 156f516a404Sbluhm route -n get -inet ${FAKE_NET_ADDR} | grep -q 'flags: .*BLACKHOLE' # FAKE_NET_ADDR 157f516a404Sbluhm route -n get -inet -net ${FAKE_NET} | grep -q 'flags: .*BLACKHOLE' # FAKE_NET 158f516a404Sbluhm ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 159f516a404Sbluhm route -n get -inet6 ${LOCAL_ADDR6} | grep -q 'flags: .*LOCAL' # LOCAL_ADDR6 160f516a404Sbluhm ndp -na | grep -q '^${LOCAL_ADDR6} * ${LOCAL_MAC} * ${LOCAL_IF} permanent' # LOCAL_ADDR6 LOCAL_MAC LOCAL_IF 161f516a404Sbluhm ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 162f516a404Sbluhm route -n get -inet6 ${REMOTE_ADDR6} | fgrep -q 'interface: ${LOCAL_IF}' # REMOTE_ADDR6 LOCAL_IF 163f516a404Sbluhm ! ping -n -c 1 -w 1 ${FAKE_NET_ADDR6} # FAKE_NET_ADDR6 164f516a404Sbluhm route -n get -inet6 ${FAKE_NET_ADDR6} | grep -q 'flags: .*BLACKHOLE' # FAKE_NET_ADDR6 165f516a404Sbluhm route -n get -inet6 -net ${FAKE_NET6} | grep -q 'flags: .*BLACKHOLE' # FAKE_NET6 166f516a404Sbluhm 167f516a404Sbluhmcheck-setup-remote: 168f516a404Sbluhm @echo '\n======== $@ ========' 169f516a404Sbluhm ssh ${REMOTE_SSH} ping -n -c 1 ${REMOTE_ADDR} # REMOTE_ADDR 170f516a404Sbluhm ssh ${REMOTE_SSH} route -n get -inet ${REMOTE_ADDR} | grep -q 'flags: .*LOCAL' # REMOTE_ADDR 171f516a404Sbluhm ssh ${REMOTE_SSH} arp -na | grep -q '^${REMOTE_ADDR} * ${REMOTE_MAC} * .* permanent' # REMOTE_ADDR REMOTE_MAC 172f516a404Sbluhm ssh ${REMOTE_SSH} ping -n -c 1 ${LOCAL_ADDR} # LOCAL_ADDR 173f516a404Sbluhm.for ip in FAKE_NET FAKE_NET_ADDR 174f516a404Sbluhm ssh ${REMOTE_SSH} route -n get -inet ${${ip}} | fgrep -q 'gateway: ${LOCAL_ADDR}' # ${ip} LOCAL_ADDR 175f516a404Sbluhm.endfor 176f516a404Sbluhm ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 177f516a404Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} | grep -q 'flags: .*LOCAL' # REMOTE_ADDR6 178f516a404Sbluhm ssh ${REMOTE_SSH} ndp -na | grep -q '^${REMOTE_ADDR6} * ${REMOTE_MAC} * .* permanent' # REMOTE_ADDR6 REMOTE_MAC 179f516a404Sbluhm ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 180f516a404Sbluhm.for ip in FAKE_NET6 FAKE_NET_ADDR6 181f516a404Sbluhm ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} | fgrep -q 'gateway: ${LOCAL_ADDR6}' # ${ip} LOCAL_ADDR6 182f516a404Sbluhm.endfor 183f516a404Sbluhm.for af in inet inet6 1845cbd8848Sbluhm ssh ${REMOTE_SSH} netstat -na -f ${af} -p tcp | fgrep ' *.19 ' 185f516a404Sbluhm.endfor 1865cbd8848Sbluhm ssh ${REMOTE_SSH} netstat -na -f inet6 -p udp | fgrep ' *.7 ' 187f516a404Sbluhm ssh ${REMOTE_SSH} ${SUDO} pfctl -sr | grep '^anchor "regress" all$$' 188f516a404Sbluhm ssh ${REMOTE_SSH} ${SUDO} pfctl -si | grep '^Status: Enabled ' 189f516a404Sbluhm 190b83a2f27Sbluhm.include <bsd.regress.mk> 191