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.
-
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 stopale 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.
eth0konfigurujemy ręcznie:# ifconfig eth0 up 192.168.42.1 netmask 255.255.255.0 -
Włączenie serwera DHCP i DNS.
Wbrew pozorom, jest to bardzo prosta czynność. Instalujemy
dnsmasq, a w/etc/dnsmasq.confwpisujemy dwie opcje:interface=eth0 dhcp-range=192.168.42.2,192.168.42.41,12hW 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 -
Uruchomienie routingu.
Routing można włączyć jednym poleceniem:
# echo 1 > /proc/sys/net/ipv4/ip_forwardNiektórzy zalecają jeszcze dodanie linijki
net.ipv4.ip_forward = 1do
/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ć. -
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ć.

wtorek, 7 lipca 2009 @ 21:37
czegos takiego szukalem :) dziekuje
a wiesz moze jak dodac WEP, WPA? albo jakies lepsze zabezpieczenie ?
środa, 8 lipca 2009 @ 11:28
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.