2010-06-10

Сила NAT

Вот оно как. Связь с "домашним роутером" потерялась, хозяева уехали на две недели и контора сидела с понедельника на сухом пайке. То есть интернет у особо избранных (читай меня) или если придти и хорошо попросить обратно у меня :)

Однако оказалось, что модем живёт и отзывается на SSH :)
Старые попытки поюзать его линукс закончились неудачей.
Отзывается модем о себе так:
BusyBox v0.61.pre (2006.04.28-16:02+0000) Built-in shell (ash)
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@Leachy) (gcc version 2.95.3 20010315 (release/MontaVista)) #87 Fri Apr 28 23:52:07 CST 2006
cpu model: MIPS 4KEc V4.8
Что-то вроде D-LINK 504T или как то так..

Ну попытался на него собрать бинарники openvpn в среде openembedded.
И вроде собралось - только не пускалось. Ибо там не libc - а uClibc.
Попытался собрать на uClibc - openembedded ругнулся на hash-style в binutils.
Ох уж эта crosscompile для mipsel..
Вот если бы собрать openvpn под него.. ммм..

И тут с утра меня осенило :) iptables тут вполне нормальные..
Одна строчка:
iptables -t nat -A PREROUTING -s 95.106.MY.IP -p tcp --dport 55000:56000 -j DNAT --to MY.VPS.IP.ADDR
И всё. Роутер готов :)
На vps настраиваем прокси (его урезанность не позволила пустить OpenVPN) - и заставляем прокси ломиться на роутер как будто он и есть VPS.. Все счастливы.
Интернет в конторе ожил а биллинг провайдера считает трафик правильно (сиречь локально-безлимитно) - что есть гуд.
И так 50% месячного лимита в 300 МБ за три для выбрали - это с одного компа то :)
Страшно посчитать сколько вы расходуем трафика в будние дни то..
Ээх. Когда же дойдёт до "простых смертных" эта кабелизация-оптоволоконизация то есть FTTx..
Осчастливили, изверги, в двух микрорайонах пару десятков домов во всём городе - и хватит.

Вот она сила NAT - в одной строчке iptables :)

2010-06-03

Кодировки GSM модемов

Ужас, сколько всего :)
На самом деле строчка "*100#" превращается такими командами (слегка попортив GSM::PDA код)

$_='AA180C3602';
print;
$_=unpack'b*',pack"H*",$_;
s/([01]{7})/${1}0/g;
$_=pack 'b*',$_;

print "'$_'";

$_=unpack 'b*',$_;
s/([01]{7})0/$1/g;
print unpack"H*", pack'b*',$_;
# aa180c360200

Декодировка. Упаковать в lsb-бинарную строчку (младший бит первый):
AA => 01010101
18 => 00011000
0c => 00110000
36 => 01101100
02 => 01000000
Собираем в кучу:
0101010100011000001100000110110001000000
Нарезаем по 7 бит (я просто добавил по биту после каждого 7-го - а потом снова порезал на 8)
и декодируем.

bits = 01010100 10001100 00001100 00001100 11000100
septet = 0101010
septet = 1000110
septet = 0000110
septet = 0000110
septet = 1100010
Получили '*100#'

Ответ в UCS2 или UTF-16BE..
И ещё интересно:
at+cscs=?
+CSCS: ("IRA","GSM","UCS2")
Хотя at+cscs="GSM" выдаёт ОК и ничего не меняется :)

Да. И всё отправляется и принимается чудненько через консольку ttyUSB1.
Не надо писать в одну и читать в другую :)

Хайвей и все-все-все

Дали тут 3g-модемчик потестировать-настроить :)
Местного Мегафона-Центр который.

ubuntu 10.04
На корпусе нацарапано
Модель: E1550
HSDPA USB Stick
HUAWEI TECHNOLOGIES CO., LTD.

Статей про него много :)
lspci писал про него что он 12d1:1446 и CDROM с "дровами" да microSD картридер виделись.
Вот что dmesg писал:
[ 5296.452028] usb 3-1: new full speed USB device using ohci_hcd and address 2
[ 5296.679200] usb 3-1: configuration #1 chosen from 1 choice
[ 5296.688975] scsi9 : SCSI emulation for USB Mass Storage devices
[ 5296.689247] usb-storage: device found at 2
[ 5296.689249] usb-storage: waiting for device to settle before scanning
[ 5296.689433] scsi10 : SCSI emulation for USB Mass Storage devices
[ 5296.689595] usb-storage: device found at 2
[ 5296.689597] usb-storage: waiting for device to settle before scanning
[ 5301.690339] usb-storage: device scan complete
[ 5301.692309] usb-storage: device scan complete
[ 5301.696945] scsi 9:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2
[ 5301.702443] scsi 10:0:0:0: Direct-Access HUAWEI MMC Storage 2.31 PQ: 0 ANSI: 2
[ 5301.751308] sr0: scsi-1 drive
[ 5301.751315] Uniform CD-ROM driver Revision: 3.20
[ 5301.751482] sr 9:0:0:0: Attached scsi CD-ROM sr0
[ 5301.751580] sr 9:0:0:0: Attached scsi generic sg6 type 5
[ 5301.751957] sd 10:0:0:0: Attached scsi generic sg7 type 0
[ 5301.800325] sd 10:0:0:0: [sdg] Attached SCSI removable disk
[ 5314.054935] ISO 9660 Extensions: Microsoft Joliet Level 1
[ 5314.101926] ISOFS: changing to secondary root

Ладно. Нам цэ-дэ не нужен. Надо его из ЦэДэ в модем превратить (что с цэ-дэ сотворить - потом думать буду).

"Лучший способ" пока - прописать
sudoedit /etc/udev/rules.d/15-huawei-155x.rules
SUBSYSTEM=="usb",
ATTRS{idProduct}=="1446",
ATTRS{idVendor}=="12d1",
RUN+="/lib/udev/modem-modeswitch --vendor 0x$attr{idVendor} --product 0x$attr{idProduct} --type option-zerocd"

Хм. Странно. Циферки не совпали. Перетыкаем донгл - получаем через несколько секунд вот такой девайс:
12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
tty не появились (кажется).
sudo modprobe usbserial vendor=0x12d1 product=0x1003
И вот у нас по dmesg появились консольные устройства:

[ 8865.063521] usbserial_generic 3-1:1.0: generic converter detected
[ 8865.063680] usb 3-1: generic converter now attached to ttyUSB0
[ 8865.067561] usbserial_generic 3-1:1.1: generic converter detected
[ 8865.067742] usb 3-1: generic converter now attached to ttyUSB1

Странно что два порта :)
ttyUSB0 - отвечает на AT команды.
и ttyUSB1 тоже отвечает на AT команды - только тут регулярно валятся всякие непонятные сообщения. Вроде:
^RSSI:20
^BOOT:37205608,0,0,0,87
^RSSI:20
^RSSI:20
^RSSI:20
^RSSI:22
^RSSI:18
^BOOT:37205608,0,0,0,87
^RSSI:18
^RSSI:18
^RSSI:18

Ужас. Разбираться лень :)

пишем конфиг /etc/wvdial.conf У меня заработал такой (Рязанский Мегафон):
[Dialer defaults]
Modem = /dev/ttyUSB0

[Dialer mc]
Modem = /dev/ttyUSB0
Baud = 115200
Init2 = AT+CGDCONT=1,"IP","internet"
Phone = *99***1#
Username = *
Password = *
Stupid Mode = 1
New PPPD = yes
Auto DNS = 1

[Dialer pin]
Modem = /dev/ttyUSB0
Baud = 115200
Init1 = AT+CPIN=1234

Пин-код вроде не нужен :)
ну да ладно - пригггадитттсся.
Попытки коннектиться на ttyUSB1 не увенчались успехом :)
CARRIER LOST и всё тут :)
wvdial -n mc
и понеслось :) Ну роутинг там прописать и т.п. - думаю справитесь.
Ага. Попутно появились всякие статейки как слать и принимать USSD :) Занятненько..
Взял отсюда программульку.. http://linux007.livejournal.com/82330.html
./ussd '*100#'
мусор всякий пишеть.. Ладно. Но пишеть же? Значит что-то тут не так :)
выводим в отладку то что у нас ушло в порт и что вернулось.
ушло: AT+CUSD=1,AA180C3602,15
вернулось:00320035002E00340032044004430431002E0421043C043E04420440043800200032003500200422041200
2D043A0430043D0430043B043E0432002C002004420440043004440438043A0020043104350441043F043B002E0021002004170432043E043D04380020002A0035003000360023002000380440002F04340435043D044C
Эти 04ХХ ничего не напоминают? Сообщения то пишутся на русском. а это галимый utf-16 из винды. То есть utf-16be если что (или UCS2 некоторые называют). А никак не utf-7..
проверяем нашу догадку..
В конце файлика комментарим перекодировку и делаем свою:

#$decoded_ussd_reply = Device::Gsm::Pdu::decode_text7('00'.$ussd_reply);
use Encode;
$decoded_ussd_reply = pack "H*",$ussd_reply;
Encode::from_to($decoded_ussd_reply,'UTF-16BE','UTF-8');
(консолька то у нас линуксовая - и utf8 понимает только :)

Вуаля! Вот и наш ответ со спамом:
USSD REPLY: 25.42руб.Смотри 25 ТВ-каналов, трафик беспл.! Звони *506# 8р/день
Пока всё.. будем пилить дальше..