summaryrefslogtreecommitdiffstats
path: root/main/dnsmasq/dnsmasq.initd
diff options
context:
space:
mode:
Diffstat (limited to 'main/dnsmasq/dnsmasq.initd')
-rw-r--r--main/dnsmasq/dnsmasq.initd85
1 files changed, 77 insertions, 8 deletions
diff --git a/main/dnsmasq/dnsmasq.initd b/main/dnsmasq/dnsmasq.initd
index c92853416db..f5114fb8065 100644
--- a/main/dnsmasq/dnsmasq.initd
+++ b/main/dnsmasq/dnsmasq.initd
@@ -8,11 +8,25 @@ description_checkconfig="Check configuration syntax"
extra_started_commands="reload"
description_reload="Clear cache and reload hosts files"
+: ${DNSMASQ_CONFFILE:=/etc/dnsmasq.conf}
+
command="/usr/sbin/dnsmasq"
# Tell dnsmasq to not create pidfile, that's responsibility of init system.
-command_args="-k --pid-file= $DNSMASQ_OPTS"
+command_args="-k --pid-file= $DNSMASQ_OPTS --conf-file=$DNSMASQ_CONFFILE"
command_background="yes"
-pidfile="/run/dnsmasq.pid"
+pidfile="/run/${RC_SVCNAME}.pid"
+leasefile=/var/lib/misc/$RC_SVCNAME.leases
+
+if [ "${RC_SVCNAME#*.}" != "$RC_SVCNAME" ]; then
+ BRIDGE="${RC_SVCNAME#*.}"
+ : ${BRIDGE_ADDR:="10.0.3.1"}
+ : ${BRIDGE_NETMASK:="255.255.255.0"}
+ : ${BRIDGE_NETWORK:="10.0.3.0/24"}
+ : ${BRIDGE_DHCP_RANGE:="10.0.3.2,10.0.3.254"}
+ : ${BRIDGE_DHCP_MAX:="253"}
+ : ${BRIDGE_MAC:="00:16:3e:00:00:00" }
+fi
+.
depend() {
provide dns
@@ -21,22 +35,77 @@ depend() {
use logger
}
+setup_firewall() {
+ local ins=$1 add=$2
+ iptables -w $ins INPUT -i ${BRIDGE} -p udp --dport 67 -j ACCEPT
+ iptables -w $ins INPUT -i ${BRIDGE} -p tcp --dport 67 -j ACCEPT
+ iptables -w $ins INPUT -i ${BRIDGE} -p udp --dport 53 -j ACCEPT
+ iptables -w $ins INPUT -i ${BRIDGE} -p tcp --dport 53 -j ACCEPT
+ iptables -w $ins FORWARD -i ${BRIDGE} -j ACCEPT
+ iptables -w $ins FORWARD -o ${BRIDGE} -j ACCEPT
+ iptables -w -t nat $add POSTROUTING -s ${BRIDGE_NETWORK} ! -d ${BRIDGE_NETWORK} -j MASQUERADE
+ iptables -w -t mangle $add POSTROUTING -o ${BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
+}
+
+setup_bridge() {
+ if ! [ -d /sys/class/net/$BRIDGE ]; then
+ ip link add dev $BRIDGE type bridge
+ fi
+ ip addr add ${BRIDGE_ADDR}/${BRIDGE_NETMASK} dev $BRIDGE \
+ && ip link set dev $BRIDGE address ${BRIDGE_MAC} \
+ && ip link set dev $BRIDGE up
+
+ echo 1 > /proc/sys/net/ipv4/ip_forward
+ echo 0 > /proc/sys/net/ipv6/conf/${BRIDGE}/accept_dad || true
+
+ if [ -n "$BRIDGE_IPV6_ADDR" ] && [ -n "$BRIDGE_IPV6_MASK" ] && [ "$BRIDGE_IPV6_NETWORK" ]; then
+ echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
+ echo 0 > /proc/sys/net/ipv6/conf/${BRIDGE}/autoconf
+ ip -6 addr add dev ${BRIDGE} ${BRIDGE_IPV6_ADDR}/${BRIDGE_IPV6_MASK}
+ if [ "$BRIDGE_IPV6_NAT" = "true" ]; then
+ ip6tables -w -t nat -A POSTROUTING -s ${BRIDGE_IPV6_NETWORK} ! -d ${BRIDGE_IPV6_NETWORK} -j MASQUERADE
+ fi
+ command_args="$command_args --dhcp-range=${BRIDGE_IPV6_ADDR},ra-only --listen-address ${BRIDGE_IPV6_ADDR}"
+ fi
+
+}
+
start_pre() {
- $command --test 2>/dev/null || $command --test || return 1
- checkpath -m 0644 -o dnsmasq:dnsmasq -f /var/lib/misc/dnsmasq.leases
+ $command --test --conf-file=$DNSMASQ_CONFFILE >/dev/null 2>&1 \
+ || $command --test || return 1
+ checkpath -m 0644 -o dnsmasq:dnsmasq -f $leasefile || return 1
+
+ if [ -n "$DNSMASQ_CONFFILE" ]; then
+ command_args="$command_args --conf-file=$DNSMASQ_CONFFILE"
+ fi
+ if [ -z "$BRIDGE" ]; then
+ return 0
+ fi
+
+ setup_bridge
+ setup_firewall -I -A
+ command_args="$command_args --strict-order --bind-interfaces --listen-address ${BRIDGE_ADDR} --except-interface=lo --interface=$BRIDGE --dhcp-range $BRIDGE_DHCP_RANGE --dhcp-lease-max=$BRIDGE_DHCP_MAX --dhcp-no-override --dhcp-leasefile=$leasefile --dhcp-authoritative"
+}
+
+stop_post() {
+ if [ -n "$BRIDGE" ]; then
+ ip link set dev $BRIDGE down
+ setup_firewall -D -D
+ # dont destroy if there are attached interfaces
+ ls /sys/class/net/${BRIDGE}/brif/* > /dev/null 2>&1 || ip link delete ${BRIDGE}
+ fi
}
reload() {
ebegin "Reloading $RC_SVCNAME"
-
- start_pre || return 1
+ $command --test --conf-file=$DNSMASQ_CONFFILE >/dev/null 2>&1 \
+ || $command --test || return 1
start-stop-daemon --signal HUP --pidfile "$pidfile"
eend $?
}
checkconfig() {
ebegin "Checking $RC_SVCNAME configuration"
-
- $command --test
+ $command --test --conf-file=$DNSMAQ_CONFFILE
eend $?
}