Temat: [HOWTO] Modem USB + neostrada (PPPoATM)
Instalacja modemu USB Alcatel/Thomsom SpeedTouch330 w OpenWTR (neostrada)
Wersja: 1.06
Ostatnia zmiana:
Wielu użytkównikó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.
Do stworzenia opisu wykorzystany został router ASUS WL-500gP z OpenWRT RC6 (kernel 2.4.30) oraz modem Alcatel/Thomson SpeedTouch330 (UWAGA!!!! w opisany poniżej sposób NIE MOŻNA podłączy mademu USB Sagem)
Co będzie nam potrzebne?
- router z portem USB
- modem USB SpeedTouch330
- pakiety do obsługi USB
- programy do obsługi modemu
- programy do zestawienia połączenia PPPoATM
Wszystkie niezbędne moduły i programy dostępne są pod tym linkiem
USB
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 niz WL-500gP, moze być potrzebne OHCI
ipkg install kmod-usb-usb2 # nie jest wymagane dla modemu SpeedTouch330 (USB v1.1)
Od razu zainstalujemy 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)
Instalacja modułów i programów
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 sa 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/d … e_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.
Instalacja firmware w modemie
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 nazwę pliku firmware na: ZZZL_3.012
Pozostało nam jeszcze zestawienie połączenia. Więc do dzieła.....
Konfiguracja PPP dla neostrady
W wersji kernela 2.4.30, do skonfigurowania pppd użyjemy pluginu pppoa3. Mosimy 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.
Zestwienie połączenia PPP
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" # jesli jest juz ustawione, to mozna 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 mozna przerwać przy pomocy 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
.
Automatyzacja - skrypty
Do pełnego szczęścia potrzene są jeszcze skrypty pozwalające na zautomatyzowanie procesów uruchamiania wszystkich wymaganych programów.
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 -L /dev/null && 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.
PS. WIELKIE PODZIĘKOWANIA dla Cezarego, za pomoc w odpaleniu całości i cierpliwość dla mojej osoby . Bez niego nie udało by mi się tego zrobić. DZIĘKUJĘ!
Pozdrawiam Jarek