This section explains how to configure networking in a very pleasant way, so that it works automatically wherever you go. This solution has been inspired by a tutorial that can be found in the references section at the bottom of this page. It uses three tools that integrate well with the debian network configuration:

  • wpa_supplicant, which handles wireless access point association,
  • ifplugd that checks for an ethernet cable to be plugged,
  • guessnet that gives you tools to detect which network you are connected to.
  • resolvconf to understand name server configuration in /etc/network/interfaces.

First, some installation :

# aptitude install wpasupplicant ifplugd guessnet resolvconf

The next steps consist mostly in editing a bunch of files. To configure all this, my advice is to turn networking off :

# ifdown eth0
# ifdown eth1
# /etc/init.d/ifplugd stop

Physical layer

/etc/wpa_supplicant.conf :

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0

eapol_version=1
ap_scan=1
fast_reauth=1

network={
    ssid="your_case_sensitive_ssid"
      id_str="home"
    psk="your_passphrase"

    priority=5
}

# Connect to any public open access point
network={
    ssid=""
    key_mgmt=NONE
    priority=0
}

The id_str configuration parameter is used to know which configuration to use in /etc/network/interfaces (see next paragraph). Networks that do not have this parameter use the default configuration.

You may add any number of networks to fit your needs.

Transport, network and application layers

/etc/network/interfaces is the central repository of the network configuration in Debian.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The wireless interface
auto eth1
iface eth1 inet manual
      wpa-driver wext
      wpa-roam /etc/wpa_supplicant.conf

# The Ethernet is mapped depending on the environment
mapping eth0
    script guessnet-ifupdown
    map default: default
    map timeout: 3
    map verbose: true

iface home inet static
    address 192.168.51.6
    netmask 255.255.255.224
    broadcast 192.168.51.31
    gateway 192.168.51.1
    dns-search subdomain.org
    dns-nameservers 192.168.1.2
    test peer address 192.168.51.1 mac 00:01:23:45:67:89
    up /etc/init.d/samba start
    down /etc/init.d/samba stop

# This interface is to catch unidentified Wireless networks
# and is of course the default map for eth0
iface default inet dhcp

The choice of the wext driver depends on your Wireless adapter. Mine is an ipw2200 and uses the Linux Wireless extensions, thus I use wext.

This basically tells eth0 or eth1 to be configured differently whether a host with address 192.168.51.1 and mac 00:01:23:45:67:89 is found or not. If it is there, take a static ip address and start samba. If not, revert to dhcp.

A little tip for the samba example : for samba not to start while booting, just run :

# update-rc.d samba stop 0 1 2 3 4 5 6 .

Ensure your have the desired ip address :

# ifup eth1
# ifconfig

This setup works well for me.

FIXME There should be a priority to the Ethernet interface, et the wireless interface should go down while a network wable is plugged in. A debian bug has been filled on the subject. Here are possible solutions :

  • Have the Ethernet ifplugd instance control the wireless instance. Drawback : this is hackish.
  • Use ifmetric to route traffic through Ethernet if available. Drawbacks : wireless is up for no reason and if wireless gets associated after the Ethernet cable is plugged, DNS settings are overwritten, which can be annoying if they are different.
  • Use the new wpa_supplicant feature to manage the Ethernet. Not sure I red well on this…

For now, before I plug to a wired network, I just use the kill switch feature of my laptop to turn wireless off.

References