Wielu użytkowników Neostrady posiada modem dostarczany wraz z usługą, podłączany do portu USB. Można go również wykorzystać do połączenia z internetem przy pomocy routera wspieranego przez OpenWRT posiadającego porty USB.
Konieczne jest zainstalowanie wersji 2.6
Należy pobrać z http://downloads.openwrt.org/kamikaze/8.09_RC2/brcm47xx/packages/ pakiety
Następnie przy pomocy winscp (windows) lub scp (linux) przenieś te pakiety do katalogu /tmp na ruterze i zainstalować poleceniem
opkg install /tmp/nazwa_pakietu.ipk
Należy zmienić sekcję wan w /etc/config/network na następującą:
config interface wan
option ifname "ppp0"
option proto pppoa
option encaps llc
option vpi 0
option vci 35
option username "user"
option password "hasło"
zamiast option encaps llc można dać option encaps vc
Restart rutera, ewentualnie należy uruchomić połączenie ifup wan i wszystko powinno działać.
Istnieje możliwość użycia „automatu”. Wystarczy pobrać skrypt do folderu /tmp i następnie:
chmod +x install.sh ./install.sh
Do stworzenia opisu wykorzystany został router ASUS WL-500gP z OpenWRT RC6 (kernel 2.4.30) oraz modem Alcatel/Thomson SpeedTouch330
W pierwszej kolejności należy skonfigurować USB na routerze. Wystarczy zainstalować kilka pakietów:
ipkg install kmod-usb-core ipkg install kmod-usb-uhci # dla innych routerów niż WL-500gP, może być potrzebne OHCI ipkg install kmod-usb-usb2 # nie jest wymagane dla modemu SpeedTouch330 (USB v1.1)
Od razu należy zainstalować również pakiety do obsługi modemu i PPP:
ipkg install kmod-usb-acm ipkg install libgcc ipkg install kmod-ppp
Następnym krokiem jest podmontowanie systemu plików:
mount -t usbdevfs usbdevfs /proc/bus/usb
USB zainstalowane. Teraz możemy sprawdzić, czy modem jest rozpoznawany przez router. W tym celu maleć podłączyć modem do wolnego gniazda USB w routerze. Router powinien rozpoznać modem. Aby to sprawdzić, wystarczy wydać polecenie:
# cat /proc/bus/usb/devices
Jeśli wszystko jest OK, powinniśmy otrzymać w odpowiedzi coś takiego:
(...) P: Vendor=06b9 ProdID=4061 Rev= 2.00 S: Manufacturer=ALCATEL S: Product=Speed Touch 330 (...)
Warto zapamiętać wersję modemu (Rev=X.XX). Przyda się przy wyborze rodzaju firmware (na rynku spotykane są modele 2.00 i 4.00)
Kolejnym krokiem będzie uzupełnienie zasobów o wymagane moduły i programy. Pliki modułów kernela (obsługa modemu): ppp_synctty.o, atm.o, n_hdlc.o; (obsługa ppp): ppp_mppe_mppc.o. katalog docelowy: /lib/modules/2.4.30
Pozostałe pliki (program modemu): modem_run; (firmware): KQD6_3.012 (dla wersji modemu Rev= 2.00), ZZZL_3.012 (dla wersji modemu Rev= 4.00); oraz plugin dla PPP: pppoa3, i umieścimy je w utworzonym przez nas katalogu /usr/local (lub inny wedle swego uznania).
Brakujące moduły są dostępne TUTAJ oraz firmware do SpeedToucha TUTAJ. Należy rozpakować je w katalogu np.: /tmp i poprzenosić w właściwe miejsca. Najprościej można wykonać to wydając polecenia:
cd /tmp wget http://eko.one.pl/openwrt/spdtch-pppoa_2.4.30-brcm_mipsel.tgz tar -zxvf spdtch-pppoa_2.4.30-brcm_mipsel.tgz mv *.o /lib/modules/2.4.30 mkdir -p /usr/local mv modem_run /usr/local mv pppoa3 /usr/local
Następnie ładujemy potrzebne moduły:
insmod slhc insmod ppp_generic insmod ppp_synctty insmod ppp_async insmod ppp_mppe_mppc insmod atm insmod n_hdlc
Firmware można pobrać z adresu http://www.speedtouchdsl.com/download/drivers/USB/SpeedTouch330_firmware_3012.zip, a następnie rozpakować na komputerze stacjonarnym i wyodrębnić dwa pliki: KQD6_3.012 oraz ZZL_3.012. Następnie należy je przesłać (np. instalując wcześniej demona ftp, n p vsftp) do katalogu /usr/local.
Przejdziemy teraz do załadowania firmware do modemu. W tym celu należy podłączyć przewód linii telefonicznej do modemu (oczywiście musimy mieć na tej linii aktywną usługę neostrady) i wydać polecenie:
/usr/local/modem_run -v 1 -m -f /usr/local/KQD6_3.012
W trakcie ładowania pliku firmware, zaczną migać diody urządzenia. Będzie to oznaczać synchronizację linii. Po kilkunastu sekundach modem się ustabilizuje. Diody powrócą do zielonego koloru.
Prawidłowe załadowanie firmware w modemie możemy sprawdzić wydając komendę:
# logread
Jan 1 00:00:21 (none) user.info : Info modem_run version 1.3.1 started by root uid 0 Jan 1 00:00:21 (none) user.info : Info Found SpeedTouch USB modem Jan 1 00:00:21 (none) user.info : Info Modem revision: 0200 Jan 1 00:00:23 (none) user.info : Info Best offset 36 with probability 100% Jan 1 00:00:23 (none) user.info : Info Best offset 983 with probability 100% Jan 1 00:00:23 (none) user.info : Info Firmware info (CRC:0xd80bf9f7, Size:991, Checked: Yes, Alcatel/Thomson Boot block (old)) Jan 1 00:00:23 (none) user.info : Info Best offset 1027 with probability 100% Jan 1 00:00:23 (none) user.info : Info Best offset 762642 with probability 100% Jan 1 00:00:23 (none) user.info : Info Firmware info (CRC:0x78039fed, Size:762650, Checked: Yes, 3.0.6 - MacOSX - Win32) Jan 1 00:00:25 (none) user.info : Info BLOCK1 : 991 bytes uploaded : OK Jan 1 00:00:26 (none) user.info : Info BLOCK2 : 511 bytes downloaded : OK Jan 1 00:00:29 (none) user.info : Info BLOCK3 : 762650 bytes uploaded : OK Jan 1 00:00:30 (none) user.info : Info BLOCK4 : 511 bytes downloaded : OKInfo Modem reference : 3566067A...... Jan 1 00:00:41 (none) user.info : Info [monitoring report] ADSL link went up Jan 1 00:01:00 (none) user.info : Info ADSL synchronization has been obtained Jan 1 00:01:00 (none) user.info : Info ADSL line is up (2496 kbit/s down | 320 kbit/s up)
UWAGA!!! Jeśli Twoja wersja modemu jest Rev= 4.00, to należy zmienić w wywołaniu modem_run nazzwę pliku firmware na: ZZZL_3.012
Pozostało nam jeszcze zestawienie połączenia. Więc do dzieła…..
W wersji kernela 2.4.30, do skonfigurowania pppd użyjemy pluginu pppoa3. Musimy stworzyć plik konfiguracyjny:
cd /etc/ppp/peers touch neostrada-pppoa nano neostrada-pppoa
(lub wykorzystując inny edytor) uzupełnić plik neostrada-pppoa następującymi wpisami:
debug kdebug 1 lock noipdefault defaultroute pty "/usr/local/pppoa3 -v 1 -e 1 -c -m 1 -vpi 0 -vci 35" asyncmap 0 lcp-echo-interval 2 lcp-echo-failure 7 sync user TWOJ_LOGIN@neostrada.pl noauth holdoff 3 persist maxfail 5 mru 1500 mtu 1500
Oczywiście należy zmienić TWOJ_LOGIN@neostrada.pl na login przydzielony podczas rejestracji usługi Neostrada.
Kolejnym krokiem jest wprowadzenie wpisów loginu i hasła do plików chap-secrets i pap-secrets w katalogu /etc/ppp. Login i hasło zostały ci nadane przy rejestracji neostrady. Modyfikacji należy dokonać dowolnym edytorem, np:
nano /etc/ppp/chap-secrets
Wyglądać powinno to tak:
# Secrets for authentication using CHAP # client server secret IP addresses TWOJ_LOGIN@neostrada.pl * TWOJE_HASLO *
TWOJ_LOGIN@neostrada.pl i TWOJE_HASLO należy zastąpić loginem i hasłem z rejestracji neostrady. Taki sam wpis należy wykonać w pliku /etc/ppp/pap-secrets.
Pozostał nam już tylko zestawienie połączenia i kilka spraw porządkowych. W pierwszej kolejności ustawiamy zmienne nvram, żeby skonfigurować prawidłowo firewall, DNS i route.
nvram set wan_device=ppp0 nvram set wan_ifname=ppp0 nvram set lan_dns="194.204.152.34 217.98.63.164" # jeśli jest już ustawione, to można nie zmieniać nvram commit /etc/init.d/S35firewall # restart firewall route del default gw 192.168.2.1 # restart route (192.168.2.1 - IP Twojego routera)
Teraz możemy już odpalić połączenie PPP. Należy wydać polecenie:
pppd call neostrada-pppoa
W efekcie w syslog powinny pojawić się wpisy dotyczące nawiązania połączenia. W celu sprawdzenia wykonujemy logread:
Jan 1 00:01:02 (none) kern.notice pppd[732]: pppd 2.4.3 started by root, uid 0 Jan 1 00:01:02 (none) kern.debug pppd[732]: using channel 2 Jan 1 00:01:02 (none) kern.info pppd[732]: Using interface ppp0 Jan 1 00:01:02 (none) kern.notice pppd[732]: Connect: ppp0 <--> /dev/pts/1 Jan 1 00:01:02 (none) kern.debug pppd[732]: rcvd [LCP ConfReq id=0xc <auth chap MD5> <magic 0x4c90d0ea>] Jan 1 00:01:02 (none) kern.debug pppd[732]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x21d52310> <pcomp> <accomp>] Jan 1 00:01:02 (none) kern.debug pppd[732]: sent [LCP ConfAck id=0xc <auth chap MD5> <magic 0x4c90d0ea>] Jan 1 00:01:05 (none) kern.debug pppd[732]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x21d52310> <pcomp> <accomp>] Jan 1 00:01:05 (none) kern.debug pppd[732]: rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x21d52310> <pcomp> <accomp>] Jan 1 00:01:05 (none) kern.debug pppd[732]: sent [LCP EchoReq id=0x0 magic=0x21d52310] Jan 1 00:01:05 (none) kern.debug pppd[732]: rcvd [CHAP Challenge id=0x31 <046c0e6e53845b7b64b083a22b2e73449ff738636c>, name = "wawa_pl"] Jan 1 00:01:05 (none) kern.debug pppd[732]: sent [CHAP Response id=0x31 <80327be01735cd4488e7c0a8f25f0921>, name = "XxXxXx@neostrada.pl"] Jan 1 00:01:05 (none) kern.debug pppd[732]: rcvd [LCP EchoRep id=0x0 magic=0x4c90d0ea] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [CHAP Success id=0x31 ""] Jan 1 00:01:06 (none) kern.info pppd[732]: CHAP authentication succeeded Jan 1 00:01:06 (none) kern.notice pppd[732]: CHAP authentication succeeded Jan 1 00:01:06 (none) kern.debug pppd[732]: sent [CCP ConfReq id=0x1 <mppe -H -M -S -L -D +C>] Jan 1 00:01:06 (none) kern.debug pppd[732]: sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0>] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [LCP ProtRej id=0xd 80 fd 01 01 00 0a 12 06 00 00 00 01] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>] Jan 1 00:01:06 (none) kern.debug pppd[732]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0>] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [IPCP ConfNak id=0x2 <addr 83.11.170.191>] Jan 1 00:01:06 (none) kern.debug pppd[732]: sent [IPCP ConfReq id=0x3 <addr 83.11.170.191>] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [IPCP ConfReq id=0xf0 <addr 213.20.2.228>] Jan 1 00:01:06 (none) kern.debug pppd[732]: sent [IPCP ConfAck id=0xf0 <addr 213.20.2.228>] Jan 1 00:01:06 (none) kern.debug pppd[732]: rcvd [IPCP ConfAck id=0x3 <addr 83.11.170.191>] Jan 1 00:01:06 (none) kern.notice pppd[732]: local IP address 83.11.170.191 Jan 1 00:01:06 (none) kern.notice pppd[732]: remote IP address 213.20.2.228 Jan 1 00:01:06 (none) kern.debug pppd[732]: Script /etc/ppp/ip-up started (pid 755) Jan 1 00:01:06 (none) kern.debug pppd[732]: Script /etc/ppp/ip-up finished (pid 755), status = 0x1
Jeśli otrzymaliśmy podobny wynik, to znaczy że połączenie został nawiązane prawidłowo. Możemy to dodatkowo sprawdzić wydając polecenie: ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:83.11.170.191 P-t-P:213.20.2.228 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:383 (5.0 MiB) TX bytes:81 (2.0 MiB)
Wykonamy jeszcze restart dnsmasq:
killall dnsmasq /etc/init.d/S50dnsmasq start
……. i wszystko mamy gotowe.
Sprawdź jeszcze tabelę routingu i czy DNS pracuje prawidłowo. Wydaj kolejno polecenia:
route -n ping google.com # ping można przerwać przy pomych Ctrl+C
Jeśli wszystko ustawione jest prawidłowo otrzymasz:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface 213.25.2.228 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br0 0.0.0.0 213.20.2.228 0.0.0.0 UG 0 0 0 ppp0
oraz
PING google.com (64.233.167.99): 56 data bytes 64 bytes from 64.233.167.99: icmp_seq=0 ttl=245 time=158.4 ms 64 bytes from 64.233.167.99: icmp_seq=1 ttl=245 time=145.6 ms 64 bytes from 64.233.167.99: icmp_seq=2 ttl=245 time=148.3 ms 64 bytes from 64.233.167.99: icmp_seq=3 ttl=244 time=155.7 ms 64 bytes from 64.233.167.99: icmp_seq=4 ttl=244 time=306.6 ms --- google.com ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 145.6/182.9/306.6 ms
Do pełnego szczęścia potrzene są jeszcze skrypty pozwalające na zautomatyzowanie procesów uruchamiania wszystkich wymaganych programów.
(UWAGA!!! Poniższe skrypty nie są jeszcze całkowicie przetestowane, ale z powodzeniem działają na moim routerze.)
Całość składa się z 3 skryptów.
1. Główny skrypt modem.sh należy umieścić w katalogu /usr/local. Skrypt sprawdza co 1min czy połączenie z neostradą jest nawiązane. Jeśli stwierdzi że nastąpiło rozłączenie podejmuje próbę zestawienia połączenia (aż do skutku). Dodatkowo istnieje możliwość zrobienia restartu połączenia co jakiś określony czas (w przykładzie codziennie o godz. 2:30 - neostrada zmienia IP co 24 godz.) Dodatkowo skryp pozwala na ręczne (lub z innego programu) sterowanie pracą modemu. Możliwe są start dla modemu oraz start, zatrzymanie i restart dla połączenia (ppp0). Aby sprawdzić składnie wywołania skrypu, uruchom go bez wpisywania jakichkolwiek opcji.
#!/bin/sh
## /usr/local/modem.sh
### JKD - modem speedtouch330 - v0.3.5 - 2007-03-03
# skrypt wymaga poprawionego skryptu S60cron
## zmienna plikowa - jest jesli ppp0 jest UP
f_ppp0_pid="/var/run/ppp0.pid"
f_ppp0_up="/var/run/ppp0.up"
## zmienna plikowa - jest kiedy dziala proc. cron_1m_run
f_cron_1m_run="/var/run/cron_ppp0_1m.run"
## uruchomienie co 1 min
cron_1m_file="/var/spool/cron/root/modem_1m"
cron_1m_cmd="* * * * * /usr/local/modem.sh cron_1m_run"
## uruchomienie codziennie o godz. 2:30
cron_24h_file="/var/spool/cron/root/modem_24h"
cron_24h_cmd="30 2 * * * /usr/local/modem.sh cron_24h_run"
## Restart wszystkich programow wymagajacych aktualnego IP
restart_usr_progs() {
touch $f_ppp0_up # nie usuwac tej linii
## .....ponizej MOZNA DOPISYWAC wlasne programy......
## tymczasowo - blad w skrypcie synchronizacji czasu
#/etc/init.d/S??ntp
/usr/sbin/ntpclient -c 1 -s -h pool.ntp.org
## aktualizacja DynDNS
/etc/init.d/S??ez-ipupdate restart
}
## NIE MODYFIKOWAC ponizszego kodu
ppp0_up() {
## sprawdzenie czy jest uruchomiony modem_run
pid=`pidof modem_run`
if [ ! -z "$pid" ]; then
killall pppd >/dev/null 2>&1
## modem bug: w buforze modemu zostaja smieci - nieprawidlowo odpala pppd
## modem hacks: czyszczenie bufora modemu
pppd call neostrada-pppoa >/dev/null 2>&1
sleep 2
killall pppd >/dev/null 2>&1
## modem hacks - end
pppd call neostrada-pppoa
rm ${f_ppp0_up}
fi
}
ppp0_start() {
ppp0_up
rm ${f_cron_1m_run}
echo "$cron_1m_cmd" > $cron_1m_file # wpis 1m do crontabs
echo "$cron_24h_cmd" > $cron_24h_file # wpis 24h do crontabs
cron_restart
}
ppp0_stop() {
rm ${cron_1m_file} # usuniecie wpisu 1m z crontabs
rm ${cron_24h_file} # usuniecie wpisu 24h z crontabs
cron_restart
killall pppd >/dev/null 2>&1
rm ${f_cron_1m_run}
}
cron_1m_run() {
if [ ! -f $f_cron_1m_run ]; then
touch $f_cron_1m_run
if [ ! -f $f_ppp0_pid ]; then
rm ${f_ppp0_up}
## podniesienie ppp0
ppp0_up
else
if [ ! -f $f_ppp0_up ]; then
## restart usr_progs
restart_usr_progs
touch $f_ppp0_up
fi
fi
fi
rm ${f_cron_1m_run}
}
cron_restart() {
/etc/init.d/S??cron restart
}
modem_start() {
## sprawdzenie czy modem jest podlaczony do USB
if grep "Vendor=06b9 ProdID=4061" /proc/bus/usb/devices; then
## sprawdzenie czy jest uruchomiony modem_run
pid=`pidof modem_run`
if [ -z "$pid" ]; then
## uruchomienie wymaganych modulow
for module in slhc ppp_generic ppp_synctty ppp_async ppp_mppe_mppc atm n_hdlc; do
/sbin/insmod $module >/dev/null 2>&1
done
mount -t usbdevfs usbdevfs /proc/bus/usb
#/usr/local/modem_run -v 1 -m -f /usr/local/KQD6_3.012 2>/var/log/modem_run.log
/usr/local/modem_run -v 1 -m -f /usr/local/KQD6_3.012
route del default gw 192.168.2.1
## odpalenie ppp0 i restart programów użytkownika
ppp0_start
else
echo "Modem_run is already started"
fi
else
echo "USB modem not found: $usb_dev"
fi
}
case "$1" in
modem_start)
modem_start
;;
ppp0_start|ppp0_restart)
ppp0_start
;;
ppp0_stop)
ppp0_stop
;;
cron_1m_run)
cron_1m_run
;;
cron_24h_run)
ppp0_start
;;
*)
echo "Usage: modem.sh {modem_start|ppp0_start|ppp0_stop|ppp0_restart}"
;;
esac
2. Skrypt S65neostrada należy umieścić w katalogu /etc/init.d. Skrypt zapewnia automatyczne zestawienie połączenia przy restarcie routera.
#!/bin/sh ## /etc/init.d/S65neostrada ## JKD /usr/local/modem.sh modem_start
3. Skrypt S60cron należy umieścić w katalogu /etc/init.d. Jest to poprawiony oryginalny skrypt z OpenWRT. Niestety oryginał ma błąd (objawia się m.in. nie wyświetlaniem w webif zawartości crontabs). Zmiany nie zakłucają standardowej pracy crona (z innymi programami), jednak wprowadzają modyfikacje używane przez skrypt modem.sh.
UWAGA!!!!!! Poprawka w S60cron jest wymagana do prawidłowej pracy skryptu modem.sh.
#!/bin/sh
#
# crond Starts crond
#
# jkd modify: (v0.1.3 - 2007-03-03)
# - crond <- /var/spool/cron/crontabs/root
# /var/spool/cron/crontabs/root <- /etc/crontabs/root + /var/spool/cron/root/*
#
crondir_base="/var/spool/cron"
crondir="$crondir_base/crontabs"
crondir_add="$crondir_base/root"
cron_root_realfile="/etc/crontabs/root"
cron_root_file="$crondir/root"
mkdir -p $crondir
mkdir -p $crondir_add
start() {
if [ "$(nvram get cron_enable)" -eq "1" ]; then
pid=`pidof crond`
if [ -z "$pid" ]; then
#regenerate root crontab file
cat $cron_root_realfile > $cron_root_file
for root_cron_entry in $crondir_add/*; do
cat $root_cron_entry >> $cron_root_file
done
echo -n "Starting crond: "
( /usr/sbin/crond -c $crondir && echo "OK" ) || echo "ERROR"
else
echo -n "crond is already started"
fi
else
echo -n "crond is disabled"
fi
}
stop() {
pid=`pidof crond`
if [ -n "$pid" ]; then
echo -n "Stopping crond: "
( {
kill $pid >/dev/null 2>&1
} && echo "OK" ) || echo "ERROR"
else
echo "crond is not running"
fi
}
restart() {
stop
sleep 1
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit $?
Po umieszczeniu skryptów na swoim miejscu trzeba pamiętać o nadaniu im atrybutów wykonalości:
chmod +x /usr/local/modem.sh chmod +x /etc/init.d/S65neostrada chmod +x /etc/init.d/S60cron
Teraz już wystarczy tylko wykonać restart routera wydając polecenie:
reboot
I to już wszystko. Możesz cieszyć się neostradą prze modem USB. :)
