Технологией 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). Все! Остальное можно не менять :).

Скрипт протестен лично мной, поэтому при багах, глюках и прочих нехороших вещах — мыль сразу и я рассмотрю твое предложение :).

Оставить мнение

Check Also

Мошенничество по воздуху. Разбираем возможность Cryptogram Replay Attack в Apple Pay

Задача платежной системы — списать нужную сумму в пользу продавца со счета верное число ра…