65 lines
1.5 KiB
Bash
65 lines
1.5 KiB
Bash
#!/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
|