#!/bin/sh # Virtual ethernet interface control script # Sometimes, we need a virtual interface of arbitrary name and configuration # that we can do dhcp on. This script is for those times. # Basically, # $ veth setup foo 127.0.1 # $ dhclient foo # ... # $ veth teardown foo # Would set up an ethernet interface called 'foo' whose dhcpd is at 127.0.1.1 # and which will allocate addresses from 127.0.1.0/24. Note that using anything # inside 127.0.0.0/8 is a bad idea here, since lo already handles those. usage () { echo "Usage: $0 <command> [args...]" echo " setup <iface> <base> Sets up <iface> for <base>.0/24" echo " teardown <iface> Tears down <iface>" } setup () { iface="$1" base="$2" peer_iface="${iface}p" lease_file="/tmp/dnsmasq.${iface}.leases" pid_file="/tmp/dnsmasq.${iface}.pid" ip link add name "$iface" type veth peer name "$peer_iface" ifconfig "$peer_iface" "${base}.0/32" ifconfig "$peer_iface" up ifconfig "$iface" up route add -host 255.255.255.255 dev "$peer_iface" truncate -s 0 "$lease_file" dnsmasq --pid-file="$pid_file" \ --dhcp-leasefile="$lease_file" \ --dhcp-range="${base}.2,${base}.254" \ --port=0 \ --interface="$peer_iface" \ --bind-interfaces } teardown () { iface="$1" pid_file="/tmp/dnsmasq.${iface}.pid" [ -f "$pid_file" ] && kill -TERM $(cat "$pid_file") route del -host 255.255.255.255 ip link del "$iface" } if [ -z "$1" ]; then usage exit 1 fi command="$1" ; shift case "$command" in setup) setup "$@" ;; teardown) teardown "$@" ;; *) usage ;; esac