Показаны сообщения с ярлыком mr3020. Показать все сообщения
Показаны сообщения с ярлыком mr3020. Показать все сообщения

воскресенье, 16 декабря 2012 г.

openvpn box of TL-MR3020

Задача: с планшета ipad  mini wifi получить доступ в интернет и к внутренней сети организации через openvpn через wifi в гостинице и, при отсутствии wifi, через сеть 3G.

Как известно, для iOS нет официального openvpn клиента, и, судя по форуму openvpn (например, https://forums.openvpn.net/topic4568.html) в ближайшее время не появится.
Один вариант решения: jailbreak -> Cydia -> GuizmOVPN.
Этот  вариант описан на сайте разработчика http://www.guizmovpn.com/
Но для iOS 6 jailbreak пока не существует, не хочется делать jail, и у меня ipad mini wifi без 3G модуля.

Второй вариант: роутер с запущенным ovpn клиентом и с возможностью коннектиться как через 3G модем, так и через wifi адаптер. Этот вариант и реализован.
Вот как выглядит :

Вот так подаю доп. питание на hub :

По железу: 
 роутер TP-Link MR3020 (выбран из-за небольшого размера и возможности установить openwrt)/
 модем ZTE MF190 от Биланта, разлоченный и перешитый на MTS (как сделать, описано в http://4pda.ru/forum/index.php?showtopic=277903)
  Замечание: на прошивке от Movistar не смог заставить модем работать под openwrt: (но, м.б. это мои кривые руки /и нежелание долго ковыряться/)
 wifi адаптер, используемый в качестве клиента для подключения к точке доступа в гостинице: ASUS USB-N13 (Ralink rt2870)
 usb hub - купил по принципу : цена < 300р и возможность работать с SD/MicroSD картами (на всякий случай :) )
 доп. диск в моем случае SD 2Gb, но, естественно, можно использовать usb flash drive.

Как установить openwrt на роутер, описано в http://wiki.openwrt.org/toh/tp-link/tl-mr3020.
Я установил прошивку Attitude Adjustment Beta 2 snapshot (рекоммендуют ее). Но, скорее всего, проблем не будет и с lastest trunk snapshot. Выполнил начальную конфигурацию (доступ в интернет с lan порта (можно и с wlan, непринципиально)). Сделал это через web-интерфейс (так проще) Network->Interfaces->LAN, Network->Firewall.
Заходим telnet-ом на роутер и проверяем, что мы видим удаленные сайты (ping www.ru) 

Теперь, собственно, кастомизация:


Замечание: чтобы посмотреть лог в случае проблем, можно использовать команду logread.

1.Т.к. нам нужны доп.пакеты, читаем, как они устанавливаются http://wiki.openwrt.org/doc/packages.
Замечание1: для установки пакетов, нужен доступ в интернет с роутера (см.выше).
Замечание2: После рестарта роутера делаем opkg update (загрузка списка пакетов в tmpfs)
Замечание3: Устанавливаем нужный пакет в NAND командой opkg install <pkg>. 
Если нужно устанавливать пакет на usb (а это будет нужно),  читаем http://wiki.openwrt.org/doc/recipes/install.packages.on.usb-stick. Чтобы указать, что пакет нужно установить в /opt, указываем opkg install <pkg> -d opt.
Вот /etc/opkg.conf  с добавленным /opt в качестве места назначения для установки.
====
src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09-beta2/ar71xx/generic/packages
dest root /
dest ram /tmp
dest opt /opt
lists_dir ext /var/opkg-lists
option overlay_root /overlay

====
 Но, чтобы устанавливать пакеты в /opt (flash drive), его надо сначала создать (см. ниже).


Замечание 4: пакеты, содержащие модули ядра, лучше ставить в NAND (а модули для поддержки usb storage только в NAND) чтобы не иметь проблем с их автоматической загрузкой при старте роутера.
2. подключаем доп.раздел на флешке и монтируем в /opt.

Как делается, описано в http://wiki.openwrt.org/doc/howto/usb.essentials
и http://wiki.openwrt.org/doc/howto/usb.storage
В моем случае я установил поддержку для usb2.0 (лишние модули лучше не ставить, т.к. место в NAND ограничено) и поддержку ext2 (kmod-fs-ext4).
На флешке предварительно создал раздел и на нем ext2fs на линуксовой машине (так было проще).
Проверил, что раздел монтируется (dmesg -> смотрим название устройства (в моем случае /dev/sda1), mount /dev/sda1 /mnt)
Теперь указываем, что этот раздел нужно монтировать в /opt при старте роутера:
Это деляется либо правкой /etc/config/fstab, либо из luci (System -> Mount points)

 Вот содержание /etc/config/fstab
====
config global automount
      option from_fstab 1
      option anon_mount 1
     
config global autoswap
      option from_fstab 1
      option anon_swap 0
     
config mount
      option target   /opt
      option device   /dev/sda1
      option fstype   ext2

      option options  rw,sync
      option enabled  1
      option enabled_fsck 0

====
Перегружаемся, проверяем, что /dev/sda1 смонтирован на /opt
root@tpl3020:/# mount
....
/dev/sda1 on /opt type ext2 (rw,relatime,user_xattr,barrier=1)



Теперь пакеты можно устанавливать как в nand, так и на flash drive.

Чтобы не иметь проблем с загрузкой библиотек с /opt/lib и /opt/usr/lib и с путями, правим
/etc/profile:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/opt/usr/local/bin
export LD_LIBRARY_PATH=/opt/usr/lib:/opt/lib



3. настраиваем wifi адаптер, который будет клиентом 
Для этого устанвливаем kmod-rt2x00-usb, kmod-rt2800-usb, wireless-tools (их можно поставить на /opt), перегружаемся и смотрим dmesg:
дожны быть строчки:
 rt2x00usb               6848  1 rt2800usb
mac80211              252272  4 ath9k,rt2800lib,rt2x00usb,rt2x00lib



настраиваем /etc/config/wireless (добавляем radio1 и интерфейс wwan):
config wifi-device 'radio1'
      option type 'mac80211'
      option macaddr 'f4:6d:04:b1:8b:d7'
      option hwmode '11ng'
      option htmode 'HT20'
      list ht_capab 'GF'
      list ht_capab 'SHORT-GI-20'
      list ht_capab 'SHORT-GI-40'
      list ht_capab 'TX-STBC'
      list ht_capab 'RX-STBC12'
      option country 'US'
      option txpower '12'
      option disabled '0'
      option channel '1'

config wifi-iface
      option network 'wwan'
      option ssid 'MY_AP'   <- имя точки доступа, у которой мы будем клиентом
      option encryption 'psk2' <- шифрование
      option device 'radio1'
      option mode 'sta' <- режим клиента
      option bssid '90:F6:52:92:68:5E'
      option key 'XXXXXXXXXX' <- ключ 



настраиваем /etc/config/network
config interface 'wwan'
      option proto 'dhcp' <- в моем случае адрес получаем по DHCP



настраиваем /etc/config/firewall
config zone
      option name 'wan'
      option input 'REJECT'
      option output 'ACCEPT'
      option forward 'REJECT'
      option masq '1'
      option mtu_fix '1'
      option network 'wan wlan1 wwan'

перегружаемся.

После перезагрузки должны увидеть следующее:
root@tpl3020:/# ifconfig wlan1
wlan1     Link encap:Ethernet  HWaddr F4:6D:04:B1:8B:D7 
          inet addr:192.168.10.103  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:190 errors:0 dropped:0 overruns:0 frame:0
          TX packets:183 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:23056 (22.5 KiB)  TX bytes:20258 (19.7 KiB)
 

На этом с wifi все. Нстройки можно делать и из luci.

Замечание: если мы вынимаем wifi адаптер из хаба, то настройки из конфигов никуда не деваются, они просто не используются. 

4. настравиваем 3G модем.
Вместо wifi адаптера вставляем в hub модем (уже перешитый, см.выше) и перегружаемся.
Как настраивать модем, описано в http://wiki.openwrt.org/doc/recipes/3gdongle

Замечание1: chat, luci-proto-3g лучше всего ставить в NAND: они маленькие, и не будет проблем с путями и библиотеками. usb-modeswitch я поставил в /opt и сделал необх. линки на /usr/bin и т.д.

Замечание2: чтобы модем при старте роутера переключался в режим tty, в /etc/rc.local добавил:
export LD_LIBRARY_PATH=/opt/usr/lib:/opt/lib
/opt/usr/bin/usb_modeswitch -c /etc/usb_modeswitch.d/19d2\:0149 -v 19d2 -p 2000



Замечание3: можно еще поставить в /opt minicom для работы с модемом.
После перезагрузки должны увидеть (на прошивке MTS):
root@tpl3020:/# ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3

на прошивке от Movistar у меня получилось 5 ttyUSB, и ни один не захотел работать.

Нам для использования нужен будет /dev/ttyUSB3.

Из luci Network->Interfaces (так проще) создаем новую сеть wan1 с интерфейсом 3g-wan1 с протоколом UMTS/GPRS/EV-DO
Из luci Network->Firewall добавляем сеть wan1 в зону wan.

перегружаемся.
После перезагрузки должны увидеть :
root@tpl3020:/# ifconfig 3g-wan1
3g-wan1   Link encap:Point-to-Point Protocol 
          inet addr:10.197.255.211  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:131 errors:0 dropped:0 overruns:0 frame:0
          TX packets:133 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:10558 (10.3 KiB)  TX bytes:10220 (9.9 KiB)

Модем настроили.

5. Настраиваем openvpn.

Устанавливаем kmod-tun
Устанавливаем openvpn в /opt

Дополнительно сделал:

root@tpl3020:/# ls -l /etc/init.d/openvpn
lrwxrwxrwx    1 root     root            23 Dec 26 12:10 /etc/init.d/openvpn -> /opt/etc/init.d/openvpn

создал /opt/etc/openvpn/config/up.sh
#!/bin/sh
/usr/sbin/iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source $4
exit 0



создал /opt/etc/openvpn/config/down.sh
#!/bin/sh
/usr/sbin/iptables -t nat -D POSTROUTING -o tun0 -j SNAT --to-source $4
exit 0

Эти два скрипта для настройки NAT после установления соединения, т.к. клиент openvpn коннектится к серверу и получает у него некий алрес, с которого можно ходить в частную сеть, а пользователь коннектится к точке доступа и получает адрес, про который openvpn сервер в общем случае ничего не знает.


Как настраивать из консоли, описано  в http://wiki.openwrt.org/doc/howto/vpn.openvpn.
Но, т.к. рулить с планшета удобнее через web морду (luci), лучше поставить luci-app-openvpn.
И тут нас подстерегает засада: в trunk нет этого пакета, т.к. он почему-то у разработчиков считается broken.

Я поступил так:
скачал с http://downloads.openwrt.org/ исходинки luci. http://downloads.openwrt.org/sources/luci-0.11%2bsvn9463.tar.gz
из архива вытащил applications/luci-openvpn и разложил то, что там было :
luasrc/controller/openvpn.lua -> /usr/lib/lua/luci/controller/
luasrc/model/cbi/openvpn*  -> /usr/lib/lua/luci/model/cbi/
luasrc/view/openvpn/* -> /usr/lib/lua/luci/view/openvpn/

root/etc/config/openvpn_recipes -> /etc/config/openvpn_recipes
и создал пустой /etc/config/openvpn

После этого в luci повилась вкладка Services->OpenVPN. Настраивать клинт можно оттуда.
И самое главное, там есть кнопочка start/stop, позволяющая из GUI управлять vpn соединением.

Замечание: т.к. openvpn ставится на /opt, а при запуске uhttpd нет необходимых LD_LIBRARY_PATH и PATH, я добавил в /opt/etc/init.d/openvpn строчки:
=========
#!/bin/sh /etc/rc.common
# Copyright (C) 2008-2011 OpenWrt.org
# Copyright (C) 2008 Jo-Philipp Wich
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.

START=95

SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1

EXTRA_COMMANDS="up down"

LIST_SEP="
"

export LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib
export PATH=$PATH:/opt/usr/bin:/opt/usr/sbin:/opt/usr/local/bin

 .....
==========
Еще добавил в /opt/etc/init.d/openvpn в start_instance() для того, чтобы могли запускаться скрипты up.sh/down.sh
==========
service_start /usr/sbin/openvpn --syslog "openvpn($s)" --writepid "$SERVICE_PID_FILE" --script-security 3 $ARGS
==========

После конфигурирования клиента из luci в /etc/config/openvpn
получилось следующее:
config openvpn 'client_tun'
      option nobind '1'
      option float '1'
      option client '1'
      option comp_lzo '1'
      option reneg_sec '0'
      option dev 'tun'
      option verb '3'
      option persist_tun '1'
      option persist_key '1'
      option remote_cert_tls 'server'
      option remote '111.111.222.222'
      option proto 'tcp-client'
      option port '1194'
      option up '/opt/etc/openvpn/config/up.sh'
      option down '/opt/etc/openvpn/config/down.sh'
      option ca '/opt/etc/openvpn/keys/ca.crt'
      option cert '/opt/etc/openvpn/keys/my.crt'
      option key '/etc/openvpn/keys/my.key'
      option tls_auth '/opt/etc/openvpn/keys/tls.key 1'
      option tls_timeout '30'
      option hand_window '160'
      option enabled '1'


в /etc/config/network добавлен tun0 с именем openvpn.
config interface 'openvpn'
      option proto 'none'
      option ifname 'tun0'

в /etc/config/firewall я не создавал отдельную зону для openvpn (но можно и создать отдельную при желании):
config zone
      option name 'wan'
      option input 'REJECT'
      option output 'ACCEPT'
      option forward 'REJECT'
      option masq '1'
      option mtu_fix '1'
      option network 'wan wan1 wlan1 openvpn wwan'


Вот скриншоты, как это выглядит в luci :

 интерфейсы:








зоны в firewall:









openvpn клиент:








Если все правильно сконфигурировано, то при нажатии на кнопку start из luci, клиент должен запуститься и появиться инерфейс tun0 (см.рисунок выше). 

root@tpl3020:/# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 

и должны пинговаться (если разрешено на сервере,естественно) внутренние адреса:
root@tpl3020:/# ping 192.168.110.11
PING
192.168.110.11 (192.168.110.11): 56 data bytes
64 bytes from
192.168.110.11: seq=0 ttl=253 time=107.732 ms
 Из консоли клиент можно запустить 
/etc/init.d/openvpn up <имя_соединения>. У меня имя client_tun.

6. Включение/выключение openvpn нажатием на кнопку WPS.
web морда для управление это хорошо, но хочется более простого способа. На роутере есть кнопка wps, которую можно использовать для запуска/останова клиента.

Как вообще конфигурировать кнопки и лампочки, написано в
http://wiki.openwrt.org/doc/howto/hardware.button
Замечание: не забываем про установку /etc/hotplug.d/button/00-button
и
http://wiki.openwrt.org/doc/uci/system

Применительно к моему случаю, я сделал следующее:

/etc/config/system
=====
config led 'led_wps'
      option name 'WPS'
      option sysfs 'tp-link:green:wps'
      option trigger 'none'
      option default '0'

config button
      option button 'wps'
      option action 'pressed'
      option handler '/opt/etc/init.d/ovpn-trigger'
=====

/opt/etc/init.d/ovpn-trigger:
=====
#!/bin/sh
pid_file=/var/run/openvpn-client_tun.pid

if [ -f $pid_file ]
then
      logger 'openvpn client stopping'
      /opt/etc/init.d/openvpn down client_tun
      /bin/echo 0 >/sys/class/leds/tp-link\:green\:wps/brightness
else
      logger 'openvpn client starting'
      /opt/etc/init.d/openvpn up client_tun
      /bin/echo 1 >/sys/class/leds/tp-link\:green\:wps/brightness
     
      cnt=0
      while [ $cnt -lt 30 ]
      do
              sleep 1
              #echo $cnt
              cnt=`expr $cnt + 1`
              state=`cat /sys/class/leds/tp-link\:green\:wps/brightness`
              #echo $state
              if [ $state -eq 1 ]
              then
                      echo 0 >/sys/class/leds/tp-link\:green\:wps/brightness
              else
                      echo 1 >/sys/class/leds/tp-link\:green\:wps/brightness
              fi
              ifconfig tun0 >/dev/null 2>&1
              if [ $? -eq 0 ]
              then
                      echo 1 >/sys/class/leds/tp-link\:green\:wps/brightness
                      break
              fi
      done
      # tun0 did not up: shutdown openvpn
      ifconfig tun0 >/dev/null 2>&1
      if [ ! $? -eq 0 ]
      then
              echo 0 >/sys/class/leds/tp-link\:green\:wps/brightness
              /opt/etc/init.d/openvpn down client_tun
              logger 'openvpn client shutdown (could not connect)'
      fi
fi
exit 0
=====

 /etc/init.d/openvpn
=====
stop_instance() {
      local s="$1"

      section_enabled "$s" || return 1

      SERVICE_PID_FILE="/var/run/openvpn-$s.pid"
      service_stop /usr/sbin/openvpn
      rm $SERVICE_PID_FILE <- при остановке клиента pid файл не удалался по-умолчанию.
}
=====

Теперь, если нажать кнопку, когда клиент остановлен, то он будет пытаться запуститься, и при успешном запуске лампочка wps будет включена.
При нажатии на кнопку, если клиент запущен, он будет остановлен.

На этом все.
========================================================================
Использованные доп. ссылки (м.б. найдется что-то интересное)

 OpenWrt: Configure WiFi Client as WAN and set up a 2nd AP to redistribute the WAN-Access – http://goo.gl/bIVik:  https://gist.github.com/2398728

Piratebox

PirateBox creation based on TP-Link MR3020
http://www.disk91.com/2012/technology/networks/piratebox-creation-based-on-tp-link-mr3020/
http://cookingcomputersandmore.com/?page_id=10
http://piratebox.aod-rpg.de/dokuwiki/doku.php

По модему:
http://forum.ru-board.com/topic.cgi?forum=6&topic=5795&start=20
http://www.hub.ru/wiki/ZTE_MF626
http://lists.debian.org/debian-russian/2009/07/msg00100.html

По роутерам tp-link
http://klseet.com/index.php/tp-link-portable-routers