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