GPRS - internet, секреты и решения

Технологией GPRS уже никого не удивить. Многие операторы предоставляют эту услугу даже в сравнительно небольших городах. Не брезгая маленькими скоростями, сетяне юзают GPRS даже будучи подключенными к выделенной линии (например, по технологии Ethernet).

Зачем? Все просто: в тестовом периоде компания дает право пользоваться услугой определенное время абсолютно на халяву :). Даже если доступ платный, цены за мегабайт могут быть ниже, чем за мег по быстрому езернету. Варезникам при этом ничего не остается, как лить через GPRS драгоценный софт...

Действительно, так и происходит: на ночь ставится закачка большого количества софта. К чему это я? Просто у некоторых людей начинаются трудности в совмещении двух параллельных соединений. Особенно под Windows. Спешу разрешить эту проблему в этой статье.

 

 

 

Сначала следует определиться, что человек желает сделать, подключившись к "жопорезу". Как правило, цель - слить какую-нибудь софтину с буржуйского фтп (либо поюзать честно спионеренный шелл без "свечения" статического IP-адреса). Если это так - совсем необязательно использовать общий шлюз GPRS.

Перед подключением идем в свойства сетевого соединения (вкладка "Сеть\), выбираем протокол TCP/IP, дополнительно. Снимаем галочку с "Использование общего шлюза". Теперь можно подключаться.

 

Чего мы добились? После подключения к GPRS, никакие соединения не прервутся, ибо дефолтовый шлюз останется на месте (шлюз локальной сети). В противном случае, гейт будет заменен на "жопорезный" и весь трафик стремительно потечет через него.

 

Далее необходимо прописывать маршрут к хосту, куда мы хотим обратиться через интерфейс GPRS. Это можно сделать командой route add host твой_GPRS_IP_ADDRESS. Но юзать такую длинную строку гиморно, и я решил написать Perl-скрипт, который облегчит тебе эту задачу. Учти, что для корректной работы у тебя должен быть установлен ActivePerl.

 

Итак, поехали. Вот код скрипта, который очень просто добавляет/удаляет роуты даже на hostname (Винда не переваривает хостнэймы, ее интересуют только IP :)).

 

#!/usr/bin/perl $debug=0; ## По дефолту мусор в STDERR вырублен ;)

exit unless $ARGV[0]; ## Выходим, если нет аргументов

# ADD/DEL route script for PPP interface use Socket; ## Юзаем модуль Socket.pm для резолва адресов

chomp($host = $ARGV[0]); ## Выцепляем интересующий нас хост из входных параметров

$mask = '172'; ## Первая часть IP-адреса. У каждого оператора своя. Определяется экспериментально :).

if ($host eq "-d\) { ## Если параметр оказался -d

chomp($host = $ARGV[1]); ## Значит следующий параметр (хост) необходимо удалить из таблицы маршрутов

$peer = get_host_ip($host); ## Резолвим хост

$action = "route delete $peer"; ## И формируем команду на удаление

print "$action" if $debug; ## Мусорим в консоль, если включен дебаг

system($action); ## И выполним команду

exit; ## Корректно выходим

}

$myip = get_my_ip(); ## Если маршрут следует добавить - определяем собственный IP на PPP-интерфейсе

$peer = get_host_ip($host); ## А также IP желаемого хоста

$action = "route add $peer $myip"; ## Формируем команду

print "$action" if $debug; ## Мусорим :)

system($action); ## Выполним поставленную задачу

sub get_host_ip { ## Небольшая процедурка для резолва хоста в IP-адрес

my ($ip);

my ($host) = @_; ## Объявление локальной переменной $ip и параметра процедуры $host.

$ip = gethostbyname($host); ## Резолвим хост в IP (посредством метода в Socket.pm)

$ip = inet_ntoa($ip); ## Превращаем переменную в читабельный вид

return $ip ## И возвращаем ее в главный модуль

}

sub get_my_ip { ## Процедура для определения собственного адреса на PPP-интерфейсе

my ($ip_string,$myip);

$ip_string = `ipconfig | find \\"$mask\\.\\"`; ## Выполним команду ipconfig с фильтром на часть искомого IP-адреса

(undef,$myip)=split(":",$ip_string); ## Сплитуем отфильтрованную строку по символу \":\"

substr($myip,0,1) = ''; ## Отрезаем от адреса первый символ

$myip=~s/\\r|\\n//g; ## Очищаем его от мусора

return $myip ## И возвращаем в главный модуль

}

 

В последней процедуре ты видишь сплит и обрезание :) символа. Это делается из-за того, что сырая строка выглядит следующим образом: "IP Address : xxx.xxx.xxx.xxx". После сплита второй параметр должен быть обрезан, чтобы хоть немного напоминать сетевой адресок. Что и было проделано.

 

Теперь запихивай скрипт в c:\\windows и обзывай route.pl. Все! С этого момента ты можешь юзать команду "route.pl hostname", после чего хост будет занесен в таблицу маршрутов. Все запросы на этот адрес будут проходить через GPRS-соединение, как ты и хотел. Не веришь? Пропингуй адрес и увидишь большую потерю пакетов и громадное время прохождения пакета :).

 

В Пингвине все проще. Нужно добавить в /etc/ppp/options параметр "nodefaultroute" (аналог отключения галки в свойствах PPP-соединения), а в файл /etc/ppp/ip-up.local прописать строку вида: "echo $IPREMOTE >/root/gprs".

Затем немножко модифицируй выше написанный скрипт на предмет чтения IP шлюза из файла /root/gprs.

Также не забудь подправить синтаксис команды route и убить резолв (умный пингвин умеет кушать hostnames при выполнении /sbin/route).

 

Все! Остальное можно не менять :).

Источник:http://mobilefree.ru
Hosted by uCoz