Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Dinamička konfiguracija mreže na Linux-u…

Dinamička konfiguracija mreže na Linux-u…



... ili kako podržati dinamičku IPv4 mrežnu konfiguraciju na Linux host–u sa više interfejsa (bez korišćenja NetworkManager-a) .

Uvod



Vaš laptop (očigledno sa Linux-om) ima mnogo interfejsa, koje možete koristiti za IPv4 povezivanje: eternet, wifi, 3G, bluetooth, USB, firewire (standard za priključenje vise perifernih uređaja na jedan računar) ... Čak i ako želite da stvari rade izvan kutije, tj. kada priključite eternet kabl za spajanje vašeg računara ili ste u poznatoj WiFi mreži, ovo često nije slučaj. Ova stranica razmatra zašto je to tako (tj. probleme) i nudi neke alate i konfiguracione opcije (kao rešenja).

Višestruke podrazumevane rute


Linux ne dozvoljava da se istovremeno konfiguriše više podrazumevanih IPv4 ruta (sa istom težinom). Obično se (kod dinamičke konfiguracije), proces (ppp - Point-to-Point Protocol daemon, dhcp- Dynamic Host Configuration Protocol client, ...) završava instaliranjem podrazumevane (default) putanje za konfigurisanje. Ukoliko drugi proces pokušava da učini to isto (npr. DHCP daemon) za drugi interfejs, obično ne uspeva da instalira novu putanju. Neka druga aplikacija može imati logiku da zameni (ili ne) postojeće default putanje (pppd).

U svim slučajevima, kada se više IPv4 automatski konfigurisanih interfejsa na Linux host-u podižu u isto vreme, ostaje aktivna samo jedna podrazumevana ruta. Po pravilu, rezultat je nedefinisana mrežna konfiguracija.

Reagovanje na gubitke prenosa


U zavisnosti od raspodele koju koristite, izabranih alata, vaših navika i specifičnih konfiguracija, moguće su velike razlike u vezi sa IPv4 autokonfiguracijom vaših interfejsa. Podrazumeva se da većina DHCP klijenata startuje ručno (preko CLI ili GUI) ili započinju rad na datom interfejsu. Oni zgrabe parameter sa DHCP server-a i konfigurišu adresu i podrazumevanu putanju (rutu). Zatim, s vremena na vreme obnavljaju svoj zakup.

Obično se pri prekidu veza (isključenje kabla, gubici u prenosu signala, resetovanje na AP … ) na pripadajućem interfejsu, ništa se ne dešava, tj. ne poništava se konfigurisana adresa i putanja. Ukoliko se interfejs potom priključi na drugu mrežu (promena L2 subnet), ponovo se koristi prethodno konfigurisana putanja i adresa. Ovo zahteva manuelnu intervenciju (ifup eth0; ifdown eth0). Druga mogućnost je oslanjanje na globalnu konfiguraciju interfejsa i pratećih alata za definisanje neke smernice u takvom slučaju: mnoge distribucije za klijentske uređaje dolaze sa NetworkManager-om.

Ako ne pravite fensi grafičke programe, stvari se mogu učiniti dinamičnijim, korišćenjem npr. netplug-a i vrlo jednostavnog koda. O ovome će biti reči kasnije , na ovoj stranici.

Slabi host model


Linux implementira slab host model: čak i ako je na datom interfejsu konfigurisana adresa, ovo ne garantuje da će paketi, generisani na host-u sa tom izvornom adresom, napustiti računar preko tog interfejsa. Jednostavno rečeno, odredišna IP adresa paketa je glavni ključ za selekciju najbolje raspoložive rute (mrežnog prolaza, interfejsa) iz routing tabele. U jakom host modelu bi se i odredišna IP adresa i izvorna IP adresa koristile za izbor najbolje putanje.

Ukoliko ste zainteresovani za detalje, više informacija možete naći na RFC1122 i u članku Cable Guy . Za IPv6, ovo je drugačije ,a referentni document na ovu temu je RFC3484.

Konfiguracija


U ovom odeljku ćemo razmotriti potrebne alate i konfiguracije za podršku dinamičkog rada mobilnih čvorova:
  • kretanje iz mreže u mrežu
  • korišćenje različitih mrežnih interfejsa istovremeno

Cilj Linux distribucije je Debian (operativni system za slobodno korišćenje), ali se ovo verovatno direktno odnosi i na Ubuntu operativni system. Alati koji se koriste su:
  • dhcpcd: koristi se kao dhcp klijent. Izabran zbog svoje jednostavnosti, sposobnosti konfiguracije prema interfejsu i konfiguracije metrike za instalirane rute ...
  • netplug: koristi se za nadgledanje Netlink Link događaja u vezi sa interfejsima (link up, link down) i preduzimanje akcija na osnovu tih događaja (start dhcp klijent, stop dhcp klijent ...).
  • wpa_supplicant: koristi se u roaming modu za automatsko povezivanje sa 802.11 mrežama. Izabran za podršku prioriteta i moguću integraciju sa /etc/network/interfaces preko id_str parametra. Više o ovom kasnije.
  • ip: iz iproute2 paketa se koristi u različitim programima (kodovima).


Da budemo jasniji, navodimo konkretne slučajeve korišćenja :
  • automatski start DHCP klijenta kada se podiže interfejs (link i administrativni iskaz)
  • automatsko uklanjanje adrese/rute kada se zatvara interfejs (link ili administrativni iskaz)
  • podrška za više istovremenih default ruta prema različitim težinama (tj. metrici) .
  • izbor najbolje raspoložive 802.11 mreže prema zadatom podešavanju i uz korišćenje prioriteta, ...


Jednostavno rečeno, kada 802.11 mreža postane dostupna i kada je 802.11 interfejs prijavljen od strane administratora , autokonfiguracija attachment-a i IPv4 adrese bi trebalo da bude automatska. Kada se kabl poveže na eternet interfejs (podignut administrativno i raspoloživ sa w/ link), želimo da se automatski konfiguriše adresa. Kada smo povezani sa više mreža, želimo da sve default rute budu raspoložive preko najboljeg interfejsa, koji ima najviši prioritet (u redosledu ethernet, wifi i 3G).

Konfigurisanje dhcpcd


DHCPCD je DHCP klijent. On je podržan preko interfejs konfiguracije i ima sposobnost da instalira rute sa različitim metrikama. Barem na Debian-u, 4 fajla su uključena u konfiguraciju DHCPCD:
  • /sbin/dhcpcd-bin: daemon binarni kod, koji se u stvari nikad ne poziva direktno. Svi pozivi se vrše preko /sbin/dhcpcd programskog okruženja. Programski kod se koristi kako bi se prosledio argument binarnom kodu preko linijske komande, pošto ovaj sam po sebi ne podržava čitanje konfiguracionog fajla. Nema mnogo toga da se kaže za dhcpcd-bin , ali je korisno znati da on postoji.
  • /sbin/dhcpcd: kada se koristi ifup , ovaj spoljni program se poziva preko komandne linije sa ograničenim brojem opcija , koje uključuju i interfejs. Program čita informacije iz konfiguracionog fajla (/etc/default/dhcpcd) i prosleđuje ih prema dhcpcd-bin
  • /etc/default/dhcpcd: jednostavan spoljni programski fragment (shell script), koji potiče od /sbin/dhcpcd i pruža konfiguracione informacije za interfejse. Jedan, koji ja koristim je dat dole.
  • /etc/dhcpcd.sh: možda ćete želeti da ga koristite za fino podešavanje ponašanja DHCPCD. Ja ga ne koristim.


Sadržaj mog /etc/default/dhcpcd je ispod. Imajte na umu da njegov sadržaj sprečava konfigurisanje DNS servera. Ovo je u mom slučaju namerno, ali vi ćete verovatno poželeti i drugačije ponašanje.

SET_DNS='no'
SET_DOMAIN='no'
SET_HOSTNAME='no'
SET_NTP='no'
SET_YP='no'

case ${INTERFACE} in
eth0) # Ethernet
OPTIONS="-h spooky -i stealth --metric 1 --noipv4ll"
;;

wlan0) # 802.11
OPTIONS="-h spooky -i stealth --metric 2 --noipv4ll"
;;

wwan0) # 3G
OPTIONS="-h spooky -i stealth --metric 3 --noipv4ll"
;;

*)
;;

esac


Sve opcije , koje donose SET_* promenljive su zajedničke svim interfejsima. Jedino razlika u OPTIONS vrednosti za različite interfejse je metrika instaliranih ruta: eth0 je u prednosti u odnosu na wlan0 , koji je u prednosti u odnosu na wwan0 .


Predlažem vam da pogledate man 8 dhcpcd-bin za više detalja o tome šta podržava daemon. Imajte na umu da trenutna verzija (u vreme pisanja ovog teksta) /sbin/dhcpcd programa ima grešaka u načinu na koji se bavi setom opcija (loša upotreba dvostrukih navodnika). Uoničajeno , ne verujte vašoj konfiguraciji i proverite šta daemon stvarno radi u praksi.

Kao što ćemo uskoro videti, za razliku od onog što se uobičajeno radi na Debian sistemima, pozivi dhcpcd nikada neće biti vršeni manuelno ili markiranjem sa "inet dhcp" u /etc/network/interfaces primeru. Svi naši pozivi dhcpcd biće preko netplug, bilo da se startuje servis prilikom uspostavljanja veze ili se prekida servis prilikom gubitka signal ili se interfejs administrativno otkaže.

Konfigurisanje netplug


netplug je mrežni link koji prati daemon. On obrađuje informacije o link događajima, koje obezbeđuje Linux kernel preko Netlink-a i omogućava korisnicima da konfigurišu akcije u vezi sa tim događajima. Jednostavno rečeno, ovo omogućava dinamičko konfigurisanje (pomoću jednostavnih programa) u trenutku kada se kabl priključi/isključi ili se uspostavi veza na WiFi mreži.

Na Debian-u, netplug konfiguracija se vrši preko /etc/netplug/netplugd.conf konfiguracionog fajla i prilagođavanjem /etc/netplug/netplug koda. Kreator (former) se jednostavno puni sa listom interfejsa, koje treba razmotriti. Ovo drugo je jednostavan shell program, koji se poziva svaki put kada se desi interesantan događaj (u vezi sa prethodnim interfejsom).

Na mom laptopu, želim da netplug prati moja tri glavna interfejsa: eth0 (Ethernet interface),wlan0 (802.11 interface), wwan0 (3G interface). netplug konfiguracioni fajl se popunjava sa ovom listom:

$ cat /etc/netplug/netplugd.conf
eth0
wlan0
wwan0


Sada kada smo konfigurisali netplug da prati prethodne interfejse, potrebno je da konfigurišemo reakciju na događaje , koji se pojavljuje na tim interfejsima (link up/down). To se radi prilagođavanjem /etc/netplu/netplu koda. Ispod je modifikovana verzija, koju ja koristim.

PATH=/usr/bin:/bin:/usr/sbin:/sbin
export PATH

dev="$1"
action="$2"

case "$action" in
in)
    FILE="/var/run/dhcpcd-${dev}.pid"
    if ! [ -r $FILE ]; then
        exec dhcpcd ${dev} 2>&1
    fi
    ;;
out)
    FILE="/var/run/dhcpcd-${dev}.pid"
    if [ -r $FILE ]; then
        exec kill -INT `cat $FILE` 2>&1
    fi
    ;;
*)
    exit 0
    ;;
esac


Za određeni uređaj (eth0, wlan0 i wwan0 interfejsi podržavaju DHCP) se jednostavno stvara instance (ukoliko već nije pokrenuta) dhcpcd za in događaj (priključenje kabla ili uspostavljenje veze) ili zaustavlja rad dhcpcd instance za out događaj (isključenje kabla ili prekid veze). Imajte na umu da ja ne koristim probe događaj u mom programu (da znate postoji).

Prilikom prijema INT signala poslatog preko kill, dhcpcd uklanja konfigurisanu adresu i rutu.

Za više detalja predlažem da pogledate na man 8 netplugd.

Konfigurisanje wpa_supplicant



wpa_supplicant je Linux 802.1X supplicant (podržava sve vrste EAP protokola) za WiFi (WPA/WPA2) i žičane mreže. Ima mnogo funkcija i može se koristiti za automatsko upravljanje svim vrstama 802.11 mreža. Npr. kada se jednom konfiguriše i startuje, može se automatski povezati na željenu, a raspoloživu mrežu.

Prva stvar , koju treba da uradite, je da ispišete wpa_supplicant konfiguracioni fajl sa informacija o različitim WiFi mrežama , koje koristite. Ovde je izvod iz mog /etc/wpa_supplicant/wpa_supplicant_wifi.conf fajla (Poseban ekvivalent imam za moje eternet mreže /etc/wpa_supplicant/wpa_supplicant_wifi.conf)

...

network={
      ssid="open"
      key_mgmt=NONE
      id_str="open"
      priority=3 
}
network={
        ssid="secure"
        key_mgmt=WPA-EAP
        proto=WPA2
        group=CCMP
        pairwise=CCMP
        eap=TLS
        ca_cert="/etc/certs/cacert.pem"
        client_cert="/etc/certs/client.pem"
        private_key="/etc/certs/client.key"
        private_key_passwd="somepwd"
        identity="me"
        priority=5
}
network={
        ssid="AndroidAP"
        key_mgmt=WPA-PSK
        proto=WPA2
        pairwise=CCMP
        group=CCMP
        psk="SomeP4ssw0rd"
        priority=4
}
network={
        ssid="Spooky"
        key_mgmt=NONE
        group=WEP104
        psk="A4ABC2FC27412D4D23CAEBCA23"
        priority=2
}
network={
        ssid="another"
        key_mgmt=WPA-PSK
        proto=WPA2
        pairwise=CCMP
        group=CCMP
        psk="A very long and secret passphrase here"
        priority=1
}


Važni delovi za ono što želimo da uradimo su obojeni u crveno . To su priority i id_str konfiguracioni parametri:
  • priority: kada je raspoloživo više mreža istovremeno, bira se ona sa najvišim prioritetom.
  • id_str: za svaku mrežu možete dodeliti određenu vrednost ovom parametru (string). Ako se ona ne navede koristi se "default" kao tekst string. Ovaj string se koristi u /etc/network/interfaces kao virtuelni interfejs identifikator. To omogućava kreiranje posebnih konfiguracionih blokova za svaku mrežu. Jedini uslov je da imate fizički interfejs, koji koristi "inet manual" metod (ovo je OBAVEZNO).


Ispod je primer /etc/network/interfaces povezan sa prethodnim /etc/wpa_supplicant/wpa_supplicant_wifi.conf:

auto wlan0
iface wlan0 inet manual
      pre-up ip link set dev wlan0 up || true
      wpa-roam /etc/wpa_supplicant/wpa_supplicant_wifi.conf
      wpa-driver wext
      pre-down /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true
      post-down ip link set dev wlan0 down || true

# open is specific (IPv6 only) so I just stop dhcp via netplug
iface open inet manual
      up   /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true
iface default inet manual
      up   /etc/netplug/netplug wlan0 in  >/dev/null 2>&1 || true
      down /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true


Sve 802.11 mreže, koje koristim se mapiraju prema "default" id_str (parametar se ne navodi u konfiguraciji) osim mreže sa SSID "open", koja se mapira na "open" konfiguracioni ulaz za virtuelni interfejs. Pošto je ova mreža uvek IPv6 , nema potrebe za start dhcp servera kada se na njega povezujemo.

Detaljnije ćemo razmotriti druge elemente /etc/network/interfaces u narednom odeljku.



Šta staviti u /etc/network/interfaces


Ovde je sadržaj mog /etc/network/interfaces

auto eth0
iface eth0 inet6 manual
    pre-up ip link set dev eth0 up || true
    wpa-iface eth0
    wpa-driver wired
    wpa-conf /etc/wpa_supplicant/wpa_supplicant_wired.conf
    pre-down /etc/netplug/netplug eth0 out >/dev/null 2>&1 || true
    post-down ip link set dev eth0 down || true
auto wlan0
iface wlan0 inet manual
      pre-up ip link set dev wlan0 up || true
      wpa-roam /etc/wpa_supplicant/wpa_supplicant_wifi.conf
      wpa-driver wext
      pre-down /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true
      post-down ip link set dev wlan0 down || true
# open is specific (IPv6 only) so I just stop dhcp via netplug
iface open inet manual
      up   /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true

iface default inet manual
      up   /etc/netplug/netplug wlan0 in  >/dev/null 2>&1 || true
      down /etc/netplug/netplug wlan0 out >/dev/null 2>&1 || true
# 3G interface
iface wwan0 inet manual
      pre-up ip link set dev wwan0 up || true
      up /etc/netplug/netplug wwan0 in >/dev/null 2>&1 || true
      down /etc/netplug/netplug wwan0 out >/dev/null 2>&1 || true
      post-down ip link set dev wwan0 down || true


Eternet i 802.11 interfejsi se označavaju sa auto. Ja radije startujem 3G interfejs ručno otkucavanjem neke od AT komandi. Eternet konfiguracija je prilično jednostavna.

Preostala pitanja



Za mene cela postavka odlično funkcioniše. Ali evo preostalih pitanja, za koja do sada nisam imao vremena:
  • Kada koristim s2ram da uspavam moj laptop, WiFi veza se ne prekida i ako se negde restartuje, netplug nikada ne upozorava na promenu (tj. adresa nije uklonjena) sve dok wpa_supplicant ne detektije da wifi mreža nije više raspoloživa. Dosadno ...
  • Kada koristim rfkill prekidač da fizički zaustavim wifi interfejs, pri čemu je on inicijalno podignut i radi , a pri ponovnom podizanju kasnije on ostaje administrativno neprijavljen, tj. treba da ponovim ifup wlan0 ručno. . Dosadno ...


Govorio sam mnogo o adresama i rutama u vezi sa DHCP, ali do sada nije bilo reči o DNS konfiguraciji tj. o ažuriranju /etc/resolv.conf. Razlog je jednostavan pošto imam statičku DNS konfiguraciju: moj laptop uvek deluje kao MIPv6 mobilni čvor, moj DNS server je IPv6 dostupan , a IPv4 se koristi samo preko m6t i to samo da bi obezbedio UMIP pristup mom Home Agent-u sa IPv4 mreža. Dakle, rukovanje sa /etc/resolv.conf je ostalo za vežbu ...





Published (Last edited): 17-12-2012 , source: http://natisbad.org/dyn-net/index.html