Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| user:gp68:unbound [2024-09-02T17:01:35Z] – gp68 | user:gp68:unbound [2024-09-03T11:03:59Z] (current) – gp68 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Unbound Howto ====== | ====== Unbound Howto ====== | ||
| + | This setup is build as an example to work as tier1 or tier2 server. \\ | ||
| + | There is an update script which sets up all slave zones and does an tier1 anmd tiar2 server test after update. \\ | ||
| + | The update script also checks dnssec basics and updates the files in git. \\ | ||
| + | /// | ||
| + | |||
| ===== Base setup ===== | ===== Base setup ===== | ||
| - | <code> | + | <file txt unbound.conf> |
| server: | server: | ||
| verbosity: 1 | verbosity: 1 | ||
| Line 10: | Line 15: | ||
| # ---------------------- | # ---------------------- | ||
| # optimizations https:// | # optimizations https:// | ||
| + | # adjust for your needs | ||
| # ---------------------- | # ---------------------- | ||
| num-threads: | num-threads: | ||
| Line 30: | Line 36: | ||
| stream-wait-size: | stream-wait-size: | ||
| # ---------------------- | # ---------------------- | ||
| + | # can be set to 0 if you don't need | ||
| + | # | ||
| statistics-interval: | statistics-interval: | ||
| # ---------------------- | # ---------------------- | ||
| Line 42: | Line 50: | ||
| tls-service-key: | tls-service-key: | ||
| tls-service-pem: | tls-service-pem: | ||
| - | # | + | # i don't like files :-) |
| use-syslog: | use-syslog: | ||
| - | # first start | + | # ------------------------------------- |
| + | # for the first start update files | ||
| + | # named.cache.opennic and opennic.dnskey | ||
| + | # manually | ||
| + | # ------------------------------------- | ||
| # drill . ns @161.97.219.84 > named.cache.opennic | # drill . ns @161.97.219.84 > named.cache.opennic | ||
| # dig -t DNSKEY . @161.97.219.84 | dnssec-dsfromkey -1 -f - . > opennic.dnskey | # dig -t DNSKEY . @161.97.219.84 | dnssec-dsfromkey -1 -f - . > opennic.dnskey | ||
| Line 50: | Line 62: | ||
| root-hints: | root-hints: | ||
| trust-anchor-file: | trust-anchor-file: | ||
| + | # -------------------------------------------------- | ||
| # dnssec not working at the moment for all domains | # dnssec not working at the moment for all domains | ||
| + | # -------------------------------------------------- | ||
| harden-dnssec-stripped: | harden-dnssec-stripped: | ||
| harden-glue: | harden-glue: | ||
| - | aggressive-nsec: | + | aggressive-nsec: |
| - | do-not-query-localhost: | + | # access control for everyone ai and ipv6 |
| access-control: | access-control: | ||
| access-control: | access-control: | ||
| - | # | + | # no identity needed |
| hide-identity: | hide-identity: | ||
| identity: " | identity: " | ||
| Line 63: | Line 77: | ||
| version: | version: | ||
| tls-system-cert: | tls-system-cert: | ||
| + | # DOS protection | ||
| # | # | ||
| # | # | ||
| ratelimit: 100 | ratelimit: 100 | ||
| + | # --------------------------------------- | ||
| + | # for start make am empty file | ||
| + | # will be updated by refresh script | ||
| + | # | ||
| include: / | include: / | ||
| - | + | # | |
| - | local-zone: " | + | # enable control via locahhost |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | local-zone: " | + | |
| - | # test local | + | |
| - | # just an example | + | |
| - | # | + | |
| - | # | + | |
| - | # | + | |
| remote-control: | remote-control: | ||
| control-enable: | control-enable: | ||
| - | + | ||
| - | </code> | + | include: / |
| + | </file> | ||
| ===== Refresh script ===== | ===== Refresh script ===== | ||
| + | Gets the opennic root nameserver from the web | ||
| - | <code> | + | <file perl getroot_opennic.pl> |
| # | # | ||
| Line 152: | Line 134: | ||
| print $1 . " | print $1 . " | ||
| } | } | ||
| - | </code> | + | </file> |
| + | |||
| + | Refreshes the files | ||
| + | * opennic.dnskey | ||
| + | * named.cache.opennic | ||
| + | * opennic_server.conf | ||
| + | * opennic_domains.conf | ||
| + | |||
| + | The script locks for single usage and checks the serial of the root zone for changes. | ||
| + | |||
| + | <file bash refresh_base.sh> | ||
| + | # | ||
| + | |||
| + | # arch linux packets needed: | ||
| + | # - ldns | ||
| + | # - unbound | ||
| + | # - gawk | ||
| + | # - coreutils | ||
| + | # - grep | ||
| + | |||
| + | AWK=/ | ||
| + | CUT=/ | ||
| + | DIG="/ | ||
| + | GREP=/ | ||
| + | PRINTF=/ | ||
| + | SED=/ | ||
| + | KF=opennic.dnskey | ||
| + | CF=named.cache.opennic | ||
| + | SF=opennic_server.conf | ||
| + | DF=opennic_domains.conf | ||
| + | MYIP='< | ||
| + | |||
| + | if [ " | ||
| + | echo "set varieble MYIP in this script" | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | cd `dirname $0` | ||
| + | |||
| + | # Make sure only one copy runs at a time | ||
| + | LOCK=" | ||
| + | r=$($PRINTF %05d $RANDOM) | ||
| + | sleep ${r: | ||
| + | if [ -f $LOCK ]; then | ||
| + | last_serial=$(cat $LOCK) | ||
| + | dt=$((`date +%s` - `date -r $LOCK +%s`)) | ||
| + | if [ $dt -lt 600 ]; then | ||
| + | echo "Last run ${dt}s < 600s left" | ||
| + | exit 0; | ||
| + | else | ||
| + | echo "Last run ${dt}s" | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | touch $LOCK | ||
| + | |||
| + | # first get any tier1 server to start | ||
| + | NS=( $(./ | ||
| + | |||
| + | echo -n " | ||
| + | |||
| + | for ns in " | ||
| + | echo -n "$ns " | ||
| + | soa=$($DIG -Q SOA . @$ns) | ||
| + | if [ " | ||
| + | done | ||
| + | if [ ! " | ||
| + | echo "No Opennic tier1 server could not be reached -- aborting!" | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | echo | ||
| + | |||
| + | # get master server | ||
| + | NS0=$(echo $NS0 | awk ' | ||
| + | |||
| + | echo -n " | ||
| + | |||
| + | # get ip from master server | ||
| + | NS=( $(drill -Q @$ns ns0.opennic.glue.) ) | ||
| + | for ns in " | ||
| + | if [ " | ||
| + | done | ||
| + | if [ ! " | ||
| + | echo "could not be reached -- aborting!" | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | echo " | ||
| + | |||
| + | soa=$($DIG -Q SOA . @$NS0) | ||
| + | serial=$(echo $soa | awk '{ print $3}' | ||
| + | refresh=$(echo $soa | awk '{ print $4}' | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | |||
| + | echo $serial > $LOCK | ||
| + | |||
| + | if [ -z " | ||
| + | last_serial=0 | ||
| + | fi | ||
| + | |||
| + | if [ $last_serial == $serial ]; then | ||
| + | echo "No Update needed serial not changed" | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | dig . ns @${NS0} > $CF | ||
| + | echo " | ||
| + | |||
| + | dig -t DNSKEY . @${NS0} | dnssec-dsfromkey -1 -f - . > $KF | ||
| + | dig -t DNSKEY . @${NS0} | dnssec-dsfromkey -2 -f - . >> $KF | ||
| + | cp $KF / | ||
| + | echo " | ||
| + | |||
| + | # Start printing the new file | ||
| + | ifs=$IFS | ||
| + | |||
| + | # Collect list of TLDs | ||
| + | TXT=(dns.opennic.glue $($DIG -Q @$NS0 TXT tlds.opennic.glue | tr -d '"' | ||
| + | IFS=$' | ||
| + | IFS=$ifs | ||
| + | if [ " | ||
| + | echo " | ||
| + | rm -f $LOCK | ||
| + | exit 1 | ||
| + | else | ||
| + | echo "TLDS: ${TLDS[*]}" | ||
| + | fi | ||
| + | |||
| + | echo "#" | ||
| + | echo "# OpenNIC zone config - file created by $HOSTNAME" | ||
| + | echo "# Generated on `date '+%A, %d %b %Y at %T' | ||
| + | echo "#" | ||
| + | |||
| + | echo "#" | ||
| + | echo "# OpenNIC server config for opennic - file created by $HOSTNAME" | ||
| + | echo "# Generated on `date '+%A, %d %b %Y at %T' | ||
| + | echo "#" | ||
| + | |||
| + | |||
| + | for TLD in " | ||
| + | if [ $TLD != ' | ||
| + | echo -n ' | ||
| + | echo -n $TLD >> $SF | ||
| + | echo '"' | ||
| + | fi | ||
| + | # Check if this zone is mastered by this server | ||
| + | zone=" | ||
| + | if [ " | ||
| + | zone="" | ||
| + | fi | ||
| + | master=($($DIG -Q TXT $zone. @$NS0 | sed ' | ||
| + | |||
| + | echo "TLD $TLD master = ${master[*]}" | ||
| + | |||
| + | # Begin printing the zone config | ||
| + | echo >> $DF | ||
| + | echo " | ||
| + | echo " | ||
| + | if [ $TLD == ' | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | echo " | ||
| + | # Collect a list of master nameservers for the zone | ||
| + | for mm in " | ||
| + | mm=$(echo $mm | $SED ' | ||
| + | ns=$(echo $mm | $CUT -d. -f1 | $SED ' | ||
| + | AT=" | ||
| + | if [ " | ||
| + | if [ " | ||
| + | |||
| + | # If this is an unknown NS, query its IPs | ||
| + | if [ ! " | ||
| + | A4=$($DIG -Q A $mm $AT) | ||
| + | A6=$($DIG -Q AAAA $mm $AT) | ||
| + | RES[$ns]=" | ||
| + | fi | ||
| + | read -a IP <<< | ||
| + | |||
| + | # Print all IPs for all nameservers | ||
| + | for addr in " | ||
| + | echo " | ||
| + | done | ||
| + | done | ||
| + | echo >> $DF | ||
| + | done | ||
| + | echo " | ||
| + | |||
| + | unbound-control reload_keep_cache | ||
| + | echo " | ||
| + | |||
| + | sleep 10 | ||
| + | |||
| + | wget -q --no-check-certificate -O test.txt " | ||
| + | if [ $(cat test.txt | perl -n -e 'if ( $p == 1 ) { /Passed/ && print " | ||
| + | echo " | ||
| + | rm -f test.txt | ||
| + | exit 1 | ||
| + | else | ||
| + | echo " | ||
| + | rm -f test.txt | ||
| + | fi | ||
| + | |||
| + | sleep 10 | ||
| + | |||
| + | wget -q --no-check-certificate -O test.txt " | ||
| + | if [ $(cat test.txt | perl -n -e '/ | ||
| + | echo " | ||
| + | rm -f test.txt | ||
| + | exit 1 | ||
| + | else | ||
| + | echo " | ||
| + | rm -f test.txt | ||
| + | fi | ||
| + | |||
| + | if [ -z " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | |||
| + | git commit -am " | ||
| + | </file> | ||