Archive for the ‘networking’ Category

bekannte WLANs auf dem iPhone bearbeiten

Dienstag, April 27th, 2010

Mein iPhone hat in der letzten Zeit immer häufiger Probleme mit der WLAN-Verbindung gehabt. Wenn sie einmal lief war alles gut, aber bis das vorhandene und bekannte WLAN gefunden wurde hat es oft sehr lange gedauert, trotz SSID-Broadcasting.

Ich hatte die Vermutung, daß schlicht zu viele WLANs gespeichert waren. Da man einzelne WLANs aber nur löschen kann, wenn man gerade damit verbunden ist, gibt es nur die Möglichkeit, alle bekannten Netzwerke zu vergessen, und alle vier, die ich regelmässig nutze, manuell wieder einzutragen — keine schöne Vorstellung.

Da ich aber per Jailbreak einen SSH-Server auf meinem iPhone laufen habe konnte ich es auch anders lösen. Die bekannten WLANs findet man auf dem iPhone in der Datei /Library/Preferences/SystemConfiguration/com.apple.wifi.plist — wenn man diese vom iPhone herunterlädt und auf dem Mac per Property List Editor bearbeitet, danach wieder hochlädt und das iPhone neu startet, sind die alten WLANs vergessen und die Verbindung kommt tatsächlich deutlich schneller zustande.

Wackelkontakt Netzwerkkabel

Dienstag, Februar 23rd, 2010

Dieser Wackelkontakt hat uns zum ersten Mal mit Mainboards von SuperMicro geärgert, ist in der Zwischenzeit aber auch an anderen Anschlüssen aufgetreten. Offenbar hat hier ein Hersteller von Netzwerkkabeln die Toleranzen etwas zu weit ausgelegt.

Get the Flash Player to see this content.

Nebenbei ist dies ein erster Test für die Einbindung eines Videos in meinem Blog.

DNS-Konfiguration per Datenbank mit bind-dlz

Montag, November 30th, 2009

Seit BIND9.4 ist der DLZ-Patch mit enthalten. Um ihn unter Debian nutzen zu können muss in der Datei debian/rules das Einkompilieren von PostgreSQL und/oder MySQL aktiviert werden:

--with-dlz-postgres=yes \
--with-dlz-mysql=yes \

Dann kann man in der BIND-Konfiguration die dynamische Zone aktivieren:

dlz "Mysql zone" {
   database "mysql
   {host=localhost dbname=dns_data user=dns_data pass=password ssl=false}
   {select zone from dns_records where zone = '%zone%'}
   {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') 
  when lower(type) = 'soa' 
  then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) 
  else data end from dns_records where zone = '%zone%' and host = '%record%'}
   {}
   {select ttl, type, host, mx_priority, data
        from dns_records where zone = '%zone%' and not (type = 'SOA' or type = 'NS')}
   {select zone from xfr_table where zone = '%zone%' and client = '%client%'}
   {}";
};

Als Testdaten kann man folgenden SQL-Dump einspielen:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101example.com SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO’ */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Dump of table data_count
# ------------------------------------------------------------

CREATE TABLE `data_count` (
  `count` bigint(20) default ‘0’,
  `zone` char(64) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

LOCK TABLES `data_count` WRITE;
/*!40000 ALTER TABLE `data_count` DISABLE KEYS */;
INSERT INTO `data_count` (`count`,`zone`)
VALUES
        (0,’example.com’);

/*!40000 ALTER TABLE `data_count` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table dns_records
# ------------------------------------------------------------

CREATE TABLE `dns_records` (
  `zone` varchar(64) default NULL,
  `host` varchar(64) default NULL,
  `type` varchar(8) default NULL,
  `data` varchar(64) default NULL,
  `ttl` int(11) NOT NULL default ‘3600’,
  `mx_priority` int(11) default NULL,
  `refresh` int(11) default NULL,
  `retry` int(11) default NULL,
  `expire` int(11) default NULL,
  `minimum` int(11) default NULL,
  `serial` bigint(20) default NULL,
  `resp_person` varchar(64) default NULL,
  `primary_ns` varchar(64) default NULL,
  KEY `host` (`host`),
  KEY `zone` (`zone`),
  KEY `type` (`type`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

LOCK TABLES `dns_records` WRITE;
/*!40000 ALTER TABLE `dns_records` DISABLE KEYS */;
INSERT INTO `dns_records` (`zone`,`host`,`type`,`data`,`ttl`,`mx_priority`,`refresh`,`retry`,
`expire`,`minimum`,`serial`,`resp_person`,`primary_ns`)
VALUES
(‘example.com’,’@‘,’SOA’,’@‘,3600,NULL,10800,1800,604800,3600,2008082700,
  ’root.example.com.’,’ns1.example.com’),
(‘example.com’,’@‘,’A’,’192.0.2.1’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’@‘,’NS’,’ns1.example.com.’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’@‘,’NS’,’ns2.example.com.’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’@‘,’NS’,’ns3.example.com.’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’@‘,’AAAA’,’2001:0db8::1’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’www’,’AAAA’,’2001:0db8::1’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’www’,’A’,’192.0.2.1’,3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(‘example.com’,’@‘,’MX’,’ns1.example.com.’,3600,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

/*!40000 ALTER TABLE `dns_records` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table xfr_table
# ------------------------------------------------------------

CREATE TABLE `xfr_table` (
  `zone` text,
  `client` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

LOCK TABLES `xfr_table` WRITE;
/*!40000 ALTER TABLE `xfr_table` DISABLE KEYS */;
INSERT INTO `xfr_table` (`zone`,`client`)
VALUES
        (‘example.com’,’127.0.0.1’);

/*!40000 ALTER TABLE `xfr_table` ENABLE KEYS */;
UNLOCK TABLES;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Kurztipp: HTTP auf Kommandozeile

Sonntag, Oktober 11th, 2009

Manchmal muss man einen Webserver testen, ob er auch korrekt antwortet. Will man dabei auch die Virtual-Host-Konfiguration testen, muss man HTTP 1.1 sprechen. Ich habe öfter vergessen wo in der ersten Zeile der Schrägstrich hingehört, oder ob es in der zweiten Host, Hostname, Server heisst und ob ein Doppelpunkt erforderlich ist, deshalb hier ein minimaler HTTP-Request, der auch nur mit den Headern antwortet, die oft für Testzwecke ausreichend sind:

HEAD / HTTP/1.1
Host: www.example.com

Alternativ kann man auch die komplette Seite anfordern:

GET / HTTP/1.1
Host: www.example.com

xml-Verarbeitung mit xml2

Freitag, Juni 26th, 2009

In der c’t war kürzlich ein Artikel über das praktische Kommandozeilentool xml2. Dieses hilft bei der Verarbeitung von XML-Dateien in Shell-Skripten.

Ein Anwendungsvorschlag von der Beispielseite:

% wget -q -O - http://slashdot.org/slashdot.xml | xml2 | 
  grep story/title= | cut -d= -f 2-
More on Athlon Overclocking
New Atari Jaguar Game Running $1,225 on eBay
AT&T's Korn Shell Source Code Released
TheBench.org: Community Cartooning
OpenGL for Palm OS Environment
Banner Ads on Your Cell Phone
Burning Money on Open Source
Embedded OpenBSD Running the Stallion ePipe
Bezos Responds to Tim O'Reilly's Open Letter
Update on 'Blame Canada' and the Oscars

Farbfehler bei PNG in Safari und IE

Sonntag, Juni 14th, 2009

Kürzlich hatte ich mal wieder Darstellungsfehler bei einer PNG-Grafik: Trotz exakt identischer Farbwerte in CSS und PNG stimmte es trotzdem nicht. Eine kurze Suche führte zu WarpedVisions. Ursache sind die Gamma- und Farbraum-Informationen im PNG. Diese kann man unter Linux sehr einfach mit pngcrush entfernen:

pngcrush -rem cHRM -rem gAMA -rem iCCP -rem sRGB -d fixed/ *

Dies funktioniert zwar nicht in allen Browsern, aber zumindest in allen aktuellen. Wenn die Farben immer stimmen sollen muss man anstelle von CSS-Farben ein Einpixel-PNG verwenden.

Wartungsseite mit mod_rewrite

Mittwoch, Mai 27th, 2009

Ein häufiger mal auftretendes Problem ist, dass man wenn eine umfangreiche Website aktualisiert wird eine Wartungsseite vorschalten möchte.

Man will ja aber selber die Möglichkeit haben, Testhalber einen Blick auf die Seiten zu werfen, um sicherzustellen dass alles funktioniert. Diese .htaccess-Regeln ermöglichen genau das. Man muss nur die eigene(n) IP-Adresse eintragen, und auch den IPv6-Präfix des eigenen Netzes nicht vergessen. Das gute ist, dass alle anderen Rewrite-Regeln der Datei normal ausgewertet werden.

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192.168.28.17$ [NC]
RewriteCond %{REMOTE_ADDR} !^fe80:$ [NC]
RewriteCond %{REQUEST_URI} !=wartung.html [NC]
RewriteCond %{REQUEST_URI} !=/wartung.jpg [NC]
RewriteRule ^(.*)$ wartung.html [NC,L]

Als Referenz bei allen mod_rewrite Konfigurationen nutze ich das Cheat Sheet von AddedBytes.com

Segmentation Faults in PHP5 bei Debian GNU/Linux 5.0 (Lenny)

Mittwoch, Mai 27th, 2009

Nachdem ich ein paar Webseiten eingerichtet habe flogen mir regelmässige Segmentation Faults um die Ohren:

kernel: [717604.089640] php-cgi[26348]: segfault at 7ff99a76bac0 ip 7ff99a76bac0
 sp 7fffaa1e0088 error 4 in libtasn1.so.3.0.15[7ff99d73f000+f000]
kernel: [717604.119036] php-cgi[26347]: segfault at 7ff99a76bac0 ip 7ff99a76bac0
 sp 7fffaa1e0088 error 4 in libtasn1.so.3.0.15[7ff99d73f000+f000]
kernel: [717604.123062] php-cgi[26349]: segfault at 7fe00b9dbac0 ip 7fe00b9dbac0
 sp 7fff1b452298 error 4 in libtasn1.so.3.0.15[7fe00e9af000+f000]

Nach etwas Suche fand ich Debian Bug #411982. Die Lösung ist ziemlich simpel, man muss das php5-Modul pgsql vor curl laden, z.B. per mv pgsql.ini 0pgsql.ini.

Cisco Event-Manager für automatische Konfigurationsanpassung

Mittwoch, Mai 6th, 2009

Nachdem ich eine Viertelstunde vor dem Rechner auf den vereinbarten Zeitpunkt für eine Konfigurationsänderung gewartet habe kam mir hinterher der Gedanke, dass man das auch hätte automatisieren können.

Es ging darum, bei einer BGP-Session ein MD5-Passwort wieder einzutragen, das aufgrund eines Problems bei unserem Upstream temporär entfernt werden musste.

Dank Event-Manager wäre das ziemlich einfach gewesen, wie ein kurzer Test im Labor gezeigt hat. Der Cisco IOS Event-Manager kann das Log beobachten und durch bestimmte Kommandos reagieren. Wir warten also einfach darauf, dass die BGP-Session abfällt, und konfigurieren dann das Passwort.

Die Logmeldung, auf die wir warten lautet:

May  5 19:05:51.339: %BGP-5-ADJCHANGE: neighbor 10.1.1.1 
  Down BGP protocol initialization

Also konfigurieren wir auf unserem Router:

event manager applet BGP-PASS
 event syslog occurs 1 pattern "%BGP-5-ADJCHANGE: neighbor 10.1.1.1 Down"
 action 1.0 cli command "enable"
 action 1.1 cli command "configure terminal"
 action 1.2 cli command "router bgp 64512"
 action 1.3 cli command "neighbor 10.1.1.1 password topsecret"

Dies sollte man natürlich nicht zu lange vor dem vereinbarten Termin machen, falls die Session aus anderen Gründen abreisst. Aber, wenn alles funktioniert, muss der Upstream einfach das Passwort eintragen und ein “clear ip bgp 10.1.1.2” ausführen, damit unser Router die notwendige Änderung durchführt.

Dedizierte IP ab dem ersten SSL-Zertifikat

Freitag, Februar 27th, 2009

Als Systemadministrator bei einem ISP wird das ein- oder andere Mal auch ein SSL-Zertifikat benötigt. Auf den meisten Webservern werden mehrere Domains gehostet — alles andere würde Mecker vom RIPE geben. Aber was macht man wenn ein Kunde ein SSL-Zertifikat haben möchte?

Solange es kein sogenanntes Wildcard-Zertifikat *.example.com ist sollte man konsequenterweise schon beim ersten SSL-Zertifikat hierfür eine eigene IP-Adresse zur Verfügung stellen. Wieso das?

Angenommen, auf dem Server sind die Domains www.example.com und www.example.org gehostet, für verschiedene Kunden oder Projekte. Nun konfiguriert man den Webserver so, daß der HTTPS-VHost für www.example.com auf der einzigen IP-Adresse des Servers läuft. Soweit ist alles klar, http://www.example.org funktioniert weiter, und http://www.example.com genauso wie https://www.example.com. Aber jetzt kommt das, was manchen Kunden überrascht. Ruft man jetzt https://www.example.org auf, landet man nach einer Sicherheitswarnung auf der Webseite von example.com – denn HTTPS unterstützt keine Name-Based Virtual Hosts, weil die SSL-Aushandlung vor der möglichen Übertragung eines Servernamens erfolgt.

Deshalb, um Verwirrung und Ärger zu vermeiden, sollte man gleich für https://www.example.com eine dedizierte IP-Adresse vergeben.