Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    ::1
    il 2016-12-03 00:55:11.0 alle 2016-12-03 00:55:11.0
    Trollate totali: 12321
    dynamic dns fatto in casa
    Per la rubrica Parliamo di informatica oggi creiamo un servizio dynamic dns fatto in casa.

    Su gandi.net ho configurato lo zone file per il mio dominio:
    @ 10800 IN A 1.2.3.4
    ns 10800 IN A 1.2.3.4
    * 10800 IN CNAME ilmiodominio.com.
    *.ns 10800 IN NS ns
    

    Questo si legge così: la @ indica le richieste dell'indirizzo ilmiodominio.com (vanno all'ip 1.2.3.4, A sta per address ipv4), stessa cosa per ns.ilmiodominio.com, poi wildcard per *.ilmiodominio.com che vanno sempre all'ip di cui sopra e infine *.ns.ilmiodominio.com che vanno a chiedere l'indirizzo al server (record NS).

    Ora sul mio server che risponde a 1.2.3.4 ho installato bind ed aggiunto al file di configurazione /etc/named.conf la sezione:
    zone "ilmiodominio.com" {
      type master;
      file "dnsdb.ilmiodominio.com";
      allow-update { localhost; };
    };
    

    Ho detto che il file di definizione è /var/named/dnsdb.ilmiodominio.com e che le richieste di update vengono accettate solo da localhost e non dall'esterno.
    Ho anche attivato un casino di logging perché non ci stavo riuscendo, ma quello è un altro discorso.

    Ho creato lo zone file:
    $ORIGIN ilmiodominio.com.
    $TTL 1h
    
    @ 1D IN SOA ilmiodominio.com. root.ilmiodominio.com. (
      2016120301 ; serial
      1H ; refresh
      15M ; retry
      1W ; expiry
      1D ) ; ttl minimo
        1D IN NS ns.ilmiodominio.com.
    ns.ilmiodominio.com. 1D IN A 127.0.0.1
    


    Avviato il servizio, dalla stessa macchina (per via di allow-update nel named.conf) ho provato ad inserire un record:
    $ cat add_loopback.txt
    server localhost
    zone ilmiodominio.com
    update add loopback.ns.ilmiodominio.com. 3600 A 127.0.0.1
    show
    send
    $ nsupdate add_loopback.txt
    Outgoing update query:
    ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
    ;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
    ;; ZONE SECTION:
    ;ilmiodominio.com.			IN	SOA
    
    ;; UPDATE SECTION:
    loopback.ns.ilmiodominio.com.	3600	IN	A	127.0.0.1
    
    $
    


    Infine dal pc di casa ho testato:
    ping loopback.ns.ilmiodominio.com
    PING loopback.ns.ilmiodominio.com (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.026 ms
    ^C
    --- loopback.ns.ilmiodominio.com ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms
    


    Lascio come esercizio al lettore quello di creare una api http per lanciare nsupdate e gestire da remoto gli indirizzi.
    Young professional woman and busy mom.
    • Avatar
      ☺
      Scritto da
      ::1
      il 2016-12-03 19:37:34.0 alle 2016-12-03 19:37:34.0
      Trollate totali: 12321
      Re: dynamic dns fatto in casa
      Invece di perder tempo dietro alle cacate di wakko ho finito il progetto di ieri.

      Sul server ho installato openresty, che sarebbe un nginx scriptabile in lua (che da oggi in avanti definirò una merda di linguaggio).
      Installato openresty ho definito nel suo nginx.conf il puntamento allo script lua:
      ...
        server {
          listen 80;
          server_name ns.ilmiodominio.com;
          location /nsadmin {
            content_by_lua_file conf/nsadmin.lua;
          }
        }
      ...
      


      E definito lo script lua seguente:
      local key = ngx.var.arg_key
      local domain = ngx.var.arg_domain
      local ip = ngx.var.arg_ip
      
      fd = io.open("/opt/openresty/nginx/conf/credentials.txt")
      for line in fd:lines() do
        local lkey, ldomain = line:match("^([^:]*):([^:]*)$")
        if key == lkey and domain == ldomain then
          if ip == nil then
            break
          end
          ngx.log(ngx.DEBUG, "updating: k=" .. key .. " d=" .. domain .. " i=" .. ip)
          local cmd = 'server localhost\n'
          cmd = cmd .. 'zone ilmiodominio.com\n'
          cmd = cmd .. 'update delete ' .. domain .. '.ns.ilmiodominio.com A\n'
          cmd = cmd .. 'update add ' .. domain .. '.ns.ilmiodominio.com 3600 A ' .. ip .. '\n'
          cmd = cmd .. 'show\n'
          cmd = cmd .. 'send\n'
          ngx.say('nsupdate command:\n' .. cmd)
          p = io.popen("echo '" .. cmd .. "' | nsupdate 2>&1")
          for pline in p:lines() do
            ngx.say(pline .. "\n")
          end
          p.close()
          return
        end
      end
      fd:close()
      
      ngx.say("unauthorized")
      


      Ho creato il file credentials.txt che contiene le coppie chiave-dominio separate da due punti:
      passwordsegretissima:nomedelsottodominio
      


      Abilitato e startato il servizio openresty mi sono dedicato al client, dove ho creato uno script che esegue:
      #!/usr/bin/env sh
      exec curl -v 'http://ns.ilmiodominio.com/nsadmin?key=passwordsegretissima&domain=nomedelsottodominio&ip='$(ifdata -pa eth0)
      

      ifdata si trova in moreutils.

      Ed infine inserito l'esecuzione dello script nel crontab del client.
      Mission accomplished!

      **Modificato dall'autore il 03.12.2016 19:38**
      Young professional woman and busy mom.
      • Avatar
        Scritto da
        Non Autenticato
        il 2016-12-03 20:55:31.0 alle 2016-12-03 20:55:31.0
        Re: dynamic dns fatto in casa
        Scritto da: ::1
        > Invece di perder tempo dietro alle cacate di wakko ho finito il progetto di ieri.
        >
        > Sul server ho installato openresty, che sarebbe un nginx scriptabile in lua (che da oggi in avanti definirò una merda di linguaggio).
        > Installato openresty ho definito nel suo nginx.conf il puntamento allo script lua:
        >
        > ...
        > server {
        > listen 80;
        > server_name ns.ilmiodominio.com;
        > location /nsadmin {
        > content_by_lua_file conf/nsadmin.lua;
        > }
        > }
        > ...
        > 

        >
        > E definito lo script lua seguente:
        >
        > local key = ngx.var.arg_key
        > local domain = ngx.var.arg_domain
        > local ip = ngx.var.arg_ip
        > 
        > fd = io.open("/opt/openresty/nginx/conf/credentials.txt")
        > for line in fd:lines() do
        > local lkey, ldomain = line:match("^([^:]*):([^:]*)$")
        > if key == lkey and domain == ldomain then
        > if ip == nil then
        > break
        > end
        > ngx.log(ngx.DEBUG, "updating: k=" .. key .. " d=" .. domain .. " i=" .. ip)
        > local cmd = 'server localhost\n'
        > cmd = cmd .. 'zone ilmiodominio.com\n'
        > cmd = cmd .. 'update delete ' .. domain .. '.ns.ilmiodominio.com A\n'
        > cmd = cmd .. 'update add ' .. domain .. '.ns.ilmiodominio.com 3600 A ' .. ip .. '\n'
        > cmd = cmd .. 'show\n'
        > cmd = cmd .. 'send\n'
        > ngx.say('nsupdate command:\n' .. cmd)
        > p = io.popen("echo '" .. cmd .. "' | nsupdate 2>&1")
        > for pline in p:lines() do
        > ngx.say(pline .. "\n")
        > end
        > p.close()
        > return
        > end
        > end
        > fd:close()
        > 
        > ngx.say("unauthorized")
        > 

        >
        > Ho creato il file credentials.txt che contiene le coppie chiave-dominio separate da due punti:
        >
        > passwordsegretissima:nomedelsottodominio
        > 

        >
        > Abilitato e startato il servizio openresty mi sono dedicato al client, dove ho creato uno script che esegue:
        >
        > #!/usr/bin/env sh
        > exec curl -v 'http://ns.ilmiodominio.com/nsadmin?key=passwordsegretissima&domain=nomedelsottodominio&ip='$(ifdata -pa eth0)
        > 

        > ifdata si trova in moreutils.
        >
        > Ed infine inserito l'esecuzione dello script nel crontab del client.
        > Mission accomplished!

        Tutto ciò è molto interessante, ma al di fuori della mia portata A bocca storta

        Ad alto livello, il tuo DNS dinamico privato come funziona?

        Dovessi farmene uno pecoreccio metterei su un server online, sotto un dominio, uno script che se non ha il mio IP scrive "offline", se lo ha funge da proxy (andrebbe visto come) verso casa mia. Allo script comunico l'IP collegandomi, ma bisognerebbe anche fare in modo che solo io possa farlo.
        • Avatar
          ☺
          Scritto da
          ::1
          il 2016-12-03 21:00:42.0 alle 2016-12-03 21:00:42.0
          Trollate totali: 12321
          Re: dynamic dns fatto in casa
          Scritto da:
          > Tutto ciò è molto interessante, ma al di fuori della mia portata A bocca storta
          >
          > Ad alto livello, il tuo DNS dinamico privato come funziona?

          Metti una riga password:dominio nel file credentials.txt, e poi fai chiamare al client periodicamente la url di aggiornamento dell'ip.

          > Dovessi farmene uno pecoreccio metterei su un server online, sotto un dominio, uno script che se non ha il mio IP scrive "offline", se lo ha funge da proxy (andrebbe visto come) verso casa mia. Allo script comunico l'IP collegandomi, ma bisognerebbe anche fare in modo che solo io possa farlo.

          Non è questo lo scopo del progetto. Per fare quello che dici te bisogna scriptare un reverse tunnel ssh.
          Young professional woman and busy mom.
<softv>

Pagina generata in 154 millisecondi

Utenti attivi: 7 nell'ultimo minuto, 24 negli ultimi cinque minuti, 47 negli ultimi 15 minuti