(Jason@zx2c4.com)
ipset-dns is a lightweight DNS forwarding server that adds all resolved IPs
to a given netfilter ipset. It is designed to be
used in conjunction with dnsmasq's
upstream server directive.Practical use cases include routing over a given gateway traffic for particular web services or webpages that do not have a priori predictable IP addresses and instead rely on dizzying arrays of DNS resolutions.
Upstream Dnsmasq Support
This functionality has now been written directly intodnsmasq, which should be much easier to use than this project. See the --ipset option.Why?
Some ISPs throttle connections to services like YouTube. Other times, you live places where there's no Netflix/Pandora/Hulu, but you've got a VPN.The problem is, you don't want to route all your internet traffic over VPN -- just for YouTube and Pandora, say. It'd be nice to just whitelist a static IP range, but some services, like YouTube, have a thousands of caching servers in a modicum of IP ranges, and it's just too much of a hassle to compile the list beforehand.
So instead, you put
ipset-dns on your router, and then everyone and every
XBox/PS3/whatever on your wifi network will benefit from the superior
bandwidth and/or geo-availability.Usage
# ipset-dns name-of-v4-ipset name-of-v6-ipset listening-port upstream-dns-server
ipset-dns binds only to localhost. It will daemonize unless the NO_DAEMONIZE
environment variable is set. If either name-of-v4-ipset or name-of-v6-ipset are
empty strings, then the ipset for the respective address family will not be utilized.Building
Linux >= 2.6.32:$ make
$ make OLD_IPSET=1
Example
Indnsmasq.conf:server=/c.youtube.com/127.0.0.1#1919
# ipset -N youtube iphash
ipset-dns server:# ipset-dns youtube 1919 8.8.8.8
# host r4---bru02t12.c.youtube.com
r4---bru02t12.c.youtube.com is an alias for r4.bru02t12.c.youtube.com.
r4.bru02t12.c.youtube.com has address 74.125.216.51
# ipset -L youtube
Name: youtube
Type: iphash
References: 1
Header: hashsize: 1024 probes: 8 resize: 50
Members:
74.125.216.51
Sample Script
The following script routes youtube and netflix over two different repective gateways. It assumes you're usingdnsmasq or similar to manage caching and
selectively using upstream servers:server=/c.youtube.com/127.0.0.1#39128
server=/netflix.com/127.0.0.1#39129
tun11 and tun12 are assumed to be OpenVPN tunnels,
though they may be any other kind of interface with a route. These devices are
assumed to have some form of masquerading and IP forwarding turned on already.The
mangle iptables table is used to set a firewall mark on packets that
match an ipset tended to by ipset-dns. A routing table is created and a rule
is entered that sends packets marked by iptables to the correct routing table.
Finally, a default route is given to the marked routing table.Two
ipset-dns daemons are started, one for each of the routes, using the ports
given by dnsmasq. Lastly, SIGHUP is sent to dnsmasq to flush its cache.sets() {
iptables -t mangle -D PREROUTING -m set --set "$1" dst,src -j MARK --set-mark "$2" 2>/dev/null
ipset -X "$1" 2>/dev/null
ipset -N "$1" iphash
iptables -t mangle -A PREROUTING -m set --set "$1" dst,src -j MARK --set-mark "$2"
}
sets youtube 1
sets netflix 2
routes() {
echo 0 > /proc/sys/net/ipv4/conf/$2/rp_filter
ip route flush table $1 2>/dev/null
ip rule del table $1 2>/dev/null
ip rule add fwmark $1 table $1 priority 1000
ip route add default via "$(ip route show dev $2 | head -n 1 | cut -d ' ' -f 1)" table $1
}
routes 1 tun12
routes 2 tun11
killall ipset-dns 2>/dev/null
ipset-dns youtube 39128 8.8.8.8
ipset-dns netflix 39129 8.8.8.8
killall -SIGHUP dnsmasq
from https://git.zx2c4.com/ipset-dns/about/
No comments:
Post a Comment