#!/bin/sh # # $FreeBSD$ # # PROVIDE: localnet # REQUIRE: dhcp6c # BEFORE: rtadvd named # KEYWORD: shutdown # # This is a bit hacky, but I think I can live with it for now. # # The purpose of this script is to generate various ISP prefix dependent files. # # Specifically, the DNS (BIND) acls file for handling various views, a local ISP # range address for the router itself (on a dedicated loopback device), and attach # the IMP_NET address for this machine to another loopback device. router_conf_dir="/home/adam/proj/rc.router" . ${router_conf_dir}/rc.conf #. /etc/rc.subr name='localnet' extra_commands="rebuild_rtadvd_conf rebuild_zoneinfo" start_cmd='localnet_start' stop_cmd='localnet_stop' rebuild_rtadvd_conf_cmd="localnet_build_rtadv" rebuild_zoneinfo_cmd="localnet_build_zoneinfo" rcvar='localnet_enable' #load_rc_config 'localnet' localnet_first_nic="re0.301" [ -z "$localnet_enable" ] && localnet_enable='NO' [ -z "$localnet_zoneinfo_enable" ] && localnet_zoneinfo_enable='NO' localnet_build_zoneinfo() { #compute_addrs isp_prefix="2001:db8:42:ab" localnet_build_zoneinfo_impl } localnet_build_zoneinfo_impl() { if [ $(option_selected localnet_zoneinfo_enable) = "YES" ] then #build_zoneinfo ${isp_prefix} 31 ${router_conf_dir}/namedb/local-machines.defs build_zoneinfo ${isp_prefix} ${localnet_zoneinfo_subnet} ${router_conf_dir}/namedb/local-machines.defs > ${router_conf_dir}/gen/${localnet_zone_file} fi } localnet_build_acls() { gen_acls_dir=${router_conf_dir}/gen/namedb mkdir -p ${gen_acls_dir} cat ${router_conf_dir}/namedb/acls.template.conf \ | sed \ -e "s/@ISP_PREFIX@/${isp_prefix}/g" \ -e "s/@ULA_PREFIX@/${secret_ip6_net}/g" \ > ${gen_acls_dir}/acls.conf } localnet_build_rtadv() { gen_rtadv_dir=${router_conf_dir}/gen rtadvd_conf=${gen_rtadv_dir}/rtadvd.conf mkdir -p ${gen_rtadv_dir} _search_list=$( echo ${rtadvd_dns_search_list} | sed -e 's/ */,/g' -e 's/^,//' -e 's/,$//' ) cat ${router_conf_dir}/rtadvd.template.conf \ | sed \ -e "s/@PREF64_PREFIX@/${rtadvd_pref64_prefix}/" \ -e "s/@DNS_SERVER@/${rtadvd_dns_server}/" \ -e "s/@DNSSL@/${_search_list}/" \ > ${rtadvd_conf} echo "" >> ${rtadvd_conf} echo "" >> ${rtadvd_conf} for interface in ${rtadvd_interfaces} do echo "${interface}:tc=settings" >> ${rtadvd_conf} done } compute_addrs() { # todo: Adjust our ipv6 hint... get from a var? v6addr=$(ifconfig ${localnet_first_nic} | grep "inet6 [23]...:" | head -1 | awk '{print $2}') echo "V6 addr is: ${v6addr}" loop=0 while [ -z "${v6addr}" -a ${loop} -lt 4 ] do sleep 5 v6addr=$(ifconfig re0.301 | grep "2600:4040:" | head -1 | awk '{print $2}') echo "V6 addr is: ${v6addr}" loop=$(( ${loop} + 1 )) done echo "V6 addr is: ${v6addr}" three_quads=$(echo ${v6addr} | awk -F ':' '{print $1":"$2":"$3}') echo "First three quads are: ${three_quads}" last_quad=$(echo ${v6addr} | awk -F ':' '{print $4}') echo "Last quad is: ${last_quad}" last_prefix=$(echo ${last_quad} | rev | awk '{print $1"0000"}' | cut -c 3,4 | rev | sed -e 's/^0//') echo "Last prefix is: ${last_prefix}" isp_prefix="${three_quads}:${last_prefix}" base_addr=" inet6 ${isp_prefix}ff::1" } localnet_start() { cp ${router_conf_dir}/resolv.conf.master ${router_conf_dir}/resolv.conf compute_addrs ifconfig lo1 create ${base_addr} prefer_source ifconfig lo3 create inet 198.18.0.1/32 # DO NOT USE prefer_source for this address... # It will cause confusion for the wireguard tunnels underneath... # It also could cause DNS recursion to fail -- routing as the nested # connections... ifconfig lo2 create inet6 2602:f6a8:1::/64 anycast # DO NOT USE prefer_source ifconfig lo4 create inet 155.103.215.15/32 anycast localnet_build_rtadv localnet_build_acls localnet_build_zoneinfo_impl } localnet_stop() { compute_addrs ifconfig lo0 ${base_addr} delete ifconfig lo1 destroy ifconfig lo2 destroy ifconfig lo3 destroy ifconfig lo4 destroy } #run_rc_command "$1" localnet_build_zoneinfo # vim: ft=bash