Laptop z WiFi, czyli router na szybko

Czasem zachodzi potrzeba, by zmienić laptopa z WiFi w router, który mógłby udostępnić połączenie z Internetem np. innemu komputerowi. Wydawałoby się, że na Linuksie nie ma nic prostszego, a w najgorszym razie wystarczy chwilę poszukać rozwiązania w Sieci. W praktyce może okazać się, że łatwo wpaść w konsternację, widząc mnogość rozwiązań.

Ponieważ dziś na własnej skórze doświadczyłem, jak dużo czasu może zająć konfiguracja tak banalnej rzeczy, postanowiłem podzielić się swoim doświadczeniem. Nie jestem specjalistą od sieci komputerowych, dlatego chętnie przyjmę krytykę i poprawię błędy, jeżeli dostrzeżecie takowe w poniższej instrukcji.

Zatem do dzieła! Zakładamy, że mamy laptopa z WiFi na interfejsie wlan0, który ma udostępnić połączenie internetowe drugiemu komputerowi, podłączonemu na interfejsie eth0 w podsieci 192.168.42.0/24 (tj. 192.168.42.0 z maską 255.255.255.0). Nasz laptop pracuje pod kontrolą Arch Linuksa.

  1. Przygotowanie interfejsów sieciowych.

    Tu napotkałem na pierwszy problem w postaci NetworkManagera. Jest to program, którego z przyjemnością używam na co dzień, ale który doprowadza mnie do białej gorączki, gdy chcę użyć bardziej wymyślnej konfiguracji. Oczywiście, można by go wyłączyć:

    # /etc/rc.d/networkmanager stop

    ale co nam wtedy skonfiguruje automatycznie połączenie? Zostawiamy więc NetworkManagera, licząc się z tym, że przy każdej możliwej okazji będzie nam bruździł, wyłączając eth0. Ja to zaakceptowałem, bo połączenie miało pracować tylko kilka minut. W innym przypadku, wziąłbym się za ręczną konfigurację WiFi.

    Pozostałem jednak przy najprymitywniejszym rozwiązaniu: w konfiguracji NetworkManagera odznaczyłem opcję Łączenie automatyczne we wszystkich połączeniach przewodowych. Bez tego wetknięcie kabla do gniazda wyłączało połączenie radiowe.

    eth0 konfigurujemy ręcznie:

    # ifconfig eth0 up 192.168.42.1 netmask 255.255.255.0
  2. Włączenie serwera DHCP i DNS.

    Wbrew pozorom, jest to bardzo prosta czynność. Instalujemy dnsmasq, a w /etc/dnsmasq.conf wpisujemy dwie opcje:

    interface=eth0
    dhcp-range=192.168.42.2,192.168.42.41,12h

    W razie potrzeby możemy też przypisać sztywne IP wskazanemu MAC-owi lub w ogóle wyłączyć DHCP (co jest mniej wygodne) — osoby zainteresowane znajdą stosowne informacje i przykłady w dokumentacji.

    Teraz musimy tylko uruchomić serwer:

    # /etc/rc.d/dnsmasq start
  3. Uruchomienie routingu.

    Routing można włączyć jednym poleceniem:

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    Niektórzy zalecają jeszcze dodanie linijki

    net.ipv4.ip_forward = 1

    do /etc/sysctl.conf, jest to chyba jednak potrzebne tylko do automatycznego startu routingu po powtórnym uruchomieniu systemu. Nas to nie interesuje, bo na co dzień nie będziemy nic routować.

  4. NAT, czyli maskarada IP.

    Jest to najbardziej skomplikowany krok, wymagający grzebania się w iptables, a niezbędny do tego, by pakiety z Internetu mogły trafiać na odpowiednie IP i porty wewnątrz naszej miniaturowej sieci.

    Tutaj skorzystałem z dokumentacji Gentoo i proponuję poniższe regułki:

    # iptables -F
    # iptables -t nat -F
    # iptables -I FORWARD -i eth0 -d 192.168.42.0/255.255.255.0 -j DROP
    # iptables -A FORWARD -i eth0 -s 192.168.42.0/255.255.255.0 -j ACCEPT
    # iptables -A FORWARD -i eth0 -d 192.168.42.0/255.255.255.0 -j ACCEPT
    # iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

To wszystko, czego potrzebujemy. Oczywiście, ręczne kopiowanie i wklejanie komend w terminalu jest niewygodne, proponuję zatem skorzystać z poniższego skryptu, okraszonego paroma dodatkowymi instrukcjami, zapożyczonymi ze wspomnianej dokumentacji Gentoo. Przyznaję się bez bicia, że rozumiem tylko część z nich, ale ufam, że zwiększają one uniwersalność i bezpieczeństwo naszego routingu.

#!/bin/bash
 
# Włączenie DHCP, DNS, NAT, routingu.
 
# Iptables i routing na podstawie dokumentacji Gentoo.
# http://www.gentoo.org/doc/pl/home-router-howto.xml
 
# Zmienne konfiguracyjne.
LAN="eth0"
WAN="wlan0"
SIEC="192.168.42.0"
MASKA="255.255.255.0"
NASZEIP="192.168.42.1"
 
# Podniesienie interfejsu.
ifconfig ${LAN} up ${NASZEIP} netmask ${MASKA}
 
# Na początek czyścimy regułki:
iptables -F
iptables -t nat -F
 
# Domyślne zasady dla pakietów nie pasujących do żadnej regułki.
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
 
# Potem blokujemy usługi tak, aby były dostępne tylko dla sieci LAN:
iptables -I INPUT 1 -i ${LAN} -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A INPUT -p UDP --dport bootps ! -i ${LAN} -j REJECT
iptables -A INPUT -p UDP --dport domain ! -i ${LAN} -j REJECT
 
# (Opcjonalnie) pozwalamy na dostęp do naszego serwera SSH z Internetu:
#iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT
 
# Upuszczamy pakiety TCP/UDP dla uprzywilejowanych portów:
iptables -A INPUT -p TCP ! -i ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP ! -i ${LAN} -d 0/0 --dport 0:1023 -j DROP
 
# Ostatecznie dodajemy regułki dla NAT (to są najważniejsze regułki!):
iptables -I FORWARD -i ${LAN} -d ${SIEC}/${MASKA} -j DROP
iptables -A FORWARD -i ${LAN} -s ${SIEC}/${MASKA} -j ACCEPT
iptables -A FORWARD -i ${WAN} -d ${SIEC}/${MASKA} -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
 
# Informujemy jądro o chęci przekazywania IP:
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
 
# Uruchomienie DHCP i DNS.
# W /etc/dnsmasq.conf wystarczy:
# interface=eth0 (nasz interfejs lan)
# dhcp-range=192.168.42.2,192.168.42.41,12h (zakres IP dla DHCP)
/etc/rc.d/dnsmasq start

Mam nadzieję, że mój bardzo nieprofesjonalny poradnik mimo wszystko komuś się przyda. Jeżeli nie, to trudno, będzie przynajmniej stanowił rozwiązanie, do którego będę mógł w razie potrzeby wrócić.

Komentarzy: 2 do „Laptop z WiFi, czyli router na szybko“

  1. kszys komentuje:

    czegos takiego szukalem :) dziekuje

    a wiesz moze jak dodac WEP, WPA? albo jakies lepsze zabezpieczenie ?

  2. vmario komentuje:

    Jeżeli chodzi o WEP i WPA od strony wyjścia na świat, to trzeba poklikać w NetworkManagerze albo pogooglać na temat obsługi tych standardów z linii poleceń i dopisać sobie do skryptu.

    Jeżeli zaś chodzi o naszą wewnętrzną sieć, to nie mam pojęcia jak to wygląda — ja udostępniałem łącze tylko przez kabel.

Dodawanie komentarzy

XHTML: Możesz używać tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">