Difference between revisions of "Basale infrastructuur"
(→creëren directory repository) |
(→Volumes) |
||
(54 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
= Basale infrastructuur = |
= Basale infrastructuur = |
||
+ | == ADSL verbinding == |
||
+ | * http://blog.keesmeijs.nl/archives/723 |
||
+ | == Virtualisatie: KVM of Xen? == |
||
+ | * http://blog.codemonkey.ws/2008/05/truth-about-kvm-and-xen.html |
||
+ | |||
+ | = Debian = |
||
+ | * http://www.debian.org/News/2009/20090729 |
||
+ | == Volumes == |
||
+ | |||
+ | lsblk -l |
||
== bind == |
== bind == |
||
+ | De nameserver structuur is in ontwikkeling. Op locatie draait een bind9 name-server als slave van de Webhuis superslaves. Webhuis heeft een master nameserver en twee superslaves: |
||
+ | * ns1.Webhuis.nl |
||
+ | * ns2.Webhuis.nl |
||
+ | * ns3.Webhuis.nl |
||
+ | Zie voor deze nameservers: [http://wiki.webhuis.nl/mediawiki/index.php/Basale_infrastructuur#powerdns powerdns] |
||
+ | |||
+ | Webhuis ondersteunt nu alleen nog static domain name serving met reverse lookup. Webhuis wil twee features realiseren: |
||
+ | * Geautomatiseerde reverse lookup, automatisch aanmaken van PTR records als er een A record ontstaat en ook verwijderen als het A record verdwijnt. |
||
+ | * Geautomatiseerd gecollecteerde dynamische domain name serving |
||
+ | De oplossing ligt in een complexe relatie van masters en slaves met een gecombineerde implementatie van bind9 en [http://wiki.webhuis.nl/mediawiki/index.php/Basale_infrastructuur#powerdns powerdns]. |
||
+ | == cron == |
||
+ | Sommige jobs sterven, zoals de mysql-pipe voor syslog-ng, zodat het noodzakelijk is om telkens vast te stellen of de job nog loopt en weer te starten als de job verdwenen is. |
||
+ | <pre> |
||
+ | # m h dom mon dow command |
||
+ | # Minute Hour Day of Month Month Day of Week Command |
||
+ | # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) |
||
+ | * * * * * /etc/syslog-ng/check-mysql-pipe.sh # cron draait dit script elke minuut. |
||
+ | */5 * * * * /usr/local/bin/some-script.sh # cron draait dit script elke vijf minuten. |
||
+ | # Soms is meer nodig in cron, zoals het afvuren van een job in een random window om overbelasting door massale actie op één server te voorkomen |
||
+ | # |
||
+ | SHELL=/bin/bash |
||
+ | # Deze regel zorgt ervoor dat het upload script van een groot logbestand van vele servers naar een centraal punt soepel verloopt. |
||
+ | # RANDOM is een shell variable met een waarde tussen 0 en 32768, die na elk gebruik een nieuwe waarde krijgt. |
||
+ | # Vermenivuldigen met 300 en delen door 32768 levert een waarde tussen de 0 en 300 seconden op, vijf minuten. |
||
+ | 12 0 * * * sleep $((RANDOM*300/32768)); /usr/local/bin/copy-log.sh |
||
− | == cfengine == |
||
+ | </pre> |
||
− | == dhcp == |
||
− | apt-get install dhcp3-server |
||
== dhcpd.conf == |
== dhcpd.conf == |
||
+ | In bewerking.<br/> |
||
− | ddns-update-style none; |
||
+ | Melding in de log: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file |
||
+ | De debian dhcp3 server heeft poblemen met code 95 ldap-server. Deze parameter is voor de Mac omgeving om zo de server mee te geven. |
||
+ | <pre> |
||
+ | ddns-update-style none; |
||
− | + | option domain-name "Webhuis.nl"; |
|
− | + | option domain-name-servers 10.x.y.z 10.x1.x2.z2; |
|
− | + | default-lease-time 600; |
|
− | + | max-lease-time 7200; |
|
− | + | lease-file-name "/var/cache/dhcpd/dhcp.leases"; |
|
− | + | authoritative; |
|
− | + | log-facility local7; |
|
− | + | subnet 10.x.y.0 netmask 255.255.255.224 { |
|
range 10.x.y.10 10.x.y.30; |
range 10.x.y.10 10.x.y.30; |
||
option routers 10.x.y.1; |
option routers 10.x.y.1; |
||
+ | host t105-01.webhuis.nl { |
||
+ | hardware ethernet 00:1e:c9:51:4a:5b; |
||
+ | fixed-address 10.37.41.21; |
||
+ | } |
||
+ | host voip-lek { |
||
+ | hardware ethernet 00:21:04:bd:1e:cf; |
||
+ | ignore booting; |
||
+ | } |
||
+ | } |
||
+ | </pre> |
||
Let op: |
Let op: |
||
− | Maak bij configuratie het bestand "/var/cache/dhcpd/dhcp.leases" aan (de server |
+ | Maak bij configuratie het bestand "/var/cache/dhcpd/dhcp.leases" aan (de sart van de server breekt af als het bestand ontbreekt). |
===== dhcp3.server ===== |
===== dhcp3.server ===== |
||
− | Specificeer in geval van een machine met meerdere netwerkkaarten de netwerkkaarten waarop de server luistert. |
+ | Specificeer in /etc/default/dhcp3-server in geval van een machine met meerdere netwerkkaarten de netwerkkaarten waarop de server luistert. |
INTERFACES="eth1" |
INTERFACES="eth1" |
||
+ | == firebird == |
||
+ | * http://www.debianhelp.co.uk/firebirdweb.htm |
||
+ | * http://www.firebirdsql.org/rlsnotesh/install210.html |
||
+ | * http://www.debianhelp.co.uk/firebird.htm |
||
+ | * http://www.firebirdsql.org/manual/ubusetup.html |
||
+ | * http://www.osfinancials.org/index.php?option=com_frontpage&Itemid=1 |
||
+ | * http://www.osfinancials.org/mediawiki/index.php/Linux_Server_Dutch_Installatie_handleiding |
||
+ | * http://www.firebirdsql.org/ |
||
+ | * http://firebird.sourceforge.net/manual/ibfbcoex-running-ib-fb-together.html |
||
+ | * http://linux-sxs.org/internet_serving/firebird102.html |
||
+ | * http://www.flamerobin.org/dokuwiki/doku.php?id=wiki:roadmap |
||
+ | * http://www.destructor.de/firebird/isql.htm |
||
+ | * http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_60_sqlref#RSf43135 |
||
+ | * http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_sqlroles |
||
+ | * http://www.ibexpert.net/ibe/index.php?n=Doc.GrantManager |
||
+ | * http://www.ibexpert.net/ibe/index.php?n=Doc.DCL-DataControlLanguage#Grant |
||
+ | == gpg openpgp == |
||
+ | Een gpg key pair is bruikbaar voor: |
||
+ | * Signing van berichten, met de private key |
||
+ | De ontvanger van het bericht weet dat het bericht van de eigenaar van het key pair afkomstig is. |
||
+ | * Encryptie van berichten door een verzender met de public key |
||
+ | De public key is publiek beschikbaar. Iedereen heeft zo de mogelijkheid om aan de eigenaar van het key pair een encrypted bericht te zenden. Alleen de eigenaar van het key pair heeft de mogelijkheid om het bericht te decrypten.<br/> |
||
+ | Het genereren gaat zo: |
||
+ | <pre> |
||
+ | gpg: Invalid option "--export-keys" |
||
+ | martin@host:~$ gpg --gen-key |
||
+ | gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. |
||
+ | This is free software: you are free to change and redistribute it. |
||
+ | There is NO WARRANTY, to the extent permitted by law. |
||
+ | |||
+ | Please select what kind of key you want: |
||
+ | (1) RSA and RSA (default) |
||
+ | (2) DSA and Elgamal |
||
+ | (3) DSA (sign only) |
||
+ | (4) RSA (sign only) |
||
+ | Your selection? |
||
+ | RSA keys may be between 1024 and 4096 bits long. |
||
+ | What keysize do you want? (2048) 4096 |
||
+ | Requested keysize is 4096 bits |
||
+ | Please specify how long the key should be valid. |
||
+ | 0 = key does not expire |
||
+ | <n> = key expires in n days |
||
+ | <n>w = key expires in n weeks |
||
+ | <n>m = key expires in n months |
||
+ | <n>y = key expires in n years |
||
+ | Key is valid for? (0) |
||
+ | Key does not expire at all |
||
+ | Is this correct? (y/N) y |
||
+ | You need a user ID to identify your key; the software constructs the user ID |
||
+ | from the Real Name, Comment and Email Address in this form: |
||
+ | "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" |
||
+ | |||
+ | Real name: Martin Simons |
||
+ | Email address: martin@webhuis.nl |
||
+ | Comment: Webhuis Uw Internet Liaison |
||
+ | You selected this USER-ID: |
||
+ | "Martin Simons (Webhuis Uw Internet Liaison) <martin@webhuis.nl>" |
||
+ | |||
+ | Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o |
||
+ | You need a Passphrase to protect your secret key. |
||
+ | |||
+ | ......................+++++ |
||
+ | gpg: key A135178F marked as ultimately trusted |
||
+ | public and secret key created and signed. |
||
+ | |||
+ | gpg: checking the trustdb |
||
+ | gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model |
||
+ | gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u |
||
+ | gpg: next trustdb check due at 2017-04-06 |
||
+ | pub 4096R/A135178F 2013-09-16 |
||
+ | Key fingerprint = 02BA 2D3A 82C1 CB47 05F9 23BD 0310 B54E A135 178F |
||
+ | uid Martin Simons (Webhuis Uw Internet Liaison) <martin@webhuis.nl> |
||
+ | sub 4096R/8B09F269 2013-09-16 |
||
+ | martin@host:~$ gpg --send-keys --keyserver keys.gnupg.net 8B09F269 |
||
+ | gpg: sending key A135178F to hkp server keys.gnupg.net |
||
+ | martin@host:~$ |
||
+ | </pre> |
||
+ | === links === |
||
+ | * https://wiki.debian.org/subkeys |
||
+ | * http://en.wikipedia.org/wiki/Public_key_infrastructure |
||
+ | * http://en.wikipedia.org/wiki/Public-key_cryptography |
||
+ | |||
+ | == iptables == |
||
+ | * http://www.dd-wrt.com/wiki/index.php/Iptables_command |
||
+ | * http://www.openpages.info/iptables/ |
||
+ | BLokkeren msn is op poort 1863, de poort wijzigt van tijd tot tijd. :-( |
||
=== Gewone router forwarding === |
=== Gewone router forwarding === |
||
Configureer forwarding als volgt: |
Configureer forwarding als volgt: |
||
+ | <pre> |
||
− | #!/bin/bash |
||
+ | #!/bin/bash |
||
− | # |
||
+ | # |
||
− | ip_domU_win="10.x.y.13" |
||
+ | ip_domU_win="10.x.y.13" |
||
− | # |
||
+ | # |
||
− | echo 1 > /proc/sys/net/ipv4/ip_forward |
||
+ | echo 1 > /proc/sys/net/ipv4/ip_forward |
||
− | # |
||
+ | # |
||
− | # Let op: |
||
+ | # Let op: |
||
− | # De flush '-F' regels verwijderen als het een vpn-router is |
||
+ | # De flush '-F' regels verwijderen als het een vpn-router is |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -F |
||
− | + | /sbin/iptables -F |
|
− | + | /sbin/iptables -t nat -F |
|
− | + | /sbin/iptables -t mangle -F |
|
− | + | /sbin/iptables -F INPUT |
|
− | + | /sbin/iptables -F OUTPUT |
|
+ | /sbin/iptables -F FORWARD |
||
− | # |
||
+ | # |
||
− | # Faciliteer RDP voor de Windows machine |
||
+ | # Faciliteer RDP voor de Windows machine |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp -s 0.0.0.0 -d 10.x.y.13 --dport 3389 -j ACCEPT |
||
− | + | /sbin/iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp -s 0.0.0.0 -d 10.x.y.13 --dport 3389 -j ACCEPT |
|
− | + | /sbin/iptables -A FORWARD -d 10.x.y.13 -p tcp --dport 3389 -j ACCEPT |
|
+ | /sbin/iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 3389 -j DNAT --to 10.x.y.13 |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.x.y.13 -p tcp --sport 3389 --dport 3389 -j ACCEPT |
||
+ | /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.x.y.13 -p tcp --sport 3389 --dport 3389 -j ACCEPT |
||
− | # |
||
+ | # |
||
− | # Blokkeer Internet voor de Windows machine |
||
+ | # Blokkeer Internet voor de Windows machine |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -A FORWARD -i eth0 -o eth1 -s ! 10.0.0.0/8 -d $ip_domU_win -j DROP |
||
− | + | /sbin/iptables -A FORWARD -i eth0 -o eth1 -s ! 10.0.0.0/8 -d $ip_domU_win -j DROP |
|
− | + | /sbin/iptables -A INPUT -i eth0 -s ! 10.0.0.0/8 -d $ip_domU_win -j DROP |
|
+ | /sbin/iptables -A OUTPUT -o eth0 -s $ip_domU_win -d ! 10.0.0.0/8 -j DROP |
||
− | # |
||
+ | # |
||
− | # Zorg voor forwarding van de machines van het locale netwerk |
||
+ | # Zorg voor forwarding van de machines van het locale netwerk |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -A INPUT -i eth0 -d 10.29.20.0/26 -j ACCEPT |
||
− | + | /sbin/iptables -A INPUT -i eth0 -d 10.29.20.0/26 -j ACCEPT |
|
− | + | /sbin/iptables -A OUTPUT -o eth0 -s 10.29.20.0/26 -j ACCEPT |
|
− | + | /sbin/iptables -A FORWARD -i eth1 -s 10.29.20.0/26 -o eth0 -j ACCEPT |
|
+ | /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.29.20.0/26 -j MASQUERADE |
||
− | # |
||
+ | # |
||
− | /sbin/iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -o eth1 -d 10.29.20.0/26 -j ACCEPT |
||
− | + | /sbin/iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -o eth1 -d 10.29.20.0/26 -j ACCEPT |
|
+ | /sbin/iptables -t nat -A PREROUTING -d 10.29.20.0/26 -j ACCEPT |
||
+ | </pre> |
||
In deze opzet is de Windows machine van buitenaf te benaderen, maar de Windows machine zelf is geblokkeerd voor Internet verkeer. |
In deze opzet is de Windows machine van buitenaf te benaderen, maar de Windows machine zelf is geblokkeerd voor Internet verkeer. |
||
+ | === Blokkeren ongecontroleerd smtp verkeer === |
||
+ | Het verdient in een omgeving met Windows clients aanbeveling om het risico van ongecontroleerd mailverkeer over de default gateway, dat is naar alle waarschijnlijkheid spam, te loggen en te blokkeren op de firewall. Daartoe staan onderstaande regels in /usr/local/bin/local-rules.sh: |
||
+ | <pre> |
||
+ | /sbin/iptables -F SMTPLOG |
||
+ | /sbin/iptables -N SMTPLOG |
||
+ | /sbin/iptables -A FORWARD -p tcp --dport 25 -j LOG --log-prefix "dropped smtp packets : " --log-level warning |
||
+ | /sbin/iptables -A SMTPLOG -p tcp --dport 25 -j LOG --log-prefix "dropped smtp packets : " --log-level warning |
||
+ | /sbin/iptables -A FORWARD -p tcp --dport 25 -j DROP |
||
+ | </pre> |
||
+ | |||
+ | == mysql == |
||
+ | De installatie van de mysql server is rechtstreeks en standaard. |
||
+ | # apt-get update && apt-get install mysql-server-5.0 |
||
+ | Zet in ieder geval een wachtwoord voor de gebruiker root. |
||
+ | === my.cnf === |
||
+ | Het hangt verder af van het gebruik of er in de confuguratie nog wijzigingen noodzakelijk zijn. Voor grotere databases is het noodzakelijk om het max_allowed_packet hoger te zetten voor zowel mysqld als mysqldump. Een te lage waarde resulteert in een onvolledige dump of een fout in de database. |
||
+ | <pre> |
||
+ | [mysqld] |
||
+ | # max_allowed_packet = 16M Oude waarde dump gaf een error |
||
+ | max_allowed_packet = 512M |
||
+ | . |
||
+ | . |
||
+ | [mysqldump] |
||
+ | # max_allowed_packet = 16M Oude waarde dump gaf een error |
||
+ | max_allowed_packet = 512M |
||
+ | </pre> |
||
+ | Deze hoge waarden zijn geen probleem, omdat de ruimte alleen in geval van voodzaak in gebruik is, de daemon geeft de ruimte na gebruik weer vrij. |
||
+ | |||
+ | == Logging == |
||
+ | * http://www.jejik.com/articles/2008/12/keeping_sugarcrm_under_subversion_control/ |
||
+ | * http://www.rsyslog.com/doc-rsyslog_reliable_forwarding.html |
||
+ | * |
||
+ | * |
||
+ | * |
||
+ | * |
||
+ | * |
||
+ | * |
||
== ntp == |
== ntp == |
||
− | + | Webhuis heeft in haar opzet voor de machines een onderverdeling gemaakt in ntp servers en ntp clients. De virtuele servers zijn gebouwd op basis van xen. Virtuele xen machines ontleden hun klok informatie aan de fysieke machine waarop ze zijn gebouwd. |
|
Ntp servers zijn altijd fysieke machines, de rollen zijn verdeeld: |
Ntp servers zijn altijd fysieke machines, de rollen zijn verdeeld: |
||
* ntp servers die de tijd van externe ntp-servers halen; |
* ntp servers die de tijd van externe ntp-servers halen; |
||
* ntp servers die de tijd van interne ntp-servers halen. |
* ntp servers die de tijd van interne ntp-servers halen. |
||
+ | <pre> |
||
− | |||
servers: ntp0.nl.net swisstime.ee.ethz.ch ntp0-rz.rrze.uni-erlangen.de |
servers: ntp0.nl.net swisstime.ee.ethz.ch ntp0-rz.rrze.uni-erlangen.de |
||
− | ntpdate synchroniseert de clock, twee keer uitvoeren |
+ | # ntpdate synchroniseert de clock, twee keer uitvoeren |
+ | # ntpdate -b pool.ntp.org |
||
+ | # ntpq -pn |
||
+ | </pre> |
||
+ | Als de clock goed staat, de hardwareclock zetten met |
||
+ | # hwclock --systohc --utc |
||
+ | == nfs == |
||
− | ntpdate -b pool.ntp.org |
||
+ | nfs over een subnet.<br/> |
||
+ | Zet bij troubleshooting eerst het log level van de nfs-kernel-server op debug. Dat doe je in /etc/default/nfs-kernel-server: |
||
+ | <pre> |
||
+ | # Options for rpc.svcgssd. |
||
+ | RPCMOUNTDOPTS="--manage-gids --debug all" |
||
+ | </pre> |
||
+ | Let op: bij het gebruik van verschillende subnetten moet de POSTROUTING op ACCEPT staan in plaats van MASQUERADE, anders ziet de nfs server het verkeerde adres en geeft een permission denied. |
||
+ | == openssh server == |
||
+ | Security vereist ssh toegang op basis van PKI. |
||
+ | Aanpassen /etc/ssh/sshd_config |
||
+ | PermitRootLogin no |
||
− | ntpq -pn |
||
+ | PasswordAuthentication no |
||
+ | Firewall opzet voor ssh tegen brute force atacks: |
||
− | Als de clock goed staat, de hardwareclock zetten |
||
+ | <pre> |
||
+ | #!/bin/sh |
||
+ | # |
||
+ | # Variabelen en interfaces |
||
+ | IPTABLES="/sbin/iptables" |
||
− | hwclock --systohc --utc |
||
+ | ext="eth0" |
||
+ | int="eth1" |
||
+ | # Beperk de toegang tot de externe interface (ext) |
||
+ | # |
||
+ | lijst="D A" |
||
+ | for i in $lijst ; do |
||
+ | $IPTABLES -${i} INPUT -i ${int} -p tcp --dport 22 -j ACCEPT ; |
||
+ | |||
+ | $IPTABLES -${i} INPUT -i ${ext} -p tcp --dport 22 -m recent --update --seconds 600 --hitcount 7 --name SSH -j DROP ; |
||
+ | $IPTABLES -${i} INPUT -i ${ext} -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT ; |
||
+ | |||
+ | $IPTABLES -${i} OUTPUT -p tcp --sport 22 -j ACCEPT ; |
||
+ | done |
||
+ | </pre> |
||
+ | Door de rules eerst te verwijderen en daarna weer op te voeren is het script bruikbaar in combinatie met andere firewall scripts |
||
+ | |||
+ | Tonen van de geregistreerde IP-adressen |
||
+ | user@prod:~$ cat /proc/net/ipt_recent/SSH |
||
+ | Wheezy en verder: |
||
+ | user@prod:~$ cat /proc/net/xt_recent/SSH |
||
+ | |||
+ | Flushen van de geregistreerde IP-adressen |
||
+ | user@prod:~$ echo clear > /proc/net/ipt_recent/SSH |
||
+ | user@prod:~$ echo / > /proc/net/xt_recent/SSH |
||
+ | |||
+ | Een andere mogelijkheid tot hardening is de methode met "port knocking": http://en.wikipedia.org/wiki/Port_knocking |
||
+ | Hardening met Boks:<br/> |
||
+ | http://www.unixerius.nl/assets/media/BOKS-Paper-VJ2010.pdf<br/> |
||
+ | http://www.unixerius.nl/assets/media/BOKS-Presentation-VJ2010.pdf<br/> |
||
+ | http://www.kilala.nl/Sysadmin/index.php?id=2209<br/> |
||
+ | === Goede key maken === |
||
+ | ssh-keygen -t rsa -b 4096 |
||
+ | ==== passphrase verwijderen ==== |
||
+ | Voor unattended login: |
||
+ | <pre> |
||
+ | openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new |
||
+ | cp -p ~/.ssh/id_rsa_new ~/.ssh/id_rsa |
||
+ | </pre> |
||
+ | |||
+ | === ssh sessies open houden === |
||
+ | Sommige verbindingen vertonen de onhebbelijke eigenschap de verbinding te laten vallen. Dit is op te lossen door de volgende regel aan /etc/ssh/ssh_config toe te voegen: |
||
+ | ServerAliveInterval 60 |
||
+ | |||
+ | == Virtuele netwerken == |
||
+ | |||
+ | == powerdns == |
||
+ | === powerdnsadmin === |
||
== subversion == |
== subversion == |
||
+ | Webhuis maakt op grote schaal gebruik van versiebeheer met subversion. |
||
+ | * Configuraties van applicaties |
||
+ | * Configuratiebeheer met behulp van cfengine2 |
||
+ | * in eigen beheer ontwikkelde packages |
||
+ | * open-ldap directories |
||
+ | * virtualisatie (verhuist gaandeweg richting cfengine2) |
||
+ | * webdevelopment |
||
=== apache2.conf === |
=== apache2.conf === |
||
+ | <pre> |
||
− | NameVirtualHost *:443 |
||
− | + | NameVirtualHost *:443 |
|
+ | <VirtualHost *:443> |
||
− | # |
||
+ | # |
||
− | ServerName svn.uwork.nl |
||
+ | ServerName svn.Webhuis.nl |
||
− | ServerAlias www.svn.uwork.nl |
||
+ | ServerAlias www.svn.Webhuis.nl |
||
− | ServerAdmin martin@webhuis.nl |
||
+ | ServerAdmin martin@webhuis.nl |
||
− | DocumentRoot /var/www/svn.uwork.nl |
||
− | + | DocumentRoot /var/www/svn.Webhuis.nl |
|
− | + | ErrorLog /var/log/apache2/svn.Webhuis.nl-error.log |
|
+ | TransferLog /var/log/apache2/svn.Webhuis.nl-access.log |
||
− | # |
||
+ | # |
||
− | SSLProxyEngine on |
||
+ | SSLProxyEngine on |
||
− | SSLEngine on |
||
+ | SSLEngine on |
||
− | SSLProtocol all -SSLv2 |
||
+ | SSLProtocol all -SSLv2 |
||
− | SSLCertificateFile /etc/apache2/ssl/svn.uwork.nl.cert.pem |
||
− | + | SSLCertificateFile /etc/apache2/ssl/svn.Webhuis.nl.cert.pem |
|
− | + | SSLCertificateKeyFile /etc/apache2/ssl/svn.Webhuis.nl.key-nopw.pem |
|
+ | SSLCACertificateFile /etc/apache2/ssl/cacert.pem |
||
− | # |
||
+ | # |
||
− | <Location "/virtualisatie"> |
||
+ | <Location "/virtualisatie"> |
||
− | DAV svn |
||
− | + | DAV svn |
|
+ | SVNPath /var/lib/svn/virtualisatie |
||
− | AuthType Basic |
||
+ | AuthType Basic |
||
− | # |
||
+ | # |
||
− | AuthName "Subversion repository" |
||
+ | AuthName "Subversion repository" |
||
− | AuthUserFile /etc/apache2/dav_svn.passwd |
||
+ | AuthUserFile /etc/apache2/dav_svn.passwd |
||
− | # |
||
+ | # |
||
− | require valid-user |
||
+ | require valid-user |
||
− | </Location> |
||
+ | </Location> |
||
− | # |
||
+ | # |
||
− | </VirtualHost> |
||
+ | </VirtualHost> |
||
+ | </pre> |
||
+ | |||
=== creëren directory repository === |
=== creëren directory repository === |
||
svn --username=user --password=xxxxxx import /home/martin/ips-vpn \ |
svn --username=user --password=xxxxxx import /home/martin/ips-vpn \ |
||
− | https://configurations.webhuis.nl/configurations/ |
+ | https://configurations.webhuis.nl/configurations/Webhuis.nl/test-t105/ips-vpn -m"initial import ips-vpn" |
Troublshooting: http://wiki.webhuis.nl/mediawiki/index.php/HowTo%27s#subversion |
Troublshooting: http://wiki.webhuis.nl/mediawiki/index.php/HowTo%27s#subversion |
||
+ | === Backup repositories === |
||
+ | <pre> |
||
+ | #!/bin/bash |
||
+ | # Backup script voor alle relevante zaken van de Subversion server. |
||
+ | # |
||
+ | StartAgent(){ |
||
+ | eval $(ssh-agent) >/dev/null 2>&1 |
||
+ | ssh-add >/dev/null 2>&1 |
||
+ | } |
||
+ | |||
+ | datum=$(date +%Y%m%d) |
||
+ | host=$(hostname) |
||
+ | |||
+ | /etc/init.d/httpd stop |
||
+ | lijst=$(ls /var/www/svn) |
||
+ | #echo $lijst |
||
+ | for i in $lijst ; do |
||
+ | svnadmin dump /var/www/svn/$i > /var/backups/$host.$i.$datum.dump |
||
+ | done |
||
+ | |||
+ | trac-admin /var/www/trac/ hotcopy /var/backups/trac-$datum |
||
+ | |||
+ | /etc/init.d/httpd start |
||
+ | |||
+ | tar -czf /var/backups/$host-subversion.$datum.tgz /etc |
||
+ | /var/backups/*.$datum.dump /var/backups/trac-$datum |
||
+ | rm -rf /var/backups/*dump |
||
+ | rm -rf /var/backups/trac-$datum |
||
+ | |||
+ | StartAgent |
||
+ | scp -pr /var/backups/$host-subversion.$datum.tgz |
||
+ | lmp_bu@10.75.120.3:/prj/lmp |
||
+ | kill ${SSH_AGENT_PID} |
||
+ | |||
+ | rm -f /var/backups/$host-subversion.$datum.tgz |
||
+ | </pre> |
||
+ | == websvn == |
||
+ | <pre> |
||
+ | Note on permissions │ |
||
+ | │ │ |
||
+ | │ Due to a limitation in the DB format, the 'svnlook' command needs read-write access to the repository (to create locks etc). You need to give │ |
||
+ | │ read-write permissions to the user running your webserver on all your repositories. │ |
||
+ | │ │ |
||
+ | │ Another way of avoiding this problem is by creating SVN repositories with the --fs-type=fsfs option. Existing DB repositories can be converted │ |
||
+ | │ to the FSFS format by using the svnadmin dump/load commands. |
||
+ | </pre> |
||
+ | = Desktops = |
||
+ | == Remote Desktop == |
||
+ | De remote desktop draait in een windows, omdat lokaal al een window manager actief is. Op de remote machine is XDMCP enabled. Je hebt dan twee opties: |
||
+ | * Xnest -query 192.168.1.107 -geometry 1024x768 :1 voor een remote login in een lokaal window. |
||
+ | * Xephyr :1 -screen 1024x768 -query 192.168.1.107 idem, maar dan met een betere X server. |
||
+ | == Nuttige links == |
||
+ | * http://askubuntu.com/questions/175902/remote-x-server-with-ssh-x |
||
<hr/> |
<hr/> |
||
− | Terug naar: [[ |
+ | Terug naar: [[Main Page]] |
Latest revision as of 19:45, 26 July 2023
Contents
Basale infrastructuur
ADSL verbinding
Virtualisatie: KVM of Xen?
Debian
Volumes
lsblk -l
bind
De nameserver structuur is in ontwikkeling. Op locatie draait een bind9 name-server als slave van de Webhuis superslaves. Webhuis heeft een master nameserver en twee superslaves:
- ns1.Webhuis.nl
- ns2.Webhuis.nl
- ns3.Webhuis.nl
Zie voor deze nameservers: powerdns
Webhuis ondersteunt nu alleen nog static domain name serving met reverse lookup. Webhuis wil twee features realiseren:
- Geautomatiseerde reverse lookup, automatisch aanmaken van PTR records als er een A record ontstaat en ook verwijderen als het A record verdwijnt.
- Geautomatiseerd gecollecteerde dynamische domain name serving
De oplossing ligt in een complexe relatie van masters en slaves met een gecombineerde implementatie van bind9 en powerdns.
cron
Sommige jobs sterven, zoals de mysql-pipe voor syslog-ng, zodat het noodzakelijk is om telkens vast te stellen of de job nog loopt en weer te starten als de job verdwenen is.
# m h dom mon dow command # Minute Hour Day of Month Month Day of Week Command # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) * * * * * /etc/syslog-ng/check-mysql-pipe.sh # cron draait dit script elke minuut. */5 * * * * /usr/local/bin/some-script.sh # cron draait dit script elke vijf minuten. # Soms is meer nodig in cron, zoals het afvuren van een job in een random window om overbelasting door massale actie op één server te voorkomen # SHELL=/bin/bash # Deze regel zorgt ervoor dat het upload script van een groot logbestand van vele servers naar een centraal punt soepel verloopt. # RANDOM is een shell variable met een waarde tussen 0 en 32768, die na elk gebruik een nieuwe waarde krijgt. # Vermenivuldigen met 300 en delen door 32768 levert een waarde tussen de 0 en 300 seconden op, vijf minuten. 12 0 * * * sleep $((RANDOM*300/32768)); /usr/local/bin/copy-log.sh
dhcpd.conf
In bewerking.
Melding in de log: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
De debian dhcp3 server heeft poblemen met code 95 ldap-server. Deze parameter is voor de Mac omgeving om zo de server mee te geven.
ddns-update-style none; option domain-name "Webhuis.nl"; option domain-name-servers 10.x.y.z 10.x1.x2.z2; default-lease-time 600; max-lease-time 7200; lease-file-name "/var/cache/dhcpd/dhcp.leases"; authoritative; log-facility local7; subnet 10.x.y.0 netmask 255.255.255.224 { range 10.x.y.10 10.x.y.30; option routers 10.x.y.1; host t105-01.webhuis.nl { hardware ethernet 00:1e:c9:51:4a:5b; fixed-address 10.37.41.21; } host voip-lek { hardware ethernet 00:21:04:bd:1e:cf; ignore booting; } }
Let op: Maak bij configuratie het bestand "/var/cache/dhcpd/dhcp.leases" aan (de sart van de server breekt af als het bestand ontbreekt).
dhcp3.server
Specificeer in /etc/default/dhcp3-server in geval van een machine met meerdere netwerkkaarten de netwerkkaarten waarop de server luistert.
INTERFACES="eth1"
firebird
- http://www.debianhelp.co.uk/firebirdweb.htm
- http://www.firebirdsql.org/rlsnotesh/install210.html
- http://www.debianhelp.co.uk/firebird.htm
- http://www.firebirdsql.org/manual/ubusetup.html
- http://www.osfinancials.org/index.php?option=com_frontpage&Itemid=1
- http://www.osfinancials.org/mediawiki/index.php/Linux_Server_Dutch_Installatie_handleiding
- http://www.firebirdsql.org/
- http://firebird.sourceforge.net/manual/ibfbcoex-running-ib-fb-together.html
- http://linux-sxs.org/internet_serving/firebird102.html
- http://www.flamerobin.org/dokuwiki/doku.php?id=wiki:roadmap
- http://www.destructor.de/firebird/isql.htm
- http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_60_sqlref#RSf43135
- http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_sqlroles
- http://www.ibexpert.net/ibe/index.php?n=Doc.GrantManager
- http://www.ibexpert.net/ibe/index.php?n=Doc.DCL-DataControlLanguage#Grant
gpg openpgp
Een gpg key pair is bruikbaar voor:
- Signing van berichten, met de private key
De ontvanger van het bericht weet dat het bericht van de eigenaar van het key pair afkomstig is.
- Encryptie van berichten door een verzender met de public key
De public key is publiek beschikbaar. Iedereen heeft zo de mogelijkheid om aan de eigenaar van het key pair een encrypted bericht te zenden. Alleen de eigenaar van het key pair heeft de mogelijkheid om het bericht te decrypten.
Het genereren gaat zo:
gpg: Invalid option "--export-keys" martin@host:~$ gpg --gen-key gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Martin Simons Email address: martin@webhuis.nl Comment: Webhuis Uw Internet Liaison You selected this USER-ID: "Martin Simons (Webhuis Uw Internet Liaison) <martin@webhuis.nl>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. ......................+++++ gpg: key A135178F marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u gpg: next trustdb check due at 2017-04-06 pub 4096R/A135178F 2013-09-16 Key fingerprint = 02BA 2D3A 82C1 CB47 05F9 23BD 0310 B54E A135 178F uid Martin Simons (Webhuis Uw Internet Liaison) <martin@webhuis.nl> sub 4096R/8B09F269 2013-09-16 martin@host:~$ gpg --send-keys --keyserver keys.gnupg.net 8B09F269 gpg: sending key A135178F to hkp server keys.gnupg.net martin@host:~$
links
- https://wiki.debian.org/subkeys
- http://en.wikipedia.org/wiki/Public_key_infrastructure
- http://en.wikipedia.org/wiki/Public-key_cryptography
iptables
BLokkeren msn is op poort 1863, de poort wijzigt van tijd tot tijd. :-(
Gewone router forwarding
Configureer forwarding als volgt:
#!/bin/bash # ip_domU_win="10.x.y.13" # echo 1 > /proc/sys/net/ipv4/ip_forward # # Let op: # De flush '-F' regels verwijderen als het een vpn-router is # /sbin/iptables -F /sbin/iptables -t nat -F /sbin/iptables -t mangle -F /sbin/iptables -F INPUT /sbin/iptables -F OUTPUT /sbin/iptables -F FORWARD # # Faciliteer RDP voor de Windows machine # /sbin/iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp -s 0.0.0.0 -d 10.x.y.13 --dport 3389 -j ACCEPT /sbin/iptables -A FORWARD -d 10.x.y.13 -p tcp --dport 3389 -j ACCEPT /sbin/iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 3389 -j DNAT --to 10.x.y.13 # /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.x.y.13 -p tcp --sport 3389 --dport 3389 -j ACCEPT # # Blokkeer Internet voor de Windows machine # /sbin/iptables -A FORWARD -i eth0 -o eth1 -s ! 10.0.0.0/8 -d $ip_domU_win -j DROP /sbin/iptables -A INPUT -i eth0 -s ! 10.0.0.0/8 -d $ip_domU_win -j DROP /sbin/iptables -A OUTPUT -o eth0 -s $ip_domU_win -d ! 10.0.0.0/8 -j DROP # # Zorg voor forwarding van de machines van het locale netwerk # /sbin/iptables -A INPUT -i eth0 -d 10.29.20.0/26 -j ACCEPT /sbin/iptables -A OUTPUT -o eth0 -s 10.29.20.0/26 -j ACCEPT /sbin/iptables -A FORWARD -i eth1 -s 10.29.20.0/26 -o eth0 -j ACCEPT /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.29.20.0/26 -j MASQUERADE # /sbin/iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -o eth1 -d 10.29.20.0/26 -j ACCEPT /sbin/iptables -t nat -A PREROUTING -d 10.29.20.0/26 -j ACCEPT
In deze opzet is de Windows machine van buitenaf te benaderen, maar de Windows machine zelf is geblokkeerd voor Internet verkeer.
Blokkeren ongecontroleerd smtp verkeer
Het verdient in een omgeving met Windows clients aanbeveling om het risico van ongecontroleerd mailverkeer over de default gateway, dat is naar alle waarschijnlijkheid spam, te loggen en te blokkeren op de firewall. Daartoe staan onderstaande regels in /usr/local/bin/local-rules.sh:
/sbin/iptables -F SMTPLOG /sbin/iptables -N SMTPLOG /sbin/iptables -A FORWARD -p tcp --dport 25 -j LOG --log-prefix "dropped smtp packets : " --log-level warning /sbin/iptables -A SMTPLOG -p tcp --dport 25 -j LOG --log-prefix "dropped smtp packets : " --log-level warning /sbin/iptables -A FORWARD -p tcp --dport 25 -j DROP
mysql
De installatie van de mysql server is rechtstreeks en standaard.
# apt-get update && apt-get install mysql-server-5.0
Zet in ieder geval een wachtwoord voor de gebruiker root.
my.cnf
Het hangt verder af van het gebruik of er in de confuguratie nog wijzigingen noodzakelijk zijn. Voor grotere databases is het noodzakelijk om het max_allowed_packet hoger te zetten voor zowel mysqld als mysqldump. Een te lage waarde resulteert in een onvolledige dump of een fout in de database.
[mysqld] # max_allowed_packet = 16M Oude waarde dump gaf een error max_allowed_packet = 512M . . [mysqldump] # max_allowed_packet = 16M Oude waarde dump gaf een error max_allowed_packet = 512M
Deze hoge waarden zijn geen probleem, omdat de ruimte alleen in geval van voodzaak in gebruik is, de daemon geeft de ruimte na gebruik weer vrij.
Logging
- http://www.jejik.com/articles/2008/12/keeping_sugarcrm_under_subversion_control/
- http://www.rsyslog.com/doc-rsyslog_reliable_forwarding.html
ntp
Webhuis heeft in haar opzet voor de machines een onderverdeling gemaakt in ntp servers en ntp clients. De virtuele servers zijn gebouwd op basis van xen. Virtuele xen machines ontleden hun klok informatie aan de fysieke machine waarop ze zijn gebouwd. Ntp servers zijn altijd fysieke machines, de rollen zijn verdeeld:
- ntp servers die de tijd van externe ntp-servers halen;
- ntp servers die de tijd van interne ntp-servers halen.
servers: ntp0.nl.net swisstime.ee.ethz.ch ntp0-rz.rrze.uni-erlangen.de # ntpdate synchroniseert de clock, twee keer uitvoeren # ntpdate -b pool.ntp.org # ntpq -pn
Als de clock goed staat, de hardwareclock zetten met
# hwclock --systohc --utc
nfs
nfs over een subnet.
Zet bij troubleshooting eerst het log level van de nfs-kernel-server op debug. Dat doe je in /etc/default/nfs-kernel-server:
# Options for rpc.svcgssd. RPCMOUNTDOPTS="--manage-gids --debug all"
Let op: bij het gebruik van verschillende subnetten moet de POSTROUTING op ACCEPT staan in plaats van MASQUERADE, anders ziet de nfs server het verkeerde adres en geeft een permission denied.
openssh server
Security vereist ssh toegang op basis van PKI. Aanpassen /etc/ssh/sshd_config
PermitRootLogin no PasswordAuthentication no
Firewall opzet voor ssh tegen brute force atacks:
#!/bin/sh # # Variabelen en interfaces IPTABLES="/sbin/iptables" ext="eth0" int="eth1" # Beperk de toegang tot de externe interface (ext) # lijst="D A" for i in $lijst ; do $IPTABLES -${i} INPUT -i ${int} -p tcp --dport 22 -j ACCEPT ; $IPTABLES -${i} INPUT -i ${ext} -p tcp --dport 22 -m recent --update --seconds 600 --hitcount 7 --name SSH -j DROP ; $IPTABLES -${i} INPUT -i ${ext} -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT ; $IPTABLES -${i} OUTPUT -p tcp --sport 22 -j ACCEPT ; done
Door de rules eerst te verwijderen en daarna weer op te voeren is het script bruikbaar in combinatie met andere firewall scripts
Tonen van de geregistreerde IP-adressen
user@prod:~$ cat /proc/net/ipt_recent/SSH
Wheezy en verder:
user@prod:~$ cat /proc/net/xt_recent/SSH
Flushen van de geregistreerde IP-adressen
user@prod:~$ echo clear > /proc/net/ipt_recent/SSH user@prod:~$ echo / > /proc/net/xt_recent/SSH
Een andere mogelijkheid tot hardening is de methode met "port knocking": http://en.wikipedia.org/wiki/Port_knocking
Hardening met Boks:
http://www.unixerius.nl/assets/media/BOKS-Paper-VJ2010.pdf
http://www.unixerius.nl/assets/media/BOKS-Presentation-VJ2010.pdf
http://www.kilala.nl/Sysadmin/index.php?id=2209
Goede key maken
ssh-keygen -t rsa -b 4096
passphrase verwijderen
Voor unattended login:
openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new cp -p ~/.ssh/id_rsa_new ~/.ssh/id_rsa
ssh sessies open houden
Sommige verbindingen vertonen de onhebbelijke eigenschap de verbinding te laten vallen. Dit is op te lossen door de volgende regel aan /etc/ssh/ssh_config toe te voegen:
ServerAliveInterval 60
Virtuele netwerken
powerdns
powerdnsadmin
subversion
Webhuis maakt op grote schaal gebruik van versiebeheer met subversion.
- Configuraties van applicaties
- Configuratiebeheer met behulp van cfengine2
- in eigen beheer ontwikkelde packages
- open-ldap directories
- virtualisatie (verhuist gaandeweg richting cfengine2)
- webdevelopment
apache2.conf
NameVirtualHost *:443 <VirtualHost *:443> # ServerName svn.Webhuis.nl ServerAlias www.svn.Webhuis.nl ServerAdmin martin@webhuis.nl DocumentRoot /var/www/svn.Webhuis.nl ErrorLog /var/log/apache2/svn.Webhuis.nl-error.log TransferLog /var/log/apache2/svn.Webhuis.nl-access.log # SSLProxyEngine on SSLEngine on SSLProtocol all -SSLv2 SSLCertificateFile /etc/apache2/ssl/svn.Webhuis.nl.cert.pem SSLCertificateKeyFile /etc/apache2/ssl/svn.Webhuis.nl.key-nopw.pem SSLCACertificateFile /etc/apache2/ssl/cacert.pem # <Location "/virtualisatie"> DAV svn SVNPath /var/lib/svn/virtualisatie AuthType Basic # AuthName "Subversion repository" AuthUserFile /etc/apache2/dav_svn.passwd # require valid-user </Location> # </VirtualHost>
creëren directory repository
svn --username=user --password=xxxxxx import /home/martin/ips-vpn \ https://configurations.webhuis.nl/configurations/Webhuis.nl/test-t105/ips-vpn -m"initial import ips-vpn"
Troublshooting: http://wiki.webhuis.nl/mediawiki/index.php/HowTo%27s#subversion
Backup repositories
#!/bin/bash # Backup script voor alle relevante zaken van de Subversion server. # StartAgent(){ eval $(ssh-agent) >/dev/null 2>&1 ssh-add >/dev/null 2>&1 } datum=$(date +%Y%m%d) host=$(hostname) /etc/init.d/httpd stop lijst=$(ls /var/www/svn) #echo $lijst for i in $lijst ; do svnadmin dump /var/www/svn/$i > /var/backups/$host.$i.$datum.dump done trac-admin /var/www/trac/ hotcopy /var/backups/trac-$datum /etc/init.d/httpd start tar -czf /var/backups/$host-subversion.$datum.tgz /etc /var/backups/*.$datum.dump /var/backups/trac-$datum rm -rf /var/backups/*dump rm -rf /var/backups/trac-$datum StartAgent scp -pr /var/backups/$host-subversion.$datum.tgz lmp_bu@10.75.120.3:/prj/lmp kill ${SSH_AGENT_PID} rm -f /var/backups/$host-subversion.$datum.tgz
websvn
Note on permissions │ │ │ │ Due to a limitation in the DB format, the 'svnlook' command needs read-write access to the repository (to create locks etc). You need to give │ │ read-write permissions to the user running your webserver on all your repositories. │ │ │ │ Another way of avoiding this problem is by creating SVN repositories with the --fs-type=fsfs option. Existing DB repositories can be converted │ │ to the FSFS format by using the svnadmin dump/load commands.
Desktops
Remote Desktop
De remote desktop draait in een windows, omdat lokaal al een window manager actief is. Op de remote machine is XDMCP enabled. Je hebt dan twee opties:
- Xnest -query 192.168.1.107 -geometry 1024x768 :1 voor een remote login in een lokaal window.
- Xephyr :1 -screen 1024x768 -query 192.168.1.107 idem, maar dan met een betere X server.
Nuttige links
Terug naar: Main Page