Страница 1 из 1

Полуоффтопик о пользе GPL или чем занимаются админы дома.

СообщениеДобавлено: 20 янв 2009, 22:22
Dimerson
В общем небольшая предыстория.

У нас в городе внешний трафик еще дорогой но внутригородской бесплатный. И с весны родной СибирьТелеком стал предоставлять пользователям ADSL и ETTH внешний анлимит через MS PPTP клиента (без шифрования) с ограничением полосы (на местные сети можно прописать маршруты батником напрямую на DSL минуя VPN для скорости). За 256K (не совсем честные правда плата составляет 900р (из них 150р за порт АЛСЛ суть за местный трафик)). Я подумал подумал и прикупил серва Zyxel 662HTW2 но так как с существующей на то время прошивкой он часто падал с шифрованием WPA2 , то поменял его на Dlink DSL-2640U (уже снятый к текущему моменту с производства и как следствие больше прошивок не делают). Сей девайс сделан на 32BIT MIPS от Broadcom. 16 MB ram, 4 MB flash.
Внутри него Linux + BysyBox. Как назло с нового года пров поменял желзо - у него стояла на обслуживании VPN пользователей какая-то железка от CISCO но они воткнули что-то мощное от JUNIPER. И VPN стал отпадать - причем отпадет и через 1 секунду поднимется. И так как VPN клиент стоит тут же на компе = жить стало невесело = все закачки рвутся по фатальной ошибке. Игры со снижением MTU до 1000 байт никак не помогли. Саппорт помочь не в состоянии.

Предыстория кончилась. Я думал думал .... и так как для моего девайса есть GPL Source codes решил прикрутить PPTP клиент к нему.
Файл прошивки RU_DSL-2640U_3-06-04-3C_GPL.tar.gz содержит в семе собственно сырцы и кросскомпилер под Linux i386 + UCLIBC в виде 2 RPM.

У меня дома в VirtualPC стоит Debian Linux (много лет его испоьзую с версии 1.2 еще). Оба RPM были дебианизированы с помощью alien в пакаджи Debian (.deb) и установлены в /opt.

Собрал прошивку без изменений с помощью команды make PROFILE=RU_DSL-2640U. Залил - все работает - разницы не заметил.

Замечу что задача была собрать PPTP клиента без особого ковыряния в исходниках.

Далее стал изучать сырцы пристально. Обнаружил что в файле параметров сборки есть опция закомментированная опция ASUS_PPTP_CLIENT. Раскомментил. Попутно добавил в BusyBox ряд комманд которые отсутствовали:
lsmod,uname,rmdir,netstat,cut,tr,vi,killall,ls (!!!),cp,mv,tail,sed,grep,more
для более комфортной работы в данном окружении. В make файле было видно что при ASUS_PPTP_CLIENT=y собирается pptp из каталога
pptp-client и отдельный pppd из подкаталога ppp/pppd_pptp под именем pppd_pptp (pppd просто он сильно патченный и заточенный для работы с ppoe ppoa итд - не нужны обычные конфиги а берет все параметры с командной строки). Тк было лень ковырять сырцы сделал make и натравил на бинарник pppd_pptp strings | grep /ppp/ стало
ясно что в /tmp/ppp он ищет и /peers и ip-up,ip-down и options. Следует заметить что / монтируется r/0 и только /proc и /var по r/w.

Был поправлен скрипт создания файловой системы buildFS :
добавлены строки mkdir $ROOTFS/var/ppp и ln -s /var/ppp $ROOTFS/tmp/ppp. То есть на r/o файловой системе будет симлинк /tmp/ppp на доступный по записи /var/ppp.

Последняя пересборка и заливка в мопед. Далее телнетом заливаем файлы с помощью copy/paste (shell там еще тот = ash весьма ограниченный в возможностях но его хватило).

echo "MYLOGIN PPTP MYSECRET * " /var/ppp/chap-secrets
echo "MYLOGIN PPTP MYSECRET " > /var/ppp/pap-secrets

mkdir /var/ppp/peers

echo "pty \"pptp 217.18.130.131 --nolaunchpppd\"" > /var/ppp/peers/vpnuser
echo "name PPPSERVERIP" >> /var/ppp/peers/vpnuser
echo "remotename PPTP" >> /var/ppp/peers/vpnuser
echo "ipparam vpnuser" >> /var/ppp/peers/vpnuser
echo "persist" >> /var/ppp/peers/vpnuser
echo "mtu 1400" >> /var/ppp/peers/vpnuser
echo "lock" >> /var/ppp/peers/vpnuser
echo "noauth" >> /var/ppp/peers/vpnuser
echo "nobsdcomp" >> /var/ppp/peers/vpnuser
echo "nodeflate" >> /var/ppp/peers/vpnuser
echo "refuse-eap" >>/var/ppp/peers/vpnuser
echo "lcp-echo-interval 30" >>/var/ppp/peers/vpnuser
echo "crtscts" >> /var/ppp/peers/vpnuser
echo "asyncmap 0" >> /var/ppp/peers/vpnuser
echo "lcp-echo-failure 4" >>/var/ppp/peers/vpnuser
echo "proxyarp" >>/var/ppp/peers/vpnuser

кое какие опции избыточные но это не суть важно.

echo "#!/bin/sh" > /var/ppp/ip-up
echo "gw=\`route -n \| grep \'\^0.0.0.0\' \| tr -s \' \' \| cut -d\' \' -f 2 \`" >> /var/ppp/ip-up
echo "echo \"route add default gw \$gw\" > /var/ppp/\$1.oldroute" >> /var/ppp/ip-up
echo "route add -host \$5 gw \$gw" >> /var/ppp/ip-up
echo "route del default" >> /var/ppp/ip-up
echo "route add default dev \$1" >> /var/ppp/ip-up
echo "iptables -t nat -A POSTROUTING -o \$1 -s 192.168.1.0/255.255.255.0 -j MASQUERADE" >> /var/ppp/ip-up
echo "iptables -A INPUT -s 0.0.0.0/0.0.0.0 -i \$1 -m state --state ESTABLISHED,RELATED -j ACCEPT" >> /var/ppp/ip-up
echo "iptables -A INPUT -s 0.0.0.0/0.0.0.0 -i \$1 -j DROP" >> /var/ppp/ip-up
echo "route add -net 62.68.128.0 netmask 255.255.224.0 gw \$gw" >> /var/ppp/ip-up
(КУЧА МАШРУТОВ К МЕСТНЫМ СЕТКАМ СКИПНУТА)
echo "route add -net 217.106.147.0 netmask 255.255.255.240 gw \$gw" >> /var/ppp/ip-up
chmod +rx /var/ppp/ip-up

echo "#!/bin/sh" > /var/ppp/ip-down
echo "route del default dev \$1" >> /var/ppp/ip-down
echo "eval \`cat /var/ppp/\$1.oldroute\`" >> /var/ppp/ip-down
echo "route del -host \$5" >> /var/ppp/ip-down
echo "rm /var/ppp/\$1.oldroute" >> /var/ppp/ip-down
echo "iptables -t nat -D POSTROUTING -o \$1 -s 192.168.1.0/255.255.255.0 -j MASQUERADE" >> /var/ppp/ip-down
echo "iptables -D INPUT -s 0.0.0.0/0.0.0.0 -i \$1 -m state --state ESTABLISHED,RELATED -j ACCEPT" >> /var/ppp/ip-down
echo "iptables -D INPUT -s 0.0.0.0/0.0.0.0 -i \$1 -j DROP" >> /var/ppp/ip-down
chmod +rx /var/ppp/ip-down

ip-up в кратце :
сохраняет старый дефолт в ppp0.oldroute
прописывает маршрут на хост PPTP сервера мимо туннеля Через ppoe.
дописывает правило в таблицу nat для маскарадинга через ppp0 (в добавок к маскарадингу с ppoe)
ну и как обычно - всех выпускать в ppp0 а выпускать только ответы и связанный трафик.

ip-down возвращает все назад (маршруты остаются они не мешают и второй раз не пропишутся).

Зачем такой изврат ? Не хочется курочить прошивку. То есть по включению работает функционал на 100% тот что из коробки:
то есть busybox запускается как init , создает каталоги в /var и подгрузив модули ядра пускает проприетарный бинарник cfm
(суть вебморда которая прочитав конфиг пускает разные сервисы : wifi, ppoe итд итп ). Причем шеллом по ssh и telnet он же но слава богу дает выполнить sh :)

то есть по включению:
telnet dlink admin
sh
копи-пейст файлег
и pppd_pptp call vpnuser

Все.

Оно работает. При серфинге дисконнектов вообще не ощущаю.
Сейчас вот пишу через этот pptp на dlinke.

Делал по ночам в течении недели после купания ребенка.