четвер, 25 лютого 2016 р.

Деякі примітки до рутера на базі OpenWRT і 3G/4G модему

1. Отримуючи інтернет-зв'язок із світом через зв'язку рутера і 3G/4G модему, позбавляємося доступу ззовні до ресурсів у локальній мережі і рутера. Причина банальна - модем нібито отримує зовнішню адресу, але це нічого не означає, всі порти ззовні закриті. Так насправді, модем-інтерфейс, чи то wwan0, чи ppp0 отримують дві адреси - внутрішню в мережі провайдера і зовнішню на світ. Наприклад, мій модем зараз має адресу 10.181.18.180 в мережі провайдера:

wwan0     Link encap:Ethernet  HWaddr FA:63:B9:81:12:7C 
          inet addr:10.181.18.180  Bcast:10.181.18.183  Mask:255.255.255.252
          inet6 addr: fe80::f860:b9ff:fe81:127c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:281553 errors:239 dropped:0 overruns:0 frame:0
          TX packets:230960 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:282998444 (269.8 MiB)  TX bytes:49976507 (47.6 MiB)


а зовнішню адресу можна перевірити по checkip.dyndns.org, і вона зараз є 94.254.145.5. Ну але хоч би як ви не відкривали порти в рутері, до рутера ззовні вам зась. Можливо, якийсь провайдер і не блокує зовнішніх портів, але, судячи по форумах, це величезна рідкість.
Вихід є, можна докупити статичну ip-адресу, але це мене найменше цікавить. Інший логічний вихід - організувати vpn-мережу. Ну і виявилося, що, в принципі, робиться все досить просто на базі n2n. Причому для OpenWRT все робиться досить елементарно. Перш за все треба додати додаткові сховища пакунків від eko:

    # cd /tmp
    # wget http://dl.eko.one.pl/chaos_calmer/eko1.pub
    # opkg-key add eko1.pub
    # echo 'src/gz eko1 http://dl.eko.one.pl/chaos_calmer/ARCH/packages/' >> /etc/opkg/customfeeds.conf"
    # opkg update
 
Далі встановити пакунок n2n-v2,
# opkg install n2n-v2
і відповідно його сконфігурувати:

# vi /etc/config/n2n 

 config edge
    option ipaddr        '10.90.70.1(ip адреса вашої ноди)'
    option netmask        '255.255.255.0'
    option supernode    'ip-адреса сервера супермоди'
    option port        'порт сервера супермоди'
    option community    'назва спільноти'
    option key        'пароль доступу до спільноти'
    option route        '0'
 

#config supernode
#    option port        '86'


і запустити


# uci commit n2n
# /etc/init.d/n2n enable
#/etc/init.d/n2n start


Опції для створення суперноди закоментовані, вона нам на рутері і так ні до чого, бо доступу до неї немає. А в конфігурації моєї ноди, яка працює на рутері з модемом, ноді надано адресу 10.90.70.1 з маскою 255.255.255.0. Ця нода буде з'єднуватися з портом зовнішньої суперноди, яка запущена десь на сервері, який має відкритий якийсь порт (порт сервера суперноди). Можна знайти такі відкриті сервера, але вони довго не живуть. Простіше самому на якомусь сервері, до якого маємо доступ, скомпілювати або встановити пакунок n2n з супернодою і запустити її, прав суперкористувача для цього не потрібно.
Отже, скажімо, що маємо доступ до якоїсь суперноди, і у нас на рутері запущена нода. Треба тепер з'єднатися ззовні до неї. Це досить просто: на будь-якому компі встановлюємо пакунок n2n, і запускаємо ноду

# edge -a 10.90.70.2 -c назва_спільноти -k пароль_доступу_до_спільноти -l ip_адреса_сервера_суперноди:порт_сервера_суперноди -f

Тобто запускаємо ноду з тими ж параметрами, що й на рутері, тільки міняємо адрес ip в спільній мережі, на рутері 10.90.70.1, а на зовнішньому компі 10.90.70.2, наприклад. Ну все тепер, спільна vpn мережа створена, є супернода, є дві ноди, які комунікуються за допомогою суперноди. Щоб, наприклад, з'єднатися з рутером, достатньо на тому зовнішньому компі запустити переглядач інтернету і перейти на адресу http://10.90.70.1, має відкритися веб-інтерфейс рутера OpenWRT. На будь-якому компі в локальній мережі рутера можна запустити ноди з тими параметрами (міняючи тільки ip) і мати таким чином доступ до них.

2. На даний момент в чистому інтерфейсі luci для OpenWRT не реалізована підтримка висвітлення сили сигналу в модемі. В принципі, це можна побачити з рівня командного рядка, але постійно лазити на рутер, щоб тільки запустити команду типу

# uqmi -d /dev/cdc-wdm0 --get-signal-info

не зовсім зручно, бажано мати якусь звичну візуальну інфу. В сховищах eko я знайшов пакунок, який сяк-так це реалізує. Отже, встановлюємо пакунок 3ginfo:

# opkg update
# opkg install 3ginfo

Налаштовуємо:

# vi  /etc/config/3ginfo

config 3ginfo
    option http_port '81'
    option language 'en'
    option device '/dev/ttyUSB2'


# uci commit 3ginfo
# /etc/init.d/3ginfo enable
#/etc/init.d/3ginfo start

В мене ядро створює 4 пристрої для модему, /dev/ttyUSB1, /dev/ttyUSB2, /dev/ttyUSB3 і модуль qmi_wwan створює свій /dev/cdc_wdm0. Останній зайнятий під зв'язок, тому 3ginfo мусить використовувати інший пристрій, в даному випадку це /dev/ttyUSB2 для отримання інфо про сигнал. Далі відкриваємо сторіночку http://адреса_рутера:81 і бачимо картинку.

3. Часом, якщо ніхто не користується зв'язком, модем "засинає". Ніби зв'язок є, адреса ip є, але модем мовчить, жодна адреса не відкривається. Думаю, це дійсно модем засинає. Я додав до крона рядок, щоб через кожну хвилину пінгувався сервер гугла, це мало б підтримувати модем у збудженому стані:

*/1 * * * * ping -c 1 8.8.8.8

Ось уже два дні на модемі ще ні разу не пропав зв'язок. Ніби працює.


середа, 17 лютого 2016 р.

OpenWRT і модем ZTE MF880 (продовження)

Цей допис є продовженням історії "сексу" з вищеназваним модемом. Не знаю, як цей модем потрапив в список підтримуваних, якщо стільки з ним гемору. Я писав про новий скрипт /lib/netifd/proto/wwan.sh з пакунку wwan, який має займатися розпізнаванням модему і передачею конфігурації на інші скрипти з'єднання. У випадку мого модему це мав бути /lib/netifd/proto/qmi.sh. Сьогодні ще раз переглянув той скрипт, і вгорі скрипта зацікавився параметрами, з якими він працює. А саме параметром "delay" i "modes". "Modes" то зрозуміло, це з якою мережею має з'єднуватися, типу "all,lte,3g,..", можна подивитися допомогу по uqmi. А от "delay" мене навів на підозру, що це напевно затримка для повної ініціалізації модема. І дійсно, опускаюся нижче по скрипту і бачу стрічку
[ -n "$delay" ] && sleep "$delay"
якраз перед тими, які я коментував перед тим. Аааах, он в чому справа! Ну все, міняю wan інтерфейс до первісного стану, коментую стрічку для cron, створюю новий wwan із затримкою 20 секунд для проби:
config interface 'wwan'
        option 'proto' 'wwan'
        option 'apn' 'internet'
        option 'delay'    '20'

витягую модем, запихаю назад - мережа появляється! Виключає, включаю рутер - модем без проблем спокійно з'єднується! Як все просто... Проблема в тому, що ці скрипти добре не документовані, і всюди доводиться проламуватися крізь хащі.  

понеділок, 15 лютого 2016 р.

Женячка рутера TP-LINK TL-WR1043ND з LTE модемом ZTE MF880

Початок. Продовження історії тут.

Є інтернет LTE на 60 мегабіт, є рутер TP-LINK L-WR1043ND з USB-портом, куплено за недорогу копійку модем ZTE MF880. Задача була проста - подружити цей весь колгосп для роздачі інтернету по квартирі. Вирішення не передбачало ніяких несподіванок: викинути оригінальну прошивку, закинути туди нову на базі DD-WRT або OpenWRT, модем мав служити WAN-інтерфейсом. DD-WRT мені вже трохи приїлося, захотілося знову побавитися з OpenWRT, тож завантажив в рутер останню версію на даний час Chaos Calmer 15.05. На диво все пройшло гладко. Підключив рутер до існуючої мережі, встановив необхідні пакунки

#opkg update
#opkg install wwan comgt chat comgt-ncm comgt-directip uqmi umbim usb-modeswitch 

і пакунки для зв'язку через QMI модуль

#opkg install uqmi kmod-usb-net-qmi-wwan

В цій новій Chaos Calmer 15.05 появився новий пакунок wwan, який служить для автоматичного викривання драйвера модему. Це ніби добре, модем має автоматично викритися і зв'язатися з мережею. Треба лиш відкоригувати wan інтерфейс в /etc/config/network:

config 'interface' 'wan'
         option proto wwan
         option apn internet

Можна ще додати option pincode 1234, якщо sim-карта з пін-кодом. Тобто рутер за допомогою скриптів пакунку wwan мав би розпізнати модем, впровадити пін-код 1234 і заставити його з'єднатися з мережею провайдера з APN "internet".  Нового інтерфейсу я не створював, щоб потім не гратися з фаєрволом, використав стандартний wan, так як вище. Все би мало грати як гітара. Втикаю модем, і ... тиша. ?*№&!!!! Явне вказування протоколу теж нічого не дало:

config 'interface' 'wan'
         option 'proto' 'qmi'
         option 'device' '/dev/cdc-wdm0'
         option 'apn' 'internet'

Настроїв WiFi, лізу по ssh до нього. dmesg показуює, що появився пристрій /dev/cdc-wdm0:

[  111.170000] usb 1-1: new high-speed USB device number 6 using ehci-platform
[  111.320000] option 1-1:1.0: GSM modem (1-port) converter detected
[  111.330000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[  111.340000] option 1-1:1.1: GSM modem (1-port) converter detected
[  111.340000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[  111.350000] option 1-1:1.2: GSM modem (1-port) converter detected
[  111.360000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[  111.370000] option 1-1:1.3: GSM modem (1-port) converter detected
[  111.370000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
[  111.400000] qmi_wwan 1-1:1.4: cdc-wdm0: USB WDM device
[  111.400000] qmi_wwan 1-1:1.4 wwan0: register 'qmi_wwan' at usb-ehci-platform-1, WWAN/QMI device, 5d:a2:44:f8:89:56


Нарешті ps показує, що модем застряг на команді

uqmi -s -d /dev/cdc-wdm0 --get-pin-status 

і

grep "UIM uninitialized" 

Що за чорт, я ж піна ніякого не маю на sim-картці. А навіть якщо б мав, то все одно так не має бути. Вбиваю всі процеси uqmi:

killall -9 uqmi

і пробую uqmi -s -d /dev/cdc-wdm0 --get-pin-status - дійсно висить, не рухається. Знайшов ті стрічки у файлі /lib/netifd/proto/qmi.sh :

while uqmi -s -d "$device" --get-pin-status | grep '"UIM uninitialized"' > /dev/null; do
        sleep 1;
    done

    [ -n "$pincode" ] && {
        uqmi -s -d "$device" --verify-pin1 "$pincode" || {
            echo "Unable to verify PIN"
            proto_notify_error "$interface" PIN_FAILED
                 proto_block_restart "$interface"
            return 1
        }
    }


закоментував. Витягую модем, вставляю - ха! Працює! Але все це мені це не подобається, зміна системних файлів не входить в плани. Після проб зробив все інакше.
Поміняв інтерфейс wan у /etc/config/network:

config interface 'wan'
    option ifname 'wwan0'
    option proto 'dhcp'


Переписав скрипт для автоматичного з'єднання модему при розриві зв'язку з блогу UAVmatrix, назвав /usr/bin/checklte.sh:

#!/bin/sh

YOUR_APN=internet

#Create lock file
LOCKFILE=/tmp/lock.txt
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
    echo "This script is already running"
    exit
fi

# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}
#let`s ping google.
#if ! wget -q -s http://google.com
if ! wget -q --tries=10 --timeout=20 --spider http://google.com
    then
            sleep 1
            #let`s ping google again to doublecheck that RPI is offline.
            #if ! wget -q -s http://google.com
            if ! wget -q --tries=10 --timeout=20 --spider http://google.com
             then
                    killall -9 uqmi
                    # killall -9 dhclient
                    uqmi -d /dev/cdc-wdm0 --set-device-operating-mode shutting_down
                    sleep 30
                    uqmi -d /dev/cdc-wdm0 --stop-network 4294967295 --autoconnect
                    sleep 2
                    uqmi -d /dev/cdc-wdm0 --network-register
                    sleep 2
                    uqmi -s -d /dev/cdc-wdm0 --start-network ${YOUR_APN} --keep-client-id wds --autoconnect &
                    echo "Modem
Restarted"                          
                    sleep 8
                else
                        echo "Modem Online"
                fi
    else
        echo "Modem Online"
    fi

#remove LockFile
rm -f ${LOCKFILE}


Скрипт містить закоментовані рядки для обрубаного wget зі стокового OpenWRT. Ці що є, то для встановленого wget з сховищ.
І, відповідно, команда для cron запускає скрипт кожну хвилину:

*/1 * * * * /usr/bin/checklte.sh &

Втикнутий модем розпізнається, далі ним займається скрипт з cron, який перевіряє з'єднання, якщо воно є, то нічого не робить, а якщо немає, то вимикає модем, виключає глобальну опцію автоз'єднання в ньому, реєструє в мережі без з'єднання і запускає само з'єднання з відповідним APN провайдера.

субота, 6 лютого 2016 р.

Xanten (Ксантен), Німеччина 2015

Минув рік від цієї поїздки в лютому 2015 року. Про Ксантен дізналися випадково від мого брата, який наполягав на відвіданні цієї місцини. І недарма. Провели ми там цілий день, находилися так, що ноги відпадали, але вражень було багато і це вартувало цього.

Google Analytics