Wenn Server nach einem Neustart die Netzwerkkarten vertauscht haben

Ich hatte letztlich das Problem, dass sich Netzwerkkarten bei Linux und Windows nach einem Neustart immer wieder vertauschten. Da die Server dadurch über Netzwerk nicht mehr erreichbar sind und ausfallen, ist das natürlich sehr ärgerlich. Da ich jetzt gerade eine neuen Firewall auf Basis von Ubuntu Linux mit 9 Netzwerkkarten und 100 VPN-Tunneln eingerichtet habe, wollte ich das Problem auf jeden Fall verhindern. Deshalb habe ich das Problem noch mal genauer untersuch und viel Doku dazu gelesen. Jetzt ist mir klar warum das Problem auftritt und ich kann es zukünftig verhindern.

Ursache: Da die Betriebssysteme zum schnellen Booten alles parallel starten, kommt es beim Booten regelmäßig dazu, dass die Hardwaretreiber in anderer Reihenfolge geladen werden. Wenn man im Server zwei Netzwerkkarten mit unterschiedlichen Treibern hat, kann dabei die Reihenfolge vertauscht werden, in der die Treiber geladen werden. Da bei älteren Windows- und Linuxservern die Netzwerkkarten einfach nur anhand der Startreihenfolge durchnummeriert werden, kann es somit vorkommen, dass die IP-Konfiguratiuonen der Karten durcheinander gewürfelt werden.

Lösung bei neueren Betriebssystemen: Bei neueren Betriebssystemen wird das Vertauschen der Karten verhindert. Windows merkt sich inzwischen für welche Karte eine Konfiguration war und zählt bei neuen Karten einfach immer weiter hoch. Es bindet (vermutlich anhand der Mac-Adresse oder Seriennummer) die Konfiguration fest an eine Netzwerkkarte und vergibt eine bereits vergebene Nummer kein zweites mal. Deshalb hat man bei Windows auch machmal einen Netzwerkadapter 5 oder 6, obwohl aktuell nur eine Karte im Betriebssystem steckt. Bei Linux wird der Steckplatz der Karte mit in den Namen der Netzwerkkarte aufgenommen. Eine Netzwerkkarte auf PCI-Slot 2 heißt dann z.B. p2p1, wobei das p2 dann für den PCI-Slot 2 und das p1 für den ersten Port der Karte steht. Theoretisch kann man bei Linux also eine neue Karte in den gleichen Slot stecken und die Konfiguration sollte noch funktionieren.

Das Tunneln von X11 über SSH bei Ubuntu 14.04 geht nicht

Zu meiner Überraschung funktionierte das Tunneln von X11 über ssh auf einem Ubuntu 14.04 Server nicht mehr. Schon beim Login über den Befehl

ssh -X <Hostname>

gibt es den Fehler „X11 forwarding request failed on channel 0“,
obwohl in der /etc/ssh/sshd_config der Eintrag „X11Forwarding yes“ gesetzt ist.

Auch eine Installation der der XServer Utils

apt-get install x11-xserver-utils

brachte keine Lösung und nicht einmal xclock lief.

Nach ein bisschen Suchen stellt ich fest, dass das Paket xauth fehlt. Wenn man dieses nachinstalliert funktioniert auch das Tunneln von X11 über SSH wieder.

apt-get install xauth

VPN-Anbindung eines Internetservers mit strongSwan 4.2

Bei mir kommt es immer häufiger vor, dass ein Webserver Zugriff auf sensible Dienste eines Servers im internen Netzwerk erhalten soll. Um diesen Zugriff so sicher wie möglich zu gestallten, sollte die dazu notwendige Netzwerkverbindung verschlüsselt werden. Also muss eine VPN-Verbindung her.

Bei Linux-Servern kann man diese Verbindung ganz einfach mit der Software strongSwan einrichten. Bei den meisten Linux-Distributionen ist das dazu nötige Paket enthalten und schnell installiert. Bei Ubuntu 12.04 geht dies z.B. ganz einfach mit dem folgenden Befehl:

sudo apt-get install strongswan

Um die software einzurichten ist noch ein geheimes Kennwort für den Verbindungsaufbau und eine Konfiguration für die VPN-Verbindung notwendig. Das Kennwort wird in der Datei /etc/ipsec.secrets festgelegt. Wenn der Internetserver die IP 144.133.122.111 und die Firewall des internen Netzwerkes die IP 143.132.121.110 hat, müsste die Datei die folgende Zeile beinhalten (das Kennwort sollte natürlich anders sein):

144.133.122.111 143.132.121.110 : PSK 'HierKommtEinGeheimesLangesKennwortHin'

Die Konfiguration der VPN-Verbindung erfolgt in der Datei /etc/ipsec.conf. Für eine Verbindung mit dem Namen InternesNetzwerk kommt der folgende Abschnitt in die Datei:

conn InternesNetzwerk
        left=144.133.122.111
        leftsubnet=144.133.122.111/255.255.255.255
        right=143.132.121.110
        rightsubnet=172.30.4.0/255.255.255.0
        leftid="144.133.122.111"
        rightid="143.132.121.110"
        ike=aes128-sha-modp1536,aes128-sha-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha-modp1536,3des-sha-modp1024,3des-md5-modp1536,3des-md5-modp1024
        esp=aes128-sha1,aes128-md5,3des-sha1,3des-md5
        ikelifetime=1h
        keylife=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        pfs=yes
        authby=secret
        auto=start
	keyexchange="ikev1"

Bei der Verbindung werden die zuvor schon genannten IP-Adressen von Webserver und Firewall verwendet. Ferner ist ein interner IP-Bereich 172.30.4.0/24 für das interne Netzwerk konfiguriert. Für die IPSec Verbindung wurde IKE in der Version 1, Dead Peer Detektion, Perfect Forward Seurity und einige andere übliche Einstellungen gesetzt. All diese Einstellungen müssen natürlich den jeweiligen Gegebenheiten angepasst werden. Außerdem müssen die IPSec Parameter denen der Firewall entsprechen.

Wenn auch die Firewall auf der Gegenseite eingerichtet ist, lässt sich die Konfiguration durch einen Neustart von strongSwan bzw. IPSec aktivieren.

sudo /etc/init.d/ipsec restart

Danach kann man sich mit dem Befehl

sudo ip xfrm state

oder dem Befehl

sudo ip xfrm policy

anzeigen lassen, ob ein Tunnel zustande gekommen ist. Eventuelle Fehlermeldungen sind wie immer in der Datei /var/log/syslog zu finden. Wenn man die letzen 50 Zeilen anzeigen lassen möchte also einfach den folgenden Befehlt eingeben:

tail /var/log/syslog -n 50

Windows Ereignis-ID 50: Time-Service Zeitdifferenz von mehr als 5000

Wenn ein Windows-Server eine Zeitdifferenz von mehr als 5000 auf 900 Sekunden feststellt, wird die Synchronisation der Systemzeit angehalten und der Server gibt selber keine Zeiten mehr raus. Dies kann z.B. durch eine schlechte Netzwerkanbindung oder eine defekte Hardwareuhr kommen. Um in diesem Fall die Synchronisation wieder zu aktivieren, gibt man auf der Kommandozeile den folgenden Befehl ein:

W32TM /resync

Ob die Zeit wieder synchronisiert wird kann man sich dann mit dem folgenden Befehl anschauen:

W32TM /query /status

Statische, interne Route auf einem IPCop Version 2 setzen

Das setzen einer statischen und permanenten Route ist bei dem IPCop etwas kryptisch, da es dafür kein Menü gibt. Deshalb hier mal ein kleines Beispiel. Um das interne Netzwerk 192.168.140.0/24 auf das Gateway 172.30.1.9 zu routen, müssen in die datei /etc/rc.d/rc.event.local die folgenden Zeilen geschrieben werden.

if [ ${1} == "network" -a ${2} == "up" ]; then
    /sbin/ip route add 192.168.140.0/24 via 172.30.1.9
fi

Virtualisierung mit KVM und libvirt unter Ubuntu 10.04

Um eine virtuelle Maschine mit libvirt einzurichten, benötigt man als erstes ein virtuelles Netzwerk. Dazu legt man unter /etc/libvirt/qemu/networks eine XML-Datei an oder editiert die dort bei der Installation angelegte default.xml. Wenn man sich z.B. für das virtuelle Netzwerk 192.168.34.0/24 entschieden hat, könnte diese Datei wie folgt aussehen:

<network>
  <name>subnetz1</name>
  <forward dev='eth0' mode='route'/>
  <bridge name='virbr2' stp='off' forwardDelay='0' />
  <ip address="192.168.34.1" netmask="255.255.255.0" />
</network>

Die fertige XML-Datei wird nach dem speichern und mittels virsh net-define in libvirt bekannt gemacht. Das neue Netzwerk hat in libvirt den Namen subnetz1. Wenn man nur die default.xml editiert hat entfällt dieser natürlich, da dieses Netz bereits bekannt ist.

Nach dem Aufruf von virsh net-autostart subnetz1 ist sichergestellt, dass das Netzwerk auch tatsächlich nach jedem Systemstart sofort verfügbar ist. Mit virsh net-start subnetz1 aktiviert man das Netz von Hand.

Damit die virtuelle Maschine mit der Außenwelt kommunizieren kann, muss jetzt noch IP Forwarding aktiviert werden. Bei Debian/Ubuntu wird das Forwarding in der Datei /etc/sysctl.conf aktiviert. In ihr sollte die folgende Zeile stehen:

net.ipv4.ip_forward=1

Danach kann eine neue virtuelle Maschine angelegt und gestartet werden. Diese muss dann nur noch eine freie IP-Adresse aus dem virtuellen Netzwerk bekommen und kann danach gestartet werden.

1-wire Wetterstation (Teil 3: Anzeige)

Nachdem man sich eine 1-wire Wetterstation nach dem Artikel 1-wire Wetterstation (Teil 1: Installation) gebaut und die Daten wie im Artikel 1-wire Wetterstation (Teil 2: Datenbank) beschrieben in einer MySQL Tabelle speichert möchte man die gesammelten Werte natürlich auch angezeigt bekommen.

Um möglichst einfach die gemessenen Werte der Wetterstation in einer Webseite anzuzeigen, habe ich die jpgraph verwendet. Diese Software darf für private Zwecke kostenlos verwendet werden. Da sie ansonsten Geld kostet ist sie nicht im Repository zu finden. Man kann sie aber unter der URL http://jpgraph.net/download runterladen. Ich habe mir von dort die aktuelle Version 3.07 geholt und in das Verzeichnis /usr/share/jpgraph3 entpackt. Danach benötigt man noch das Paket php5-gd. Diese ist im Repository enthalten und kann mit dem folgenden Befehl installiert werden.

apt-get install php5-gd

Um aus den gesammelten Wetterdaten eine Grafik mit den Werten des letzten Tages erstellen zu lassen, habe ich das Verzeichnis /var/www/grafiken angelegt und das folgenden PHP-Programm geschrieben, welches die Grafiken aus erzeugt.

<?php
//****************************************************************************
//Darstellung von Temperatur und Feuchtigkeit der letzten 24 Stunden als Graph
//14.02.2011 Kristian Purrucker
//****************************************************************************
 
include ("/usr/share/jpgraph3/jpgraph.php");
include ("/usr/share/jpgraph3/jpgraph_line.php");
include ("/usr/share/jpgraph3/jpgraph_mgraph.php");
include ("/usr/share/jpgraph3/jpgraph_date.php");
 
$DatabaseHost = "localhost";
$DatabaseUser = "root";
$DatabasePassword = "asdfgh";
$Database = "wetterstation";
$Table = "daten_min";
 
$fileName = "/var/www/grafiken/graph_daily.png";
 
//Datenbankanbindung
//******************
$DatabasePointer = mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword) or die ("Keine Verbindung moeglich");
mysql_select_db($Database, $DatabasePointer) or die ("Die Datenbank existiert nicht");
 
 
//Auslesen der letzten 1440 Zeilen (= Tag) aus der Datenbank
//**********************************************************
$ResultPointer = mysql_query("SELECT zeitstempel, temp_clara, humidity_clara, temp_simon, humidity_simon FROM $Table ORDER BY zeitstempel DESC LIMIT 1440");
 
$temp_clara_average = "";
$temp_simon_average = "";
$humidity_clara_average = "";
$humidity_simon_average = "";
 
for($i = 0, $Export = ""; $i < mysql_num_rows($ResultPointer); $i++)
{
   $Daten = mysql_fetch_object($ResultPointer);
 
   $temp_clara[] = $Daten->temp_clara;
   $temp_clara_average = $temp_clara_average + $Daten->temp_clara;
   $temp_simon[] = $Daten->temp_simon;
   $temp_simon_average = $temp_simon_average + $Daten->temp_simon;
   $humidity_clara[] = $Daten->humidity_clara;
   $humidity_clara_average = $humidity_clara_average + $Daten->humidity_clara;
   $humidity_simon[] = $Daten->humidity_simon;
   $humidity_simon_average = $humidity_simon_average + $Daten->humidity_simon;
   $xdata[] = $Daten->zeitstempel;
}
 
$temp_clara_average = round(($temp_clara_average = $temp_clara_average / 1440), 4);
$humidity_clara_average = round(($humidity_clara_average = $humidity_clara_average / 1440), 4);
$temp_simon_average = round(($temp_simon_average = $temp_simon_average / 1440), 4);
$humidity_simon_average = round(($humidity_simon_average = $humidity_simon_average / 1440), 4);
 
 
//Funktion zur Konvertierung des TimeStamp in Minuten und Sekunden
//****************************************************************
function  TimeCallback( $aVal) {
    #return Date ('H:i:s d.m Y',$aVal);
    return Date ('H:i',$aVal);
}
 
 
//Erzeugung eines Graphen fuer Claras Zimmer
//******************************************
$graph = new Graph(700,200,"auto");
$graph->SetScale('datint',"auto","auto","auto","auto");
$graph->SetY2Scale('int',"auto","auto");
$lineplot_temp_clara=new LinePlot($temp_clara, $xdata);
$lineplot_humidity_clara=new LinePlot($humidity_clara, $xdata);
 
// Grafik Formatieren
$graph->img->SetMargin(50,50,20,60);
$graph->SetColor("#000000");
$graph->SetMarginColor("#333333");
$graph->SetShadow();
 
//Titel
$graph->title->Set("Claras Zimmer");
$graph->title->SetColor("#CCCCCC");
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->subtitle->Set("Aktuell: $temp_clara[0] C / $humidity_clara[0]%   Durchschnittlich: $temp_clara_average C / $humidity_clara_average%");
$graph->subtitle->SetColor("#CCCCCC");
 
//Legende
$graph->legend->Pos(0.50,0.95,"center","bottom");
$graph->legend->SetLayout(LEGEND_HOR);
$graph->legend->SetShadow(false);
$lineplot_temp_clara->SetLegend("Lufttemperatur (C) ");
$lineplot_humidity_clara->SetLegend("Luftfeuchtigkeit ");
 
//X-Achse
$graph->xaxis->SetColor("#CCCCCC");
$graph->xaxis->title->Set("Zeit");
$graph->xaxis->SetLabelFormatCallback('TimeCallback');
$graph->xaxis->title->SetColor("#CCCCCC");
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
 
//Y-Achse
$graph->yaxis->SetColor("#FF7777");
$graph->y2axis->SetColor("#1111ee");
$graph->yaxis->title->Set("Grad Celsius");
$graph->y2axis->title->Set("% Luftfeuchtigkeit");
$graph->yaxis->title->SetColor("#CCCCCC");
$graph->y2axis->title->SetColor("#CCCCCC");
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->y2axis->title->SetFont(FF_FONT1,FS_BOLD);
 
//Linie 1
$lineplot_temp_clara->SetColor("#FF8888");
$lineplot_temp_clara->SetFillColor("#EE0000@0.6");
$lineplot_temp_clara->SetWeight(1);
 
//Linie 2
$lineplot_humidity_clara->SetColor("#8888ff");
$lineplot_humidity_clara->SetFillColor("#2222DD@0.6");
$lineplot_humidity_clara->SetWeight(1);
 
// Die Linien zu der Grafik hinzufügen
$graph->Add($lineplot_temp_clara);
$graph->AddY2($lineplot_humidity_clara);
 
//Erzeugung eines Graphen fuer Simons Zimmer
//******************************************
$graph2 = new Graph(700,200,"auto");
$graph2->SetScale('datint',"auto","auto","auto","auto");
$graph2->SetY2Scale('int',"auto","auto");
$lineplot_temp_simon=new LinePlot($temp_simon, $xdata);
$lineplot_humidity_simon=new LinePlot($humidity_simon, $xdata);
 
// Grafik Formatieren
$graph2->img->SetMargin(50,50,20,60);
$graph2->SetColor("#000000");
$graph2->SetMarginColor("#333333");
$graph2->SetShadow();
 
//Titel
$graph2->title->Set("Simons Zimmer");
$graph2->title->SetColor("#CCCCCC");
$graph2->title->SetFont(FF_FONT2,FS_BOLD);
$graph2->subtitle->Set("Aktuell: $temp_simon[0] C / $humidity_simon[0]%   Durchschnittlich: $temp_simon_average C / $humidity_simon_average%");
$graph2->subtitle->SetColor("#CCCCCC");
 
//Legende
$graph2->legend->Pos(0.50,0.95,"center","bottom");
$graph2->legend->SetLayout(LEGEND_HOR);
$graph2->legend->SetShadow(false);
$lineplot_temp_simon->SetLegend("Lufttemperatur (C) ");
$lineplot_humidity_simon->SetLegend("Luftfeuchtigkeit ");
 
//X-Achse
$graph2->xaxis->SetColor("#CCCCCC");
$graph2->xaxis->title->Set("Zeit");
$graph2->xaxis->SetLabelFormatCallback('TimeCallback');
$graph2->xaxis->title->SetColor("#CCCCCC");
$graph2->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
 
//Y-Achse
$graph2->yaxis->SetColor("#FF7777");
$graph2->y2axis->SetColor("#1111ee");
$graph2->yaxis->title->Set("Grad Celsius");
$graph2->y2axis->title->Set("% Luftfeuchtigkeit");
$graph2->yaxis->title->SetColor("#CCCCCC");
$graph2->y2axis->title->SetColor("#CCCCCC");
$graph2->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph2->y2axis->title->SetFont(FF_FONT1,FS_BOLD);
 
//Linie 1
$lineplot_temp_simon->SetColor("#FF8888");
$lineplot_temp_simon->SetFillColor("#EE0000@0.6");
$lineplot_temp_simon->SetWeight(1);
 
//Linie 2
$lineplot_humidity_simon->SetColor("#8888ff");
$lineplot_humidity_simon->SetFillColor("#2222DD@0.6");
$lineplot_humidity_simon->SetWeight(1);
 
// Die Linien zu der Grafik hinzufügen
$graph2->Add($lineplot_temp_simon);
$graph2->AddY2($lineplot_humidity_simon);
 
//Graphen zusammen bauen
//**********************
$mgraph = new MGraph(700,400,"auto");
$mgraph->SetMargin(2,2,2,2);
$mgraph->Add($graph,0,0);
$mgraph->Add($graph2,0,200);
$mgraph->Stroke($fileName);
?>

Anschließend habe ich zum anzeigen der Grafiken die folgende, einfache HTML-Seite geschrieben und in das Verzeichnis /var/www gelegt.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Herzlich Willkommen bei preetz.dnsalias.net!</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="shortcut icon" href="/favicon.ico" />
    <meta name="robots" content="noindex" />
        <style type="text/css"><!--
    body {
        color: #444444;
        background-color: #EEEEEE;
        font-family: 'Trebuchet MS', sans-serif;
        font-size: 80%;
    }
    h1 {}
    h2 {
        font-size: 1.2em;
        text-align: center;
    }
    p.center { text-align: center; }
    #page{
        background-color: #FFFFFF;
        width: 60%;
        margin: 24px auto;
        padding: 12px;
    }
    #header{
        padding: 6px ;
        text-align: center;
    }
    .header{ background-color: #997; color: #FFFFFF; }
    #content {
        padding: 4px 0 24px 0;
    }
    #footer {
        color:#666666;
        background: #f9f9f9;
        padding: 10px 20px;
        border-top: 5px #efefef solid;
        font-size: 0.8em;
        text-align: center;
    }
    #footer a {
        color: #999999;
    }
    --></style>
</head>
<body>
    <div id="page">
        <div id="header" class="header">
            <h1>Herzlich Willkommen bei <!--ADRESSE//-->preetz.dnsalias.net!<!--ADRESSE//--></h1>
        </div>
        <div id="content">
            <h2>Hier finden Sie die aktuellen Wetterdaten aus Preetz</h2>
            <p class="center"><img src="grafiken/graph_daily.png" alt="Daily Graph"></p>
        </div>
        <div id="footer">
            <p>Powered by <a href="http://www.isilife.de">Isilife GbR</a></p>
        </div>
    </div>
</body>
</html>

Das Ergebnis sieht dann ungefähr so aus:

1-wire Wetterstation (Teil 2: Datenbank)

Nachdem man sich eine 1-wire Wetterstation nach dem Artikel 1-wire Wetterstation (Teil 1: Installation) gebaut hat, ist es sinnvoll die gesammelten Daten in einer Datenbank zu speichern. Dazu habe ich mir eine MySQL-Datenbank angelegt.

mysql -u root -p
CREATE DATABASE wetterstation;
quit

In der Datenbank wird danach noch eine Tabelle für die Werte der 1-wire Sensoren benötigt. Da ich pro Minute einen Wert festhalten will habe ich diese daten_min genannt.

mysql -u root -p
connect wetterstation; 
CREATE TABLE daten_min ( 
zeitstempel int UNSIGNED, 
temp_clara FLOAT(7,4) NOT NULL, 
humidity_clara FLOAT(7,4) NOT NULL, 
temp_simon FLOAT(7,4) NOT NULL, 
humidity_simon FLOAT(7,4) NOT NULL, 
PRIMARY KEY (`zeitstempel`));
quit

Zum Schluss habe ich mir dann noch ein PHP-Programm geschrieben, dass die Werte der Sensoren abfragt und in die Tabelle schreibt. Dieses habe ich in der Datei /usr/local/sbin/datensammeln.php gespeichert.

<?php
$DatabaseHost = "localhost";
$DatabaseUser = "root";
$DatabasePassword = "geheim";
$Database = "wetterstation";
$Table = "daten_min";
 
// Aktuelle UNIX-Zeit abfagen
date_default_timezone_set("Europe/Berlin");
$zeitstempel = date("U");
 
// ##### Werte der Sensoren abfragen #####
// Claras Zimmer
$temp_clara = file_get_contents("/var/1wire/26.7ECCCF000000/temperature");
$humidity_clara = file_get_contents("/var/1wire/26.7ECCCF000000/humidity");
 
// Simons Zimmer
$temp_simon = file_get_contents("/var/1wire/26.A0AECF000000/temperature");
$humidity_simon = file_get_contents("/var/1wire/26.A0AECF000000/humidity");
 
// ##### Daten in die Datenbank schreiben #####
$DatabasePointer = mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword) or die ("Keine Verbindung moeglich");
mysql_select_db($Database, $DatabasePointer) or die ("Die Datenbank existiert nicht");
$ResultPointer = mysql_query("INSERT INTO $Table (
     zeitstempel, temp_clara, humidity_clara, temp_simon, humidity_simon
   ) VALUES (
     '$zeitstempel', '$temp_clara', '$humidity_clara', '$temp_simon', '$humidity_simon'
   )");
?>

Damit man php in der Shell laufen lassen kann wird übrigens das Paket php5-cli benötigt. Dieses kann man mit dem folgenden Befehl installieren

apt-get install php-cli

Zum Schluss habe ich einen Cronjob angelegt, der alle 60 Sekunden das PHP-Script ausführt.

Ubuntu: WLAN beim booten automatisch starten

Bei Ubuntu wird das WLAN-Interface normaler Weise über den Networkmanager gestartet. Dies bedeutet, dass man sich mit einem Benutzer an der grafischen Oberfläche anmelden muss, damit sich das WLAN aktiviert. Bei Servern und anderen Gräten ohne grafische Oberfläche möchte man aber oft sofort nach dem Booten ein funktionierendes WLAN. In diesem Fall sollte man wpa_supplicant installieren und konfigurieren. Eine Anleitung dazu findet man auf der Webseite wiki.ubuntuusers.de.

Ubuntu als Router verwenden

Bei einer Standard-Installation von Ubuntu ist das Routing bzw. IP-Forwarding deaktiviert. Das IP-Forwarding kann aber mit dem folgenden Befehl temporär aktiviert werden:

sudo sysctl -w net.ipv4.ip_forward=1

Wenn man es dauerhaft einschalten möchte muss in der Datei /etc/sysctl.conf die Variable net.ipv4.ip_forward auf 1 gesetzt werden. Die Zeile sollte dann wie folgt aussehen:

net.ipv4.ip_forward=1