1 #!/bin/bash 2 # 3 # /usr/sbin/dnsmasq-portforward 4 # 5 # A script which gets run when the dnsmasq DHCP lease database changes. 6 # It logs to $LOGFILE, if it exists, and maintains port-forwards using 7 # IP-tables so that they always point to the correct host. See 8 # $PORTSFILE for details on configuring this. dnsmasq must be version 2.34 9 # or later. 10 # 11 # To enable this script, add 12 # dhcp-script=/usr/sbin/dnsmasq-portforward 13 # to /etc/dnsmasq.conf 14 # 15 # To enable logging, touch $LOGFILE 16 # 17 18 PORTSFILE=/etc/portforward 19 LOGFILE=/var/log/dhcp.log 20 IPTABLES=/sbin/iptables 21 22 action=${1:-0} 23 hostname=${4} 24 25 # log what's going on. 26 if [ -f ${LOGFILE} ] ; then 27 date +"%D %T $*" >>${LOGFILE} 28 fi 29 30 # If a lease gets stripped of a name, we see that as an "old" action 31 # with DNSMASQ_OLD_HOSTNAME set, convert it into a "del" 32 if [ ${DNSMASQ_OLD_HOSTNAME} ] && [ ${action} = old ] ; then 33 action=del 34 hostname=${DNSMASQ_OLD_HOSTNAME} 35 fi 36 37 # action init is not relevant, and will only be seen when leasefile-ro is set. 38 if [ ${action} = init ] ; then 39 exit 0 40 fi 41 42 if [ ${hostname} ]; then 43 ports=$(sed -n -e "/^${hostname}\ .*/ s/^.* //p" ${PORTSFILE}) 44 45 for port in $ports; do 46 verb=removed 47 protocol=tcp 48 if [ ${port:0:1} = u ] ; then 49 protocol=udp 50 port=${port/u/} 51 fi 52 src=${port/:*/} 53 dst=${port/*:/} 54 # delete first, to avoid multiple copies of rules. 55 ${IPTABLES} -t nat -D PREROUTING -p $protocol --destination-port $src -j DNAT --to-destination ${3}:$dst 56 if [ ${action} != del ] ; then 57 ${IPTABLES} -t nat -A PREROUTING -p $protocol --destination-port $src -j DNAT --to-destination ${3}:$dst 58 verb=added 59 fi 60 if [ -f ${LOGFILE} ] ; then 61 echo " DNAT $protocol $src to ${3}:$dst ${verb}." >>${LOGFILE} 62 fi 63 done 64 fi 65 66 exit 0 67 68 69