Added a presentation and documentation of the protocol.

Pascal J. Bourguignon [2015-08-07 06:41]
Added a presentation and documentation of the protocol.
Filename
ddns/README
ddns/README.pdf
diff --git a/ddns/README b/ddns/README
index ca5bb72..a268b1e 100644
--- a/ddns/README
+++ b/ddns/README
@@ -1,11 +1,104 @@
 .. comment: -*- mode:rst;coding:utf-8 -*-

+Presentation
+================================================================================
+
+DDNS is a couple of client/server programs, where the client sends a
+request to the server to update the dns record of the host with its
+current address using nsupdate.
+
+The DDNS server is not necessary running on the DNS server: ::
+
+    +------------+   tcp/ip    +------------+   nsupdate   +-------+
+    | dns-client |-------------| dns-server |--------------| bind9 |
+    +------------+             +------------+              +-------+
+
+
+Protocol
+--------------------------------------------------------------------------------
+
+The protocol is quite simple, and hopefully secure: ::
+
+  client                                                                 server
+    |                                                                       |
+    |------------------(connect-to)---------------------------------------->|
+    |                                                                       |
+    |<--------------(220 DDNS "E05B8DC05EFC044E" dyn.informatimago.com.)----|
+    |                                                                       |
+    |-------("2C404AABF4007F798116DB62F0BF6BB4" "kuiper")------------------>|
+    |                                                                       |
+    |<--------------(251 "83.202.195.150" No change.)-----------------------|
+    |                                                                       |
+    |<-------------(disconnect)-------------------------------------------->|
+    |                                                                       |
+
+#. The client connects.
+
+#. The server sends an answer:
+
+     - status code: 220
+     - protocol: DDNS
+     - a random seed: "E05B8DC05EFC044E"
+     - its dynamic domain name $ORIGIN: dyn.informatimago.com.
+
+#. The client sends a request:
+
+     - opening parenthesis: (
+     - hashed secret: "2C404AABF4007F798116DB62F0BF6BB4"
+     - host name: "kuiper"
+     - closing parenthesis: )
+
+   The hashed secret is the MD5 hash of the concatenation of the
+   hostname, "/", the seed, "/" and a common secret.
+
+#. The server checks the hashed secret, and if it matches,
+   updates the DNS records with the address of the client and the host
+   name. It sends an answer:
+
+     - status code,
+     - address of the client,
+     - message
+     - optionally, continuation lines with output from the nsupdate
+       process.
+
+   The status code is:
+
+     - 250 for successful update,
+     - 251 for no change, the host has already this address,
+     - 501 for an Invalid token.
+     - 530 for an failure to authenticate.
+     - 553 for an update error.
+
+   Examples: ::
+
+        250 "83.202.195.150" Update successful.
+        250-Outgoing update query:
+        250-;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
+        250-;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
+        250-;; UPDATE SECTION:
+        250-kuiper.dyn.informatimago.com. 0     ANY     A
+        250-kuiper.dyn.informatimago.com. 10 IN A       83.202.195.150
+        250-
+
+        251 "83.202.195.150" No change.
+
+        501 Invalid token.
+
+        530 Authentication invalid.
+
+        553 "83.202.195.150" Update failed.
+        553-update failed: SERVFAIL
+
+
 Compilation
 ================================================================================

 - clisp is used to compile the programs.
   http://clisp.cons.org/

+- alternatively, ccl can be used to compile the programs.
+  http://ccl.clozure.com/
+
 - quicklisp is required to compile and donwload dependencies. If it's
   not already installed in the user account compiling the program,
   then you may install it with:  ::
@@ -19,13 +112,49 @@ Compilation
     yes|clisp -norc -x '(load "quicklisp.lisp")' -x '(quicklisp-quickstart:install)' -x '(ql:add-to-init-file)'
     popd

-- then you may compile the programs, and install them in /usr/local/sbin/: ::
+- tune the configuration in ``server.lisp``: ::
+
+    (defparameter *default-port*          8053)
+    (defparameter *default-origin*       "dyn.informatimago.com.")
+    (defparameter *default-dns-server*   "localhost")
+
+-  and in ``client.lisp``: ::
+
+    (defparameter *default-port*         8053)
+    (defparameter *default-ddns-server*  "hubble.informatimago.com")
+    (defparameter *default-secret-file*  #P"dnskeys/ddns.secret")
+
+  the ports shall be the same in both files.
+
+- then you may compile the programs: ::

-    make && make install
+    make
+
+Note: there's a bug with the latest clisp-2.49+ that prevents the client to
+run.  Instead, we'll compile it with ccl.
+
+When compiled with clisp, the client usage is: ::
+
+    ddns-client -- $host
+
+When compiled with ccl, the client usage is: ::
+
+    ddns-client $host
+
+

 Installation
 ================================================================================

+Creation of keys, and configuration of bind to receive dyndns updates
+--------------------------------------------------------------------------------
+
+See:
+
+#. _`http://linux.yyz.us/dns/ddns-server.html` and
+#. _`http://linux.yyz.us/nsupdate/`
+
+
 On the server
 --------------------------------------------------------------------------------

@@ -42,7 +171,7 @@ On the server

 #. The server is installed in ``/home/ddns/bin/`` with: ::

-     make install
+     make install-server

 #. Edit ``/etc/rc.local``, adding: ::

@@ -59,21 +188,46 @@ On the server
 On the clients
 --------------------------------------------------------------------------------

+Currently we run the client as root, but it could and should be run
+under a ddns user account like the server.

-Current configuration
+#. The client is installed in ``/usr/local/sbin/`` with: ::
+
+     sudo make install-client
+
+#. Install the keys: ::
+
+     mkdir /root/dnskeys/
+     # install:
+     #    ddns.secret
+     # in /root/dnskeys/
+
+#. ``/usr/local/sbin/ddns-client`` is run from root with cron, fcron,
+   dcron, etc, a few times a hour.  With cron, ``/etc/crontab`` entry:
+   ::
+
+      5 * * * *   root    /usr/local/sbin/ddns-client kuiper
+
+
+
+License, Development, Contact
 ================================================================================

-On kuiper, /usr/local/sbin/ddns-client is run from root
-/etc/fcron/fcrontab.
+This program DDNS (ddns-client and ddns-server), is distributed under
+the AGPL3 license.
+
+Copyright 2012 - 2015 Pascal J. Bourguignon

-- /root/dnskeys/
+The sources are obtainable with git: ::

-::
-   5  *    * * *   root    /usr/local/sbin/ddns-client -- kuiper
+      git clone http://git.informatimago.com/public/domains
+      cd domains/ddns/

+Send requests, bug reports, patches: _`mailto:pjb@informatimago.com`.

-On hubble, /home/ddns/bin/ddns-server is run from ddns in a screen
-launched from /etc/rc.local
+Known Bugs:

-- /home/ddns/dnskeys/
+#. We use MD5 in the protocol, this is not safe anymore, SHA256 should
+   be used instead.

+.. comment: THE END
diff --git a/ddns/README.pdf b/ddns/README.pdf
new file mode 100644
index 0000000..c8cdbd6
--- /dev/null
+++ b/ddns/README.pdf
@@ -0,0 +1,1973 @@
+%PDF-1.4
+% ReportLab Generated PDF document http://www.reportlab.com
+% 'BasicFonts': class PDFDictionary
+1 0 obj
+% The standard fonts dictionary
+<< /F1 2 0 R
+ /F2 3 0 R
+ /F3 4 0 R >>
+endobj
+% 'F1': class PDFType1Font
+2 0 obj
+% Font Helvetica
+<< /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font >>
+endobj
+% 'F2': class PDFType1Font
+3 0 obj
+% Font Helvetica-Bold
+<< /BaseFont /Helvetica-Bold
+ /Encoding /WinAnsiEncoding
+ /Name /F2
+ /Subtype /Type1
+ /Type /Font >>
+endobj
+% 'F3': class PDFType1Font
+4 0 obj
+% Font Courier
+<< /BaseFont /Courier
+ /Encoding /WinAnsiEncoding
+ /Name /F3
+ /Subtype /Type1
+ /Type /Font >>
+endobj
+% 'Page1': class PDFPage
+5 0 obj
+% Page dictionary
+<< /Contents 23 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 22 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans <<  >>
+ /Type /Page >>
+endobj
+% 'Annot.NUMBER1': class PDFDictionary
+6 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://clisp.cons.org/) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 255.7529
+ 276.5736
+ 344.6829
+ 288.5736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER2': class PDFDictionary
+7 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://ccl.clozure.com/) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 329.6829
+ 258.5736
+ 426.3829
+ 270.5736 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Page2': class PDFPage
+8 0 obj
+% Page dictionary
+<< /Annots [ 6 0 R
+ 7 0 R ]
+ /Contents 24 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 22 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans <<  >>
+ /Type /Page >>
+endobj
+% 'Page3': class PDFPage
+9 0 obj
+% Page dictionary
+<< /Contents 25 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 22 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans <<  >>
+ /Type /Page >>
+endobj
+% 'Page4': class PDFPage
+10 0 obj
+% Page dictionary
+<< /Contents 26 0 R
+ /MediaBox [ 0
+ 0
+ 595.2756
+ 841.8898 ]
+ /Parent 22 0 R
+ /Resources << /Font 1 0 R
+ /ProcSet [ /PDF
+ /Text
+ /ImageB
+ /ImageC
+ /ImageI ] >>
+ /Rotate 0
+ /Trans <<  >>
+ /Type /Page >>
+endobj
+% 'R11': class PDFCatalog
+11 0 obj
+% Document Root
+<< /Outlines 13 0 R
+ /PageLabels 27 0 R
+ /PageMode /UseNone
+ /Pages 22 0 R
+ /Type /Catalog >>
+endobj
+% 'R12': class PDFInfo
+12 0 obj
+<< /Author ()
+ /CreationDate (D:20150807083812-01'00')
+ /Creator (\(unspecified\))
+ /Keywords ()
+ /Producer (ReportLab PDF Library - www.reportlab.com)
+ /Subject (\(unspecified\))
+ /Title () >>
+endobj
+% 'R13': class PDFOutlines
+13 0 obj
+<< /Count 10
+ /First 14 0 R
+ /Last 21 0 R
+ /Type /Outlines >>
+endobj
+% 'Outline.0': class OutlineEntryObject
+14 0 obj
+<< /Count 1
+ /Dest [ 5 0 R
+ /XYZ
+ 62.69291
+ 765.0236
+ 0 ]
+ /First 15 0 R
+ /Last 15 0 R
+ /Next 16 0 R
+ /Parent 13 0 R
+ /Title (Presentation) >>
+endobj
+% 'Outline.9.0': class OutlineEntryObject
+15 0 obj
+<< /Dest [ 5 0 R
+ /XYZ
+ 62.69291
+ 626.8236
+ 0 ]
+ /Parent 14 0 R
+ /Title (Protocol) >>
+endobj
+% 'Outline.1': class OutlineEntryObject
+16 0 obj
+<< /Dest [ 8 0 R
+ /XYZ
+ 62.69291
+ 323.8236
+ 0 ]
+ /Next 17 0 R
+ /Parent 13 0 R
+ /Prev 14 0 R
+ /Title (Compilation) >>
+endobj
+% 'Outline.2': class OutlineEntryObject
+17 0 obj
+<< /Count 3
+ /Dest [ 9 0 R
+ /XYZ
+ 62.69291
+ 449.0236
+ 0 ]
+ /First 18 0 R
+ /Last 20 0 R
+ /Next 21 0 R
+ /Parent 13 0 R
+ /Prev 16 0 R
+ /Title (Installation) >>
+endobj
+% 'Outline.10.0': class OutlineEntryObject
+18 0 obj
+<< /Dest [ 9 0 R
+ /XYZ
+ 62.69291
+ 416.0236
+ 0 ]
+ /Next 19 0 R
+ /Parent 17 0 R
+ /Title (Creation of keys, and configuration of bind to receive dyndns updates) >>
+endobj
+% 'Outline.10.1': class OutlineEntryObject
+19 0 obj
+<< /Dest [ 9 0 R
+ /XYZ
+ 62.69291
+ 314.0236
+ 0 ]
+ /Next 20 0 R
+ /Parent 17 0 R
+ /Prev 18 0 R
+ /Title (On the server) >>
+endobj
+% 'Outline.10.2': class OutlineEntryObject
+20 0 obj
+<< /Dest [ 10 0 R
+ /XYZ
+ 62.69291
+ 640.6236
+ 0 ]
+ /Parent 17 0 R
+ /Prev 19 0 R
+ /Title (On the clients) >>
+endobj
+% 'Outline.3': class OutlineEntryObject
+21 0 obj
+<< /Dest [ 10 0 R
+ /XYZ
+ 62.69291
+ 379.0236
+ 0 ]
+ /Parent 13 0 R
+ /Prev 17 0 R
+ /Title (License, Development, Contact) >>
+endobj
+% 'R22': class PDFPages
+22 0 obj
+% page tree
+<< /Count 4
+ /Kids [ 5 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R ]
+ /Type /Pages >>
+endobj
+% 'R23': class PDFStream
+23 0 obj
+% page stream
+<< /Length 7307 >>
+stream
+1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 744.0236 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Presentation) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 714.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .507209 Tw (DDNS is a couple of client/server programs, where the client sends a request to the server to update the) Tj T* 0 Tw (dns record of the host with its current address using nsupdate.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 696.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The DDNS server is not necessary running on the DNS server:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 638.8236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 48 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 26 Tm /F3 10 Tf 12 TL (+------------+   tcp/ip    +------------+   nsupdate   +-------+) Tj T* (| dns-client |-------------| dns-server |--------------| bind9 |) Tj T* (+------------+             +------------+              +-------+) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 608.8236 cm
+q
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Protocol) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 590.8236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The protocol is quite simple, and hopefully secure:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 427.3803 cm
+q
+q
+.988825 0 0 .988825 0 0 cm
+q
+1 0 0 1 6.6 6.674587 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 474 156 re B*
+Q
+q
+BT 1 0 0 1 0 134 Tm 12 TL /F3 10 Tf 0 0 0 rg (client                                                                 server) Tj T* (  |                                                                       |) Tj T* (  |------------------\(connect-to\)----------------------------------------) Tj (>) Tj (|) Tj T* (  |                                                                       |) Tj T* (  |) Tj (<) Tj (--------------\(220 DDNS "E05B8DC05EFC044E" dyn.informatimago.com.\)----|) Tj T* (  |                                                                       |) Tj T* (  |-------\("2C404AABF4007F798116DB62F0BF6BB4" "kuiper"\)------------------) Tj (>) Tj (|) Tj T* (  |                                                                       |) Tj T* (  |) Tj (<) Tj (--------------\(251 "83.202.195.150" No change.\)-----------------------|) Tj T* (  |                                                                       |) Tj T* (  |) Tj (<) Tj (-------------\(disconnect\)--------------------------------------------) Tj (>) Tj (|) Tj T* (  |                                                                       |) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 413.3803 cm
+Q
+q
+1 0 0 1 62.69291 413.3803 cm
+Q
+q
+1 0 0 1 62.69291 401.3803 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The client connects.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 395.3803 cm
+Q
+q
+1 0 0 1 62.69291 305.3803 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 75 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 75 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The server sends an answer:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 69 cm
+Q
+q
+1 0 0 1 23 -3 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 0 2 Tm  T* ET
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 54 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (status code: 220) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 48 cm
+Q
+q
+1 0 0 1 20 36 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (protocol: DDNS) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 30 cm
+Q
+q
+1 0 0 1 20 18 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (a random seed: "E05B8DC05EFC044E") Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 12 cm
+Q
+q
+1 0 0 1 20 0 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (its dynamic domain name $ORIGIN: dyn.informatimago.com.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 0 cm
+Q
+q
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 299.3803 cm
+Q
+q
+1 0 0 1 62.69291 179.3803 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 105 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 105 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The client sends a request:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 99 cm
+Q
+q
+1 0 0 1 23 27 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 0 2 Tm  T* ET
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 54 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (opening parenthesis: \() Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 48 cm
+Q
+q
+1 0 0 1 20 36 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (hashed secret: "2C404AABF4007F798116DB62F0BF6BB4") Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 30 cm
+Q
+q
+1 0 0 1 20 18 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (host name: "kuiper") Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 12 cm
+Q
+q
+1 0 0 1 20 0 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (closing parenthesis: \)) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 0 cm
+Q
+q
+Q
+Q
+q
+1 0 0 1 23 27 cm
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.061654 Tw (The hashed secret is the MD5 hash of the concatenation of the hostname, "/", the seed, "/" and a) Tj T* 0 Tw (common secret.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 173.3803 cm
+Q
+q
+1 0 0 1 62.69291 143.3803 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 15 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .001163 Tw (The server checks the hashed secret, and if it matches, updates the DNS records with the address of) Tj T* 0 Tw (the client and the host name. It sends an answer:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+Q
+q
+Q
+Q
+
+endstream
+endobj
+% 'R24': class PDFStream
+24 0 obj
+% page stream
+<< /Length 7290 >>
+stream
+1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 335.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 6 416.2 Tm  T* ET
+q
+1 0 0 1 23 354.2 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 0 2 Tm  T* ET
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 54 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (status code,) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 48 cm
+Q
+q
+1 0 0 1 20 36 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (address of the client,) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 30 cm
+Q
+q
+1 0 0 1 20 18 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (message) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 12 cm
+Q
+q
+1 0 0 1 20 0 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (optionally, continuation lines with output from the nsupdate process.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 0 cm
+Q
+q
+Q
+Q
+q
+1 0 0 1 23 354.2 cm
+Q
+q
+1 0 0 1 23 336.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The status code is:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 330.2 cm
+Q
+q
+1 0 0 1 23 240.2 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 0 2 Tm  T* ET
+q
+1 0 0 1 20 84 cm
+Q
+q
+1 0 0 1 20 84 cm
+Q
+q
+1 0 0 1 20 72 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (250 for successful update,) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 66 cm
+Q
+q
+1 0 0 1 20 54 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (251 for no change, the host has already this address,) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 48 cm
+Q
+q
+1 0 0 1 20 36 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (501 for an Invalid token.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 30 cm
+Q
+q
+1 0 0 1 20 18 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (530 for an failure to authenticate.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 12 cm
+Q
+q
+1 0 0 1 20 0 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (553 for an update error.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 20 0 cm
+Q
+q
+Q
+Q
+q
+1 0 0 1 23 240.2 cm
+Q
+q
+1 0 0 1 23 222.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Examples:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 216 re B*
+Q
+q
+BT 1 0 0 1 0 194 Tm 12 TL /F3 10 Tf 0 0 0 rg (250 "83.202.195.150" Update successful.) Tj T* (250-Outgoing update query:) Tj T* (250-;; -) Tj (>) Tj (>) Tj (HEADER) Tj (<) Tj (<) Tj (- opcode: UPDATE, status: NOERROR, id:      0) Tj T* (250-;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0) Tj T* (250-;; UPDATE SECTION:) Tj T* (250-kuiper.dyn.informatimago.com. 0     ANY     A) Tj T* (250-kuiper.dyn.informatimago.com. 10 IN A       83.202.195.150) Tj T* (250-) Tj T*  T* (251 "83.202.195.150" No change.) Tj T*  T* (501 Invalid token.) Tj T*  T* (530 Authentication invalid.) Tj T*  T* (553 "83.202.195.150" Update failed.) Tj T* (553-update failed: SERVFAIL) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 335.8236 cm
+Q
+q
+1 0 0 1 62.69291 302.8236 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Compilation) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 290.8236 cm
+Q
+q
+1 0 0 1 62.69291 290.8236 cm
+Q
+q
+1 0 0 1 62.69291 278.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (clisp is used to compile the programs. ) Tj 0 0 .501961 rg (http://clisp.cons.org/) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 272.8236 cm
+Q
+q
+1 0 0 1 62.69291 260.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (alternatively, ccl can be used to compile the programs. ) Tj 0 0 .501961 rg (http://ccl.clozure.com/) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 254.8236 cm
+Q
+q
+1 0 0 1 62.69291 148.342 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 91.48163 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 79.48163 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .911318 Tw (quicklisp is required to compile and donwload dependencies. If it's not already installed in the user) Tj T* 0 Tw (account compiling the program, then you may install it with:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+.682066 0 0 .682066 0 0 cm
+q
+1 0 0 1 6.6 9.67648 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 654 108 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 86 Tm /F3 10 Tf 12 TL (pushd ~) Tj T* (wget https://beta.quicklisp.org/quicklisp.lisp) Tj T* (sum=\( $\(sha256sum quicklisp.lisp\) \)) Tj T* (if [ ${sum[0]} != 4a7a5c2aebe0716417047854267397e24a44d0cce096127411e9ce9ccfeb2c17 ] ; then) Tj T* (   echo 'BAD QUICKLISP!') Tj T* (fi) Tj T* (yes|clisp -norc -x '\(load "quicklisp.lisp"\)' -x '\(quicklisp-quickstart:install\)' -x '\(ql:add-to-init-file\)') Tj T* (popd) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 142.342 cm
+Q
+q
+1 0 0 1 62.69291 76.86614 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 50.47585 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 50.47585 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (tune the configuration in ) Tj /F3 10 Tf (server.lisp) Tj /F1 10 Tf (:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 5.275853 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 442.6898 36 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL (\(defparameter *default-port*          8053\)) Tj T* (\(defparameter *default-origin*       "dyn.informatimago.com."\)) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+
+endstream
+endobj
+% 'R25': class PDFStream
+25 0 obj
+% page stream
+<< /Length 6524 >>
+stream
+1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 739.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 6 12.2 Tm  T* ET
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 442.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (\(defparameter *default-dns-server*   "localhost"\)) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 733.8236 cm
+Q
+q
+1 0 0 1 62.69291 664.6236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 54.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 54.2 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (and in ) Tj /F3 10 Tf (client.lisp) Tj /F1 10 Tf (:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 48 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 26 Tm /F3 10 Tf 12 TL (\(defparameter *default-port*         8053\)) Tj T* (\(defparameter *default-ddns-server*  "hubble.informatimago.com"\)) Tj T* (\(defparameter *default-secret-file*  #P"dnskeys/ddns.secret"\)) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 664.6236 cm
+Q
+q
+1 0 0 1 62.69291 658.6236 cm
+Q
+q
+1 0 0 1 62.69291 646.6236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 0 2 Tm  T* ET
+q
+1 0 0 1 20 0 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (the ports shall be the same in both files.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 646.6236 cm
+Q
+q
+1 0 0 1 62.69291 640.6236 cm
+Q
+q
+1 0 0 1 62.69291 640.6236 cm
+Q
+q
+1 0 0 1 62.69291 595.4236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (then you may compile the programs:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (make) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 595.4236 cm
+Q
+q
+1 0 0 1 62.69291 565.4236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .556654 Tw (Note: there's a bug with the latest clisp-2.49+ that prevents the client to run. Instead, we'll compile it with) Tj T* 0 Tw (ccl.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 547.4236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (When compiled with clisp, the client usage is:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 514.2236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (ddns-client -- $host) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 494.2236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (When compiled with ccl, the client usage is:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 461.0236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (ddns-client $host) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 428.0236 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Installation) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 380.0236 cm
+q
+BT 1 0 0 1 0 21 Tm 18 TL /F2 15 Tf 0 0 0 rg (Creation of keys, and configuration of bind to receive dyndns) Tj T* (updates) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 362.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (See:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 356.0236 cm
+Q
+q
+1 0 0 1 62.69291 356.0236 cm
+Q
+q
+1 0 0 1 62.69291 344.0236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (http://linux.yyz.us/dns/ddns-server.html and) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 338.0236 cm
+Q
+q
+1 0 0 1 62.69291 326.0236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (http://linux.yyz.us/nsupdate/) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 326.0236 cm
+Q
+q
+1 0 0 1 62.69291 296.0236 cm
+q
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (On the server) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 284.0236 cm
+Q
+q
+1 0 0 1 62.69291 284.0236 cm
+Q
+q
+1 0 0 1 62.69291 161.3293 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 107.6944 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 107.6944 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Create a ddns user account:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+.940425 0 0 .940425 0 0 cm
+q
+1 0 0 1 6.6 7.018107 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 474 108 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 86 Tm /F3 10 Tf 12 TL (groupadd --system ddns) Tj T* (useradd --system -d /home/ddns/ -m -c 'DDNS Server' -s /bin/bash -g ddns ddns) Tj T* (mkdir /home/ddns/dnskeys /home/ddns/etc) Tj T* (# install:) Tj T* (#    ddns.secret) Tj T* (#    Kdyn.informatimago.com.+157+24639.key) Tj T* (#    Kdyn.informatimago.com.+157+24639.private) Tj T* (# in /home/ddns/dnskeys) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 155.3293 cm
+Q
+q
+1 0 0 1 62.69291 110.1293 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 30.2 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The server is installed in ) Tj /F3 10 Tf (/home/ddns/bin/ ) Tj /F1 10 Tf (with:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (make install-server) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 104.1293 cm
+Q
+q
+1 0 0 1 62.69291 92.12926 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Edit ) Tj /F3 10 Tf (/etc/rc.local) Tj /F1 10 Tf (, adding:) Tj T* ET
+Q
+Q
+q
+Q
+Q
+
+endstream
+endobj
+% 'R26': class PDFStream
+26 0 obj
+% page stream
+<< /Length 5446 >>
+stream
+1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 703.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 6 48.2 Tm  T* ET
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 442.6898 60 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL (su -c 'screen -d -m -S ddns -t server -c /home/ddns/etc/screenrc \\) Tj T* (         bash -c  "export LC_CTYPE=en_US.UTF-8 ; while sleep 2 ; do \\) Tj T* (                   /home/ddns/bin/ddns-server ; done"' \\) Tj T* (    - ddns) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 697.8236 cm
+Q
+q
+1 0 0 1 62.69291 652.6236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Launch it immediately with:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (/etc/init.d/rc.local restart) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 652.6236 cm
+Q
+q
+1 0 0 1 62.69291 622.6236 cm
+q
+BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (On the clients) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 592.6236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.399988 Tw (Currently we run the client as root, but it could and should be run under a ddns user account like the) Tj T* 0 Tw (server.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 586.6236 cm
+Q
+q
+1 0 0 1 62.69291 586.6236 cm
+Q
+q
+1 0 0 1 62.69291 541.4236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 30.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 30.2 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The client is installed in ) Tj /F3 10 Tf (/usr/local/sbin/ ) Tj /F1 10 Tf (with:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (sudo make install-client) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 535.4236 cm
+Q
+q
+1 0 0 1 62.69291 454.2236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 66.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 66.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Install the keys:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 60 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 38 Tm /F3 10 Tf 12 TL (mkdir /root/dnskeys/) Tj T* (# install:) Tj T* (#    ddns.secret) Tj T* (# in /root/dnskeys/) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 448.2236 cm
+Q
+q
+1 0 0 1 62.69291 391.0236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 42.2 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 30.2 cm
+q
+BT 1 0 0 1 0 14 Tm .341412 Tw 12 TL /F3 10 Tf 0 0 0 rg (/usr/local/sbin/ddns-client ) Tj /F1 10 Tf (is run from root with cron, fcron, dcron, etc, a few times a hour.) Tj T* 0 Tw (With cron, ) Tj /F3 10 Tf (/etc/crontab ) Tj /F1 10 Tf (entry:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 445.6898 24 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (5 * * * *   root    /usr/local/sbin/ddns-client kuiper) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 391.0236 cm
+Q
+q
+1 0 0 1 62.69291 358.0236 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (License, Development, Contact) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 340.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This program DDNS \(ddns-client and ddns-server\), is distributed under the AGPL3 license.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 322.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Copyright 2012 - 2015 Pascal J. Bourguignon) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 304.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The sources are obtainable with git:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 258.8236 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 36 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL (git clone http://git.informatimago.com/public/domains) Tj T* (cd domains/ddns/) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 238.8236 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Send requests, bug reports, patches: ) Tj (mailto:pjb@informatimago.com.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 220.8236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Known Bugs:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 214.8236 cm
+Q
+q
+1 0 0 1 62.69291 214.8236 cm
+Q
+q
+1 0 0 1 62.69291 202.8236 cm
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 -3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (We use MD5 in the protocol, this is not safe anymore, SHA256 should be used instead.) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 202.8236 cm
+Q
+
+endstream
+endobj
+% 'R27': class PDFPageLabels
+27 0 obj
+% Document Root
+<< /Nums [ 0
+ 28 0 R
+ 1
+ 29 0 R
+ 2
+ 30 0 R
+ 3
+ 31 0 R ] >>
+endobj
+% 'R28': class PDFPageLabel
+28 0 obj
+% None
+<< /S /D
+ /St 1 >>
+endobj
+% 'R29': class PDFPageLabel
+29 0 obj
+% None
+<< /S /D
+ /St 2 >>
+endobj
+% 'R30': class PDFPageLabel
+30 0 obj
+% None
+<< /S /D
+ /St 3 >>
+endobj
+% 'R31': class PDFPageLabel
+31 0 obj
+% None
+<< /S /D
+ /St 4 >>
+endobj
+xref
+0 32
+0000000000 65535 f
+0000000113 00000 n
+0000000233 00000 n
+0000000398 00000 n
+0000000573 00000 n
+0000000732 00000 n
+0000001025 00000 n
+0000001265 00000 n
+0000001492 00000 n
+0000001799 00000 n
+0000002078 00000 n
+0000002359 00000 n
+0000002518 00000 n
+0000002766 00000 n
+0000002892 00000 n
+0000003108 00000 n
+0000003261 00000 n
+0000003447 00000 n
+0000003679 00000 n
+0000003911 00000 n
+0000004102 00000 n
+0000004277 00000 n
+0000004451 00000 n
+0000004583 00000 n
+0000011989 00000 n
+0000019378 00000 n
+0000026001 00000 n
+0000031550 00000 n
+0000031682 00000 n
+0000031759 00000 n
+0000031836 00000 n
+0000031913 00000 n
+trailer
+<< /ID
+ % ReportLab generated PDF document -- digest (http://www.reportlab.com)
+ [(\265\2328A\203\332\314\340\342\233s\033\232\006\227\347) (\265\2328A\203\332\314\340\342\233s\033\232\006\227\347)]
+
+ /Info 12 0 R
+ /Root 11 0 R
+ /Size 32 >>
+startxref
+31960
+%%EOF
ViewGit