1 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml" dir=
"ltr">
5 <meta http-equiv=
"Content-Type" content=
"text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen: What are they searching for - PowerDNS and ISC DHCP in LDAP
</title>
7 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"http://people.skolelinux.org/pere/blog/style.css" />
8 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"http://people.skolelinux.org/pere/blog/vim.css" />
15 <a href=
"http://people.skolelinux.org/pere/blog/">Petter Reinholdtsen
</a>
23 <div class=
"title">What are they searching for - PowerDNS and ISC DHCP in LDAP
</div>
24 <div class=
"date">17th July
2010</div>
25 <div class=
"body"><p>This is a
26 <a href=
"http://people.skolelinux.org/pere/blog/Time_for_new__LDAP_schemas_replacing_RFC_2307_.html">followup
</a>
28 <a href=
"http://people.skolelinux.org/pere/blog/Idea_for_a_change_to_LDAP_schemas_allowing_DNS_and_DHCP_info_to_be_combined_into_one_object.html">previous
30 <a href=
"http://people.skolelinux.org/pere/blog/Combining_PowerDNS_and_ISC_DHCP_LDAP_objects.html">merging
31 all
</a> the computer related LDAP objects in Debian Edu.
</p>
33 <p>As a step to try to see if it possible to merge the DNS and DHCP
34 LDAP objects, I have had a look at how the packages pdns-backend-ldap
35 and dhcp3-server-ldap in Debian use the LDAP server. The two
36 implementations are quite different in how they use LDAP.
</p>
38 To get this information, I started slapd with debugging enabled and
39 dumped the debug output to a file to get the LDAP searches performed
40 on a Debian Edu main-server. Here is a summary.
42 <p><strong>powerdns
</strong></p>
44 <a href=
"http://www.linuxnetworks.de/doc/index.php/PowerDNS_LDAP_Backend">Clues
45 on how to
</a> set up PowerDNS to use a LDAP backend is available on
48 <p>PowerDNS have two modes of operation using LDAP as its backend.
49 One "strict" mode where the forward and reverse DNS lookups are done
50 using the same LDAP objects, and a "tree" mode where the forward and
51 reverse entries are in two different subtrees in LDAP with a structure
52 based on the DNS names, as in tjener.intern and
53 2.2.0.10.in-addr.arpa.
</p>
55 <p>In tree mode, the server is set up to use a LDAP subtree as its
56 base, and uses a "base" scoped search for the DNS name by adding
57 "dc=tjener,dc=intern," to the base with a filter for
58 "(associateddomain=tjener.intern)" for the forward entry and
59 "dc=
2,dc=
2,dc=
0,dc=
10,dc=in-addr,dc=arpa," with a filter for
60 "(associateddomain=
2.2.0.10.in-addr.arpa)" for the reverse entry. For
61 forward entries, it is looking for attributes named dnsttl, arecord,
62 nsrecord, cnamerecord, soarecord, ptrrecord, hinforecord, mxrecord,
63 txtrecord, rprecord, afsdbrecord, keyrecord, aaaarecord, locrecord,
64 srvrecord, naptrrecord, kxrecord, certrecord, dsrecord, sshfprecord,
65 ipseckeyrecord, rrsigrecord, nsecrecord, dnskeyrecord, dhcidrecord,
66 spfrecord and modifytimestamp. For reverse entries it is looking for
67 the attributes dnsttl, arecord, nsrecord, cnamerecord, soarecord,
68 ptrrecord, hinforecord, mxrecord, txtrecord, rprecord, aaaarecord,
69 locrecord, srvrecord, naptrrecord and modifytimestamp. The equivalent
70 ldapsearch commands could look like this:
</p>
74 -b dc=tjener,dc=intern,ou=hosts,dc=skole,dc=skolelinux,dc=no \
75 -s base -x '(associateddomain=tjener.intern)' dNSTTL aRecord nSRecord \
76 cNAMERecord sOARecord pTRRecord hInfoRecord mXRecord tXTRecord \
77 rPRecord aFSDBRecord KeyRecord aAAARecord lOCRecord sRVRecord \
78 nAPTRRecord kXRecord certRecord dSRecord sSHFPRecord iPSecKeyRecord \
79 rRSIGRecord nSECRecord dNSKeyRecord dHCIDRecord sPFRecord modifyTimestamp
82 -b dc=
2,dc=
2,dc=
0,dc=
10,dc=in-addr,dc=arpa,ou=hosts,dc=skole,dc=skolelinux,dc=no \
83 -s base -x '(associateddomain=
2.2.0.10.in-addr.arpa)'
84 dnsttl, arecord, nsrecord, cnamerecord soarecord ptrrecord \
85 hinforecord mxrecord txtrecord rprecord aaaarecord locrecord \
86 srvrecord naptrrecord modifytimestamp
89 <p>In Debian Edu/Lenny, the PowerDNS tree mode is used with
90 ou=hosts,dc=skole,dc=skolelinux,dc=no as the base, and these are two
91 example LDAP objects used there. In addition to these objects, the
92 parent objects all th way up to ou=hosts,dc=skole,dc=skolelinux,dc=no
96 dn: dc=tjener,dc=intern,ou=hosts,dc=skole,dc=skolelinux,dc=no
98 objectclass: dnsdomain
99 objectclass: domainrelatedobject
102 associateddomain: tjener.intern
104 dn: dc=
2,dc=
2,dc=
0,dc=
10,dc=in-addr,dc=arpa,ou=hosts,dc=skole,dc=skolelinux,dc=no
106 objectclass: dnsdomain2
107 objectclass: domainrelatedobject
109 ptrrecord: tjener.intern
110 associateddomain:
2.2.0.10.in-addr.arpa
113 <p>In strict mode, the server behaves differently. When looking for
114 forward DNS entries, it is doing a "subtree" scoped search with the
115 same base as in the tree mode for a object with filter
116 "(associateddomain=tjener.intern)" and requests the attributes dnsttl,
117 arecord, nsrecord, cnamerecord, soarecord, ptrrecord, hinforecord,
118 mxrecord, txtrecord, rprecord, aaaarecord, locrecord, srvrecord,
119 naptrrecord and modifytimestamp. For reverse entires it also do a
120 subtree scoped search but this time the filter is "(arecord=
10.0.2.2)"
121 and the requested attributes are associateddomain, dnsttl and
122 modifytimestamp. In short, in strict mode the objects with ptrrecord
123 go away, and the arecord attribute in the forward object is used
126 <p>The forward and reverse searches can be simulated using ldapsearch
130 ldapsearch -h ldap -b ou=hosts,dc=skole,dc=skolelinux,dc=no -s sub -x \
131 '(associateddomain=tjener.intern)' dNSTTL aRecord nSRecord \
132 cNAMERecord sOARecord pTRRecord hInfoRecord mXRecord tXTRecord \
133 rPRecord aFSDBRecord KeyRecord aAAARecord lOCRecord sRVRecord \
134 nAPTRRecord kXRecord certRecord dSRecord sSHFPRecord iPSecKeyRecord \
135 rRSIGRecord nSECRecord dNSKeyRecord dHCIDRecord sPFRecord modifyTimestamp
137 ldapsearch -h ldap -b ou=hosts,dc=skole,dc=skolelinux,dc=no -s sub -x \
138 '(arecord=
10.0.2.2)' associateddomain dnsttl modifytimestamp
141 <p>In addition to the forward and reverse searches , there is also a
142 search for SOA records, which behave similar to the forward and
145 <p>A thing to note with the PowerDNS behaviour is that it do not
146 specify any objectclass names, and instead look for the attributes it
147 need to generate a DNS reply. This make it able to work with any
148 objectclass that provide the needed attributes.
</p>
150 <p>The attributes are normally provided in the cosine (RFC
1274) and
151 dnsdomain2 schemas. The latter is used for reverse entries like
152 ptrrecord and recent DNS additions like aaaarecord and srvrecord.
</p>
154 <p>In Debian Edu, we have created DNS objects using the object classes
155 dcobject (for dc), dnsdomain or dnsdomain2 (structural, for the DNS
156 attributes) and domainrelatedobject (for associatedDomain). The use
157 of structural object classes make it impossible to combine these
158 classes with the object classes used by DHCP.
</p>
160 <p>There are other schemas that could be used too, for example the
161 dnszone structural object class used by Gosa and bind-sdb for the DNS
162 attributes combined with the domainrelatedobject object class, but in
163 this case some unused attributes would have to be included as well
164 (zonename and relativedomainname).
</p>
166 <p>My proposal for Debian Edu would be to switch PowerDNS to strict
167 mode and not use any of the existing objectclasses (dnsdomain,
168 dnsdomain2 and dnszone) when one want to combine the DNS information
169 with DHCP information, and instead create a auxiliary object class
170 defined something like this (using the attributes defined for
171 dnsdomain and dnsdomain2 or dnszone):
</p>
174 objectclass ( some-oid NAME 'dnsDomainAux'
177 MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord $
178 DNSTTL $ DNSClass $ PTRRecord $ HINFORecord $ MINFORecord $
179 TXTRecord $ SIGRecord $ KEYRecord $ AAAARecord $ LOCRecord $
180 NXTRecord $ SRVRecord $ NAPTRRecord $ KXRecord $ CERTRecord $
181 A6Record $ DNAMERecord
185 <p>This will allow any object to become a DNS entry when combined with
186 the domainrelatedobject object class, and allow any entity to include
187 all the attributes PowerDNS wants. I've sent an email to the PowerDNS
188 developers asking for their view on this schema and if they are
189 interested in providing such schema with PowerDNS, and I hope my
190 message will be accepted into their mailing list soon.
</p>
192 <p><strong>ISC dhcp
</strong></p>
194 <p>The DHCP server searches for specific objectclass and requests all
195 the object attributes, and then uses the attributes it want. This
196 make it harder to figure out exactly what attributes are used, but
197 thanks to the working example in Debian Edu I can at least get an idea
198 what is needed without having to read the source code.
</p>
200 <p>In the DHCP server configuration, the LDAP base to use and the
201 search filter to use to locate the correct dhcpServer entity is
202 stored. These are the relevant entries from
203 /etc/dhcp3/dhcpd.conf:
</p>
206 ldap-base-dn "dc=skole,dc=skolelinux,dc=no";
207 ldap-dhcp-server-cn "dhcp";
210 <p>The DHCP server uses this information to nest all the DHCP
211 configuration it need. The cn "dhcp" is located using the given LDAP
212 base and the filter "(&(objectClass=dhcpServer)(cn=dhcp))". The
213 search result is this entry:
</p>
216 dn: cn=dhcp,dc=skole,dc=skolelinux,dc=no
219 objectClass: dhcpServer
220 dhcpServiceDN: cn=DHCP Config,dc=skole,dc=skolelinux,dc=no
223 <p>The content of the dhcpServiceDN attribute is next used to locate the
224 subtree with DHCP configuration. The DHCP configuration subtree base
225 is located using a base scope search with base "cn=DHCP
226 Config,dc=skole,dc=skolelinux,dc=no" and filter
227 "(&(objectClass=dhcpService)(|(dhcpPrimaryDN=cn=dhcp,dc=skole,dc=skolelinux,dc=no)(dhcpSecondaryDN=cn=dhcp,dc=skole,dc=skolelinux,dc=no)))".
228 The search result is this entry:
</p>
231 dn: cn=DHCP Config,dc=skole,dc=skolelinux,dc=no
234 objectClass: dhcpService
235 objectClass: dhcpOptions
236 dhcpPrimaryDN: cn=dhcp, dc=skole,dc=skolelinux,dc=no
237 dhcpStatements: ddns-update-style none
238 dhcpStatements: authoritative
239 dhcpOption: smtp-server code
69 = array of ip-address
240 dhcpOption: www-server code
72 = array of ip-address
241 dhcpOption: wpad-url code
252 = text
244 <p>Next, the entire subtree is processed, one level at the time. When
245 all the DHCP configuration is loaded, it is ready to receive requests.
246 The subtree in Debian Edu contain objects with object classes
247 top/dhcpService/dhcpOptions, top/dhcpSharedNetwork/dhcpOptions,
248 top/dhcpSubnet, top/dhcpGroup and top/dhcpHost. These provide options
249 and information about netmasks, dynamic range etc. Leaving out the
250 details here because it is not relevant for the focus of my
251 investigation, which is to see if it is possible to merge dns and dhcp
252 related computer objects.
</p>
254 <p>When a DHCP request come in, LDAP is searched for the MAC address
255 of the client (
00:
00:
00:
00:
00:
00 in this example), using a subtree
256 scoped search with "cn=DHCP Config,dc=skole,dc=skolelinux,dc=no" as
257 the base and "(&(objectClass=dhcpHost)(dhcpHWAddress=ethernet
258 00:
00:
00:
00:
00:
00))" as the filter. This is what a host object look
262 dn: cn=hostname,cn=group1,cn=THINCLIENTS,cn=DHCP Config,dc=skole,dc=skolelinux,dc=no
265 objectClass: dhcpHost
266 dhcpHWAddress: ethernet
00:
00:
00:
00:
00:
00
267 dhcpStatements: fixed-address hostname
270 <p>There is less flexiblity in the way LDAP searches are done here.
271 The object classes need to have fixed names, and the configuration
272 need to be stored in a fairly specific LDAP structure. On the
273 positive side, the invidiual dhcpHost entires can be anywhere without
274 the DN pointed to by the dhcpServer entries. The latter should make
275 it possible to group all host entries in a subtree next to the
276 configuration entries, and this subtree can also be shared with the
277 DNS server if the schema proposed above is combined with the dhcpHost
278 structural object class.
280 <p><strong>Conclusion
</strong></p>
282 <p>The PowerDNS implementation seem to be very flexible when it come
283 to which LDAP schemas to use. While its "tree" mode is rigid when it
284 come to the the LDAP structure, the "strict" mode is very flexible,
285 allowing DNS objects to be stored anywhere under the base cn specified
286 in the configuration.
</p>
288 <p>The DHCP implementation on the other hand is very inflexible, both
289 regarding which LDAP schemas to use and which LDAP structure to use.
290 I guess one could implement ones own schema, as long as the
291 objectclasses and attributes have the names used, but this do not
292 really help when the DHCP subtree need to have a fairly fixed
295 <p>Based on the observed behaviour, I suspect a LDAP structure like
296 this might work for Debian Edu:
</p>
300 cn=machine-info (dhcpService) - dhcpServiceDN points here
302 cn=dhcp-internal (dhcpSharedNetwork/dhcpOptions)
303 cn=
10.0.2.0 (dhcpSubnet)
304 cn=group1 (dhcpGroup/dhcpOptions)
305 cn=dhcp-thinclients (dhcpSharedNetwork/dhcpOptions)
306 cn=
192.168.0.0 (dhcpSubnet)
307 cn=group1 (dhcpGroup/dhcpOptions)
308 ou=machines - PowerDNS base points here
309 cn=hostname (dhcpHost/domainrelatedobject/dnsDomainAux)
312 <P>This is not tested yet. If the DHCP server require the dhcpHost
313 entries to be in the dhcpGroup subtrees, the entries can be stored
314 there instead of a common machines subtree, and the PowerDNS base
315 would have to be moved one level up to the machine-info subtree.
</p>
317 <p>The combined object under the machines subtree would look something
321 dn: dc=hostname,ou=machines,cn=machine-info,dc=skole,dc=skolelinux,dc=no
324 objectClass: dhcpHost
325 objectclass: domainrelatedobject
326 objectclass: dnsDomainAux
327 associateddomain: hostname.intern
329 dhcpHWAddress: ethernet
00:
00:
00:
00:
00:
00
330 dhcpStatements: fixed-address hostname.intern
333 </p>One could even add the LTSP configuration associated with a given
334 machine, as long as the required attributes are available in a
335 auxiliary object class.
</p>
338 <div class=
"tags">Tags:
<a href=
"http://people.skolelinux.org/pere/blog/tags/debian">debian
</a>,
<a href=
"http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu
</a>,
<a href=
"http://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"http://people.skolelinux.org/pere/blog/tags/ldap">ldap
</a>,
<a href=
"http://people.skolelinux.org/pere/blog/tags/nuug">nuug
</a>.
</div>
356 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/01/">January (
11)
</a></li>
358 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/02/">February (
9)
</a></li>
360 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/03/">March (
9)
</a></li>
362 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/04/">April (
6)
</a></li>
364 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/05/">May (
9)
</a></li>
366 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/06/">June (
10)
</a></li>
368 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/07/">July (
7)
</a></li>
370 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/08/">August (
3)
</a></li>
372 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/09/">September (
5)
</a></li>
374 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/10/">October (
6)
</a></li>
381 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/01/">January (
7)
</a></li>
383 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/02/">February (
10)
</a></li>
385 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/03/">March (
17)
</a></li>
387 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/04/">April (
12)
</a></li>
389 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/05/">May (
12)
</a></li>
391 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/06/">June (
20)
</a></li>
393 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/07/">July (
17)
</a></li>
395 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/08/">August (
6)
</a></li>
397 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/09/">September (
9)
</a></li>
399 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/10/">October (
17)
</a></li>
401 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/11/">November (
10)
</a></li>
403 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/12/">December (
7)
</a></li>
410 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/01/">January (
16)
</a></li>
412 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/02/">February (
6)
</a></li>
414 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/03/">March (
6)
</a></li>
416 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/04/">April (
7)
</a></li>
418 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/05/">May (
3)
</a></li>
420 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/06/">June (
2)
</a></li>
422 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/07/">July (
7)
</a></li>
424 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/08/">August (
6)
</a></li>
426 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/09/">September (
4)
</a></li>
428 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/10/">October (
2)
</a></li>
430 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/11/">November (
3)
</a></li>
432 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/12/">December (
1)
</a></li>
439 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/01/">January (
2)
</a></li>
441 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/02/">February (
1)
</a></li>
443 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/03/">March (
3)
</a></li>
445 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/04/">April (
3)
</a></li>
447 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/05/">May (
9)
</a></li>
449 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/06/">June (
14)
</a></li>
451 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/07/">July (
12)
</a></li>
453 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/08/">August (
13)
</a></li>
455 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/09/">September (
7)
</a></li>
457 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/10/">October (
9)
</a></li>
459 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/11/">November (
13)
</a></li>
461 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/12/">December (
12)
</a></li>
468 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/01/">January (
8)
</a></li>
470 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/02/">February (
8)
</a></li>
472 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/03/">March (
12)
</a></li>
474 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/04/">April (
10)
</a></li>
476 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/05/">May (
9)
</a></li>
478 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/06/">June (
3)
</a></li>
480 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/07/">July (
4)
</a></li>
482 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/08/">August (
3)
</a></li>
484 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/09/">September (
1)
</a></li>
486 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/10/">October (
2)
</a></li>
488 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/11/">November (
3)
</a></li>
490 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/12/">December (
3)
</a></li>
497 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/11/">November (
5)
</a></li>
499 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/12/">December (
7)
</a></li>
510 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (
13)
</a></li>
512 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/amiga">amiga (
1)
</a></li>
514 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/aros">aros (
1)
</a></li>
516 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bankid">bankid (
4)
</a></li>
518 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (
7)
</a></li>
520 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (
12)
</a></li>
522 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bsa">bsa (
2)
</a></li>
524 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian">debian (
87)
</a></li>
526 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (
142)
</a></li>
528 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/digistan">digistan (
10)
</a></li>
530 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/docbook">docbook (
10)
</a></li>
532 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (
4)
</a></li>
534 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/english">english (
222)
</a></li>
536 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (
21)
</a></li>
538 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (
12)
</a></li>
540 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (
12)
</a></li>
542 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (
4)
</a></li>
544 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (
11)
</a></li>
546 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/intervju">intervju (
37)
</a></li>
548 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (
7)
</a></li>
550 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/kart">kart (
18)
</a></li>
552 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ldap">ldap (
8)
</a></li>
554 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/lenker">lenker (
6)
</a></li>
556 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (
1)
</a></li>
558 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (
2)
</a></li>
560 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (
25)
</a></li>
562 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/norsk">norsk (
236)
</a></li>
564 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/nuug">nuug (
156)
</a></li>
566 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (
8)
</a></li>
568 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/open311">open311 (
2)
</a></li>
570 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (
45)
</a></li>
572 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/personvern">personvern (
67)
</a></li>
574 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/raid">raid (
1)
</a></li>
576 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/reprap">reprap (
11)
</a></li>
578 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rfid">rfid (
2)
</a></li>
580 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/robot">robot (
8)
</a></li>
582 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rss">rss (
1)
</a></li>
584 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ruter">ruter (
4)
</a></li>
586 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (
2)
</a></li>
588 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (
32)
</a></li>
590 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (
4)
</a></li>
592 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (
4)
</a></li>
594 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/standard">standard (
43)
</a></li>
596 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (
3)
</a></li>
598 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (
9)
</a></li>
600 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (
20)
</a></li>
602 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (
1)
</a></li>
604 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/valg">valg (
8)
</a></li>
606 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/video">video (
39)
</a></li>
608 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (
4)
</a></li>
610 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/web">web (
28)
</a></li>
616 <p style=
"text-align: right">
617 Created by
<a href=
"http://steve.org.uk/Software/chronicle">Chronicle v4.6
</a>